Le port serie SCI en ASM - Mcu/Cpu (hardware et périphériques) > 8 bits - Articles et téléchargements
Le port serie SCI en ASM - Mcu/Cpu (hardware et périphériques) > 8 bits - Articles et téléchargements
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
proposer
 
   
             
 
Catégories
 
   
             
 
Recherche
 
   
 

Le port serie SCI en ASM

Publié par david le 04/10/2005 (3996 lectures)
Ce péripherique, optionnel sur certaines versions de 68HC08, permet de dialoguer avec un PC via une liaison série ou même par une liaison spécialisée déportée par modem.
Il existe sur le net des softs qui permettent d'émuler un port série SCI pour ceux qui n'en possèdent pas. Bien entendu, tous les registres ne sont pas émulés mais le principe reste le même.

Ce port série ne contient que les broches Txd et Rxd, le port série n'est donc pas complet mais suffisant pour fonctionner.
Il faut noter que les broches Txd et Rxd sont inversées sur un connecteur DB9 par rapport à un connecteur DB25 (la description des broches est disponible ici ).
On peut simuler toutes les autres broches.

Le débit des données dépend directement de la fréquence d'horloge du bus du micro. Il faut ensuite déterminer le protocole de dialogue, c'est à dire sur 7 bits, 8 bits ou 9 bits et avec ou sans parité (paire, impaire ou aucune).
Tout ce que vous configurez doit être identique à la configuration de la machine distante (PC, terminal ou autre 68HC08).

Je rappelle pour information que les broches associées au port série ne sont plus affectées en port d'entrée/sortie.

La gestion des erreurs dûes aux bruits est automatiquement géré par le micro ; de même, les erreurs de données suite à un défaut d'horloge (le micro n'est plus capable de vérifier vos données si l'horloge et le bruit sont incorrects, il se contente donc de vous donner plus de fiabilité dans votre transmission).

On va commencer par les registres de configuration, ceux ci peuvent être initialisés n'importe où et n'importe quand dans votre programme. Par défaut, on utilise 8 bits de donnée, pas de parité, 1 bit de stop et pas de contrôle de flux.

Le registre SCC1 configure le port :

  • bit7 : il permet de re-émettre la donnée reçue, elle est plus souvent appelée écho (très utilisé en mode terminal pour informer l'utilisateur de la touche sur laquel on a appuyé),
  • bit6 : permet d'activer ou non le port série SCI ,
  • bit5 : permet d'inverser le signal TX (pour un convertisseur FTDI par exemple),
  • bit4 : indique la longueur des caractères sur laquelle on veut travailler,
  • bit3 : réveil de la SCI,
  • bit2 : indique si l'on synchronise au début ou à la fin de la trame,
  • bit1 : active la fonction de parité,
  • bit0 : indique le type de parité à activer.

Un tableau indique la longueur totale de la trame suivant la configuration que l'on a choisi.

Le registre SCC2 gère le port via les interruptions et les flags :
  • bit7 : autorise les interruptions pour l'émission de données,
  • bit6 : indique la fin d'une transmission correcte par une interruption,
  • bit5 : autorise les interruptions quand une donnée arrive,
  • bit4 : indique qu'une réception est en cours par une interruption,
  • bit3 : active l'émission,
  • bit2 : active la réception,
  • bit1 : permet de mettre en veille le récepteur,
  • bit0 : permet d'envoyer un BREAK à la fin de la transmission, ce BREAK permet d'indiquer que la transmission de donnée est finie (par exemple vous envoyez un flux de donnée, le BREAK ne se provoque qu'une seconde à la fin de cette transmission).


Le registre SCC3 :
  • bit7 : il contient le 9eme bit reçu lorsqu'on choisis de recevoir sur 9 bit ou le 8ème bit s'il y a une parité,
  • bit6 : il contient le 9eme bit émis lorsqu'on choisis d'émettre sur 9 bit ou le 8eme bit s'il y a une parité,
  • bit3 : indique par interruption qu'il y a eu une erreur de réception,
  • bit2 : indique par interruption qu'il y a du bruit sur la ligne,
  • bit1 : indique par interruption qu'il y a une erreur dans la trame de l'horloge,
  • bit0 : indique par interruption qu'il y a une erreur de parité.

Le registre SCS1 :
  • bit7 : indique que le registre d'émission est transfère vers le port SCI,
  • bit6 : indique que la transmission est effectué,
  • bit5 : indique que la donnée reçu est prête dans le registre SCDR,
  • bit4 : indique qu'un réception est en cours de traitement,
  • bit3 : indique que la réception ne correspond pas à celle que l'on attend (erreur sur la parité ou sur le nombre de bits),
  • bit2 : indique qu'il y a du bruit sur la ligne,
  • bit1 : indique qu'il y a une erreur dans la trame de l'horloge,
  • bit0 : indique qu'il y a une erreur de parité.

Le registre SCS2 :
  • bit1 : indique la réception d'un BREAK (voir bit0 de SCC2),
  • bit0 : indique une réception en cours.

Le registres SCDR permet de configurer le débit en baud
  • bit5 et bit4 : permet de choisir le prédiviseur par 1, 3, 4, ou 13,
  • bit2 à bit0 : permet de configurer le débit suivant l'horloge du bus.
Pour vous aider à configurer votre débit en baud, utilisez le logiciel sous EXCEL ici.

Il existe toujours un tableau permettant de choisir le débit en fin du datasheet du chapitre SCI.

Les données reçus et émises sont dans le registres SCDR. A noter qu'il est possible d'émettre une donnée sans effacer celle reçue et inversement, les données reçues ne peuvent être ré-écrites que par des données reçues, idem pour les données transmises.
Il est possible de changer à tout moment le débit ou la parité de votre transmission pour par exemple envoyer un caractère d'identification en "mode protégé", contre par exemple des espions de ligne RS232.

Voici un exemple de configuration sans interruption, il permet d'afficher un mini menu avec hyperterminal et d'y répondre via les touches du PC :

CR EQU $A
LF EQU $D
FF EQU $C
TOUCHE_1 EQU $31
TOUCHE_2 EQU $32

org RomStart

MESSAGE db '**************************************************',CR,LF
db '************** Menu de Test **********************',CR,LF
db '**************************************************',CR,LF
db 'Entrez votre choix',CR,LF
db '1 - Test n 1',CR,LF
db '2 - Test n 2',CR,LF,0
MESS_MENU1 db 'vous etes dans le menu n 1 - le test est termine',CR,LF,0
MESS_MENU2 db 'vous etes dans le menu n°2 - le test est termine',CR,LF,0
MESS_ERREUR db 'La touche appuye [] n est pas valide',CR,LF,0

sci_init:
mov #%00100000,SCBR ; Bitrate=19200bd
mov #%01000000,SCC1 ; Normal, pas de loop, SCI active
mov #%00001100,SCC2 ; pas d'interruption, Tx actif, Rx actif
mov #$00,SCC3 ; pas d'erreurs sur interruption

lda #FF
jsr send_char ; nouvelle page vierge sur hyperterminal
Debut:
jsr TEMa2_1s
jsr MENU

R_Test:
sta COPCTL
brclr 0,SCS2,R_Test
brclr 5,SCS1,R_Test
lda SCDR
jsr send_char
lda #CR
jsr send_char
lda #LF
jsr send_char
lda SCDR
cmp #TOUCHE_1
beq MENU_1
lda SCDR
cmp #TOUCHE_2
beq MENU_2
bne MENU_ERREUR


MENU:
ldx #$00
MENU_SUITE:
lda MESSAGE,X
beq R_Test
incx
bsr send_char
bra MENU_SUITE

MENU_1:
ldx #$00
MENU_1_SUITE:
lda MESS_MENU1,X
beq Debut
incx
bsr send_char
bra MENU_1_SUITE

MENU_2:
ldx #$00
MENU_2_SUITE:
lda MESS_MENU2,X
beq Debut
incx
bsr send_char
bra MENU_2_SUITE

MENU_ERREUR:
ldx #$00
MENU_ERREUR_SUITE:
lda MESS_ERREUR,X
cmp #$5D ; on compare par rapport à la lettre ]
beq ENV_VALEUR
MENU_ERREUR_S2:
lda MESS_ERREUR,X
beq Debut
incx
bsr send_char
bra MENU_ERREUR_SUITE

ENV_VALEUR:
lda SCDR
jsr send_char
bra MENU_ERREUR_S2

;- SEND_CHAR --------------------------------------------------------------------------------
send_char:
brclr 6,SCS1,*
sta SCDR
sta COPCTL
rts
;- SEND_CHAR --------------------------------------------------------------------------------

;- TEMPORISATION DE 1 S ------------------------------------------------------------------
TEMa2_1s:
psha
lda #!10 ; 10 x 100ms = 1s
TEMa2_1s_1:
jsr TEMa2_100ms
deca
bne TEMa2_1s_1 ; quand c'est on sort sinon on continue
pula
rts
;- FIN TEMPORISATION DE 1 S --------------------------------------------------------------

;- TEMPORISATION DE 100MS ----------------------------------------------------------------
TEMa2_100ms:
pshx ; on met de coté X
pshh ; on met de coté H
clrx
clrh ; effacement de X et H
TEMa2_100ms_1
sta COPCTL ; effacement du chien de garde
aix #$1 ; incremente X
cphx #!11169 ; compare X à 11169 decimal
bne TEMa2_100ms_1 ; si la comparaison n'est pas bonne, on revient à TEMa2_100ms_1
pulh ; on restaure H
pulx ; on restaure X
rts ; on sort du sous programme
;- FIN TEMPORISATION DE 100MS ------------------------------------------------------------

**************************************************************
* Vectors - Timer Interrupt Service Routine. *
* after a RESET. *
**************************************************************
org $FFFE
dw Start ; Reset Vector


L'essentiel de la configuration à retenir est que l'on doit configurer la SCI comme ceci :

mov #%00100000,SCBR ; Bitrate=19200bd
mov #%01000000,SCC1 ; Normal, pas de loop, SCI active
mov #%00001100,SCC2 ; pas d'interruption, Tx actif, Rx actif
mov #$00,SCC3 ; pas d'erreurs sur interruption



Il faut aussi vérifier que la dernière transmission est bien émise avant d'en écrire une nouvelle dans le registre SCDR :

send_char:
brclr 6,SCS1,*
sta SCDR



Et donc aussi verifier que la donnée reçu est bien prête et correcte :

R_Test:
brclr 0,SCS2,R_Test
brclr 5,SCS1,R_Test
lda SCDR


Attention aussi aux accents, ils peuvent provoquer des caractères illégaux vus qu'ils ne sont pas répertoriés en tant que caractères ASCII.



Article précédent Article suivant
Article précédent Convertisseur Analogique Numerique (ADC) en ASM Le PIT (Programmable Interrupt Timer) Article suivant
Les commentaires appartiennent à leurs auteurs. Nous ne sommes pas responsables de leur contenu.
Auteur Commentaire en débat
Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Le port serie SCI en ASM - Mcu/Cpu (hardware et périphériques) > 8 bits - Articles et téléchargements