23 les timers
Transcription
23 les timers
Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------- LES TIMERS Le 8051 possède deux timers T0 et T1 de 16 bits dont le fonctionnement est déterminé par deux octets TMOD et TCON .Les signaux d'entrée de ces circuits proviennent soit de l'horloge générale du CPU divisée par 12 (1 Mhz pour un quartz à 12 Mhz, valeur standard), soit de ce qui est injecté sur les bornes T1 PIN ou T0 PIN .Le signal de fin de comptage (dépassement du compteur qui passe de 111...111 à 000..000 = débordement ) est la mise à 1 du bit TFx que l'on peut tester par soft mais qui est aussi un signal d'interruption., il n'y a pas de signal de sortie physique.(Comme c'est le cas par exemple pour le circuit timer 8253 bien connu ).Plusieurs modes de fonctionnement sont possibles en fonction timer ou compteur ,le choix entre ces 2 fonctions est déterminé par les bits 6 et 2 ( C/T) de l'octet TMOD . .Le système fonctionne en mode timer lorsque l'horloge de commande est celle du microprocesseur. Dans ce cas le compteur interne avance d'un cran à chaque cycle machine c'est à dire au douzième de la fréquence du quartz. Le système fonctionne en mode compteur si le signal d'horloge est injecté de l'extérieur sur la borne Tx (x=0 ou 1). Dans ce cas l’événement actif est la transition 1-0 sur cette entrée Tx .Cette transition étant détectée par l'examen de Tx au début de deux cycles successifs ,la fréquence maximale du signal admissible sur Tx est le 24eme de celle du quartz. Le rapport cyclique peut être quelconque sous réserve que chaque niveau dure au moins 12 périodes du quartz. La figure suivante précise le rôle de chaque bit du mot de contrôle (est en 89 dans le SFR). Contenu du registre TCON (Adressable par bit) (88H) TCON.7=TF1 Bit de dépassement du timer ,1 Remis à zéro lorsque l'interruption associée est exécutée TCON.6=TR1 Bit d'autorisation de fonctionnement du timer 1, Permet de mettre ce timer ON ou OFF TCON.5=TF0 Bit de dépassement du timer 0 TCON.4=TR0 Contrôle ON/OFF du timer 0 TCON.3=IE1 Bit d'interruption associé à l'entrée INT1 (Mis à 1 lorsque le signal d’activation est détecté sur l'entrée INT1. Remis à zéro par déclenchement de l'interruption TCON.2=IT1 Type de signal accepté à l'entrée d'interruption 1 Niveau 1=Transition 1-0 Niveau 0 =Niveau bas TCON.1=IE0 Bit d'interruption associé à INT0 TCON.0=IT0 Type de signal associé à INT0 (1=transition Contenu du registre TMOD (Non adressable bit par bit) (89H) TMOD.7 Gate Timer 1 L'un des modes de déclenchement du timer 1 (Voir plus loin) TMOD.6 C/T Mode Compteur(1) ou Timer (0) du timer 1 TMOD.5-4 M1 M0 D‚finit le mode de fonctionnement 0 0 TLx est utilisé comme pré-diviseur 0 1 THx et TLx sont cascadès pour constituer un compteur 16 bits 1 0 8 bits avec auto rechargement 1 1 Compteur 8 bits modes différents sur 1 et 0 (Texte) TMOD.3 Gate timer 0 TMOD.2 C/T timer 0 TMOD.1-0 Mode M1 M0 du timer 0 23 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------Oscillateur Le fonctionnement de chaque timer est mieux 12 décrit par les figures suivantes. Control Le bit C/T permet de choisir entre les INT C/T=0 TL1 TH1 TF1 modes timer ou compteur. 5 bits8 bits C/T=1 Le signal d'horloge Osc/12 (fréquence T1 pin du quartz divisée par 12 ) ou Tx est transmis au TR1 compteur interne 13 bits si TRx=1 ET(Gatex=0 INT1 pin ou INTx=1) Timer en mode 0 La durée est déterminée par le contenu Gate de TLx et THx Dans ce mode 0 (qui existe pour des raisons de compatibilité avec le 8048) 13 bits seulement sont pris en compte, les 3 bits de plus fort poids de TLx sont ignorès. A chaque top d'horloge le contenu de TLx-THx est incrémenté. Au moment du dépassement de capacité c'est à dire la transition 11111 ⇒ 0000 le bit d’interruption TFx est mis à 1 (Il sera remis à 0 à l'exécution de l'interruption). Le MODE 1 est équivalent mais les 16 bits de TLx-THx sont utilisés. Exemple Ce programme affiche sur des DELs reliées au port 1 les nombres successifs Le retard entre deux affichages est obtenu par le Timer 0 programmé en mode 1 (Compteur de 16 bits).Le registre R0 est utilisé comme compteur. Le sous programme associé au Timer 0 est localisé à partir de 000B .Nous commençons donc par un saut au delà de cette position ,par exemple en 0100 où débute le programme principal: 0000 02 01 00 LJMP 0100H Ce programme principal commence par un positionnement des interruptions et du timer: Le Timer 0 en mode Timer soit C/T=0 il est commandé par le bit TR0 L'autre voie de déclenchement est neutralisée en mettant GATE0 à 0 Soit le mot de commande TMOD=XXXX0001=01H Pour régler la durée du retard il faut précharger TL0 et TH0 à leur valeur de départ, par exemple 0FFFFH pour un retard maximal. Le lancement se fait en mettant à 1 TRO soit SETB TR0 , le compteur tourne alors sans interruption tant que l'on n'a pas ramené TR0 à 0 . La durée des retards suivants serait toujours la même si un rechargement de TH0 TL0 n'était pas prévu à chaque tour. Pour ne valider que l'interruption associée au timer 0 soit TF0, le mot dans IE est 1xx00010 (le 1 en position 2 étant associé à TFO ,le premier est la validation générale.) En dehors de ces positionnements le programme principal se réduit à une boucle sans fin .Soit: 0100 0102 0105 0108 010B 010E 0110 78 00 MOV R0,#0 ;Initialisation de R0 75 89 01 MOV TMOD,#1 ;Mode Timer 0 75 8A 00 MOV TH0,#255 ;Durée Timer 75 8C 00 MOV TLO,#255 75 A8 82 MOV IE,#82H ; Interruptions D2 8C SETB TR0 ;Lancement Timer 80 FE ATTENT:SJMP ATTENT Boucle sur place Peut s’écrire SJMP $ Dans le sous programme d'interruption on trouve; - L'affichage sur P1 du contenu de R0 - L'incrémentation de R0 - Le rechargement de TH0 TL0 définissant la durée du retard L’instruction de retour RETI Soit: 000B 000D 88 90 08 MOV P1,R0 INC R0 24 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------000E 0011 0014 75 8C FF 75 8A FF 32 MOV TH0,#255 MOV TL0,#255 RETI Rechargement de TH0 et TL0 On aurait pu partir de TH0-TL0=0000 car 0000-1=FFFF ,le retard aurait été un peu plus long et le rechargement de TH0 et TL0 inutile .Nous n’avons pas retenu cette solution car le programme ci dessus est plus général. Le rechargement de TH0 TLO à chaque lancement n'est plus nécessaire en mode 2 Dans ce cas en effet THx est préchargé et transféré dans TLx à la fin de chaque cycle. Malheureusement le retard n'est plus défini que sur 8 bits ( Fig. suivante ) Un fonctionnement de ce type sur 16 bits existe avec le 8052. Oscillateur 12 C/T=0 C/T=1 Control TL1 INT TF1 8 bits T1 pin Reload TR1 INT1 pin Timer en mode 2 TH1 Gate En mode 3 le Timer 0 fonctionne comme deux Timers 8 bits dont les durées sont déterminées par TH0 et TL0 et qui pilotent les interruptions TF0 et TF1. La deuxième section associée à TH0 et TF1 ne peut être contrôlée que par TR1 (Figure ci dessous ). Oscillateur 12 C/T=0 C/T=1 Control TL0 8 bits TF0 INT T0 pin Mode 3 TR1 INT0 pin INT Gate Control F/12 TH0 TF1 TR1 --------------------------------------------------------------------------------------------------------------Exemple :Utilisation des Timers et des Interruptions : Vous avez dans la main un stylet avec lequel vous frappez une plaque métallique, le but est de mesurer quel est l’intervalle minimal possible entre deux frappes. Le système comprend une plaque conductrice portée à 5V et un stylet relié à la masse. La plaque est reliée à l’entrée d’interruptions INT0 d’un 8031 , le contact su stylet provoque une interruption D’autre part un timer a été lancé en mode timer et tourne en tâche de fond. Au premier pointé le compteur est mis à 0, au second la valeur atteinte par le compteur interne est affichée sur le port P1.Un intervalle d’au moins une seconde doit être respecté avant d’effectuer deux nouveaux pointages . Plusieurs difficultés apparaissent : La même interruption INT0 doit déclencher deux processus différents suivant que le pointé détecté est le premier ou le second. Pour obtenir ce résultat nous ferons intervenir une variable appelée ETAT qui sera analysée au début du programme d’interruption puis inversée . Elle vaudra par exemple 0 pour le premier pointé et 1 lorsque la seconde interruption se produira. 25 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------Le contact de la pointe avec la plaque produit inévitablement des rebonds de contact , pour les éviter nous utilisons la technique développée dans un exemple du chapitre précédent. Le fil P3.2 est lu par la routine d’interruption et l’instruction de sortie RETI n’est exécutée que si ce fil est trouvé au niveau haut 5 fois de suite à 2mS d’intervalle. Pour effectuer la mesure de temps nous utiliserons l’un des Timers du 8031 en mode 1 , malheureusement avec une horloge à 11,0592Mhz il recycle au bout d’au maximum 65536*12/11,0592=71mS inférieure à la durée maximale que l’on souhaite mesurer qui peut largement dépasser 100mS . Une précision de mesure de 1mS est suffisante. Nous effectuerons donc une opération en 2 temps . ; le timer 0 sera réglé pour recycler toutes les millisecondes, à chaque fin de cycle une interruption est générée qui fait avancer d’un cran le contenu d’un registre COMPTEUR initialisé au départ. Le temps mesuré peut ainsi ,sur un afficheur 8 bits , atteindre (en binaire ) 256 mS . Le schéma du montage est le suivant : 8 LEDS La plaque portée au potentiel haut est connectée sur le fil 2 du Port P3 ( INT0 ) ,le stylet relié à la masse fait chuter le potentiel de la plaque à chaque pointé. Après le second pointé le résultat est affiché en binaire sur les 8 leds placées sur P1 P1 +5V 8031 +ROM Stylet Il nous faut gérer 2 programmes d’interruptions, P3.2 - le programme associé à l’entrée INT0 qui pilote Plaque l’afficheur , gère la variable ETAT et les délais , d’antirebond et d’attente entre deux mesures successives de 1 seconde. - Le programme associé à l’interruption Timer, qui surviendra toutes les mS Le compteur doit tourner pendant le delai d’attente introduit pour éviter les rebonds de contacts, l’interruption Timer doit donc pouvoir intervenir pendant l’interruption extérieure qui gère ces retards. Ceci nous conduit donc à définir des priorités, priorité haute pour l’interruption Timer, priorité basse pour INT0. L’interruption extérieure ne peut pas être prise en compte pendant l’exécution de l’interruption Timer mais cette dernière dure très peu de temps. . Le programme complet peut alors être conforme à l’organigramme suivant : Initialisation interruption Tf0 priorité haute TP0=1 interruption INT0 priorité basse PX0=0 Autorisation Tf0 et INT0 EX0=ET0=1 Déclenchement de INT0 par un niveau IT0=0 COMPTEUR=0 ETAT=0 Chargement de Tl0 et Th0 pour 1 mS Autorisation générale des interruptions EA=1 Lancement TIMER 0 TR0=1 Boucle d’attente Interruption TIMER INT0 TEST D’état ETAT=0 ETAT=1 COMPTEUR >P1 COMPTEUR=0 DELAI 1 sec ETAT=1 IE0=0 Antirebond Priorité 0 RETI TR0=0 Stop TIMER 0 Chargement Tl0 Th0 COMPTEUR=COMPTEUR+1 TR0=1 relance TIMER 0 RETI Priorité 1 26 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------- Pour un quartz de 11.0592 Mhz le timer T0 avance d’un pas en 1µS*12/11.0592= 1,085µS Une milliseconde correspond à 921.6 pas .Le timer recyclant à 65536 on doit pour obtenir une durée de 1mS charger dans TH0-TL0 65536-921=64615 soit FC67H Soit en assembleur : ;ITV7 ;intervallemétre utilisant timer interne et INT0 COMPTEUR EQU 127 KT EQU 126 ETAT BIT 0 D1 EQU 0FCH D2 EQU 67H ; ORG 0 LJMP 50H ;-----------------ORG 3 SJMP 20H ;saut pour suite routine INT0 ;-----------------ORG 0BH ;interruption Timer CLR TR0 ;arret timer MOV TH0,#D1 MOV TL0,#D2 ;chargement pour durée 1mS INC COMPTEUR ;avance compteur SETB TR0 ;relance timer RETI ;-----------------ORG 20H ;suite routine INT0 JB ETAT,UN ;test de l'ETAT ZERO:MOV COMPTEUR,#0 ;pour 1er pointé ETAT=0 RAZ COMPTEUR MOV P1,COMPTEUR SETB ETAT ;ETAT basculé pour second pointé ; DBT:MOV KT,#5 ;Boucle antirebond, sortie de la routine TST1:JNB P3.2,DBT ;si P3.2 est testé à 1 5 fois de suite DEC KT ;à 2mS d'intervalle. LCALL DELAY2MS ;pour retard 2mS MOV A,KT JNZ TST1 SJMP FINX0 ; UN:MOV P1,COMPTEUR ;au 2eme pointé COMPTEUR affiché CLR ETAT ;ETAT remis à O pour nouvelle mesure LCALL DELAY1S ;une seconde entre 2 mesures (*) FINX0:CLR IE0 ;INTO étant sensible au niveau IE0 doit être RETI ;remis à 0 par le soft ;----------------ORG 50H ;Début du programme d'initialisation MOV P1,#0 SETB PT0 ;interruption Timer priorité 1 CLR PX0 ;interruption extérieure priorité 0 SETB EX0 ;autorisation interruption extérieure SETB ET0 ;autorisation int Timer 0 CLR IT0 ;INTO sensible au niveau MOV TMOD,#01H ;timer 0 en mode 1 MOV COMPTEUR,#0 ;RAZ compteur CLR ETAT ;ETAT=0 au départ MOV TH0,#D1 MOV TL0,#D2 ;préchargement timer pour 1 mS SETB TR0 ;lancement Timer 0 SETB EA ;autorisation interruptions ; SJMP $ ;boucle principale 27 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------; DELAY2MS: MOV R7,#20 ;pour 2mS DLYC:MOV R6,#44 DJNZ R6,$ DJNZ R7,DLYC RET ; DELAY1S:MOV R7,#10 ;pour retard 1 sec DL1S:MOV R6,#19 DL2S:MOV R5,#0 DJNZ R5,$ DJNZ R6,DL2S DJNZ R7,DL1S RET ;-----------------------------------------------END. er (*) Note :Au deuxiéme pointé il est inutile de gérer comme au 1 les rebonds de contacts , le retard de 1sec suffit . 28 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------- LES ENTREE SORTIES SERIE Le microprocesseur 8051 peut gérer une liaison série avec son environnement grâce à 2 bornes RXD et TXD prélevées sur le port P3. RXD Signal de réception de l'UART interne ⇒ P3.0 TXD Signal d'émission P3.1⇒ La liaison série peut fonctionner suivant 4 modes : Le mode choisi est déterminé en programmant convenablement le registre interne SCON (Serial port CONtrol register) ou plus précisément les trois bits de plus fort poids de ce registre désignés par : SCON.7 = SM0 SCON.6 = SM1 SCON.5 = SM2 MODE 0 SMO SM1 = 00 Les données entrent et sortent par RXD telles quelles c'est à dire sous forme d'octets série ( Bits de poids faible en tête ) .La fréquence d’émission est égale au douzième de la fréquence d’horloge. Cette horloge est présente sur TXD . Ce mode s’apparente à un mode synchrone, il n’y a ni start bit ni bit de stop. MODE 1 SM0 SM1 =01 Il y a cette fois 1 bit de start (0) 8 bits de données 1 bit de stop (1).La fréquence de transfert est variable ,elle est fixée par le timer 1 Les données sont émises sur TYXD et reçues sur RXD C’est un mode UART classique. MODE 2 SM0.SM1=10 11 bits sont transmis : 1 bit de start 8 de données ,un neuvième bit qui peut être un bit de parité et 1 bit de stop. Le bit de parité est à l’émission le contenu de SCON.3 (TB8) géré par l’utilisateur, à la réception il vient se loger en SCON.2 (RB8). La vitesse de transmission (baud rate) est déterminée par l'état du bit 7 du registre PCON (SMOD). Si SMOD=0 elle vaut Fosc/64 sinon Fosc/32. MODE 3 SM0.SM1=11 Il est identique au mode 2 mais la vitesse est réglable de la même façon que pour le mode 1. Dans tous les cas le registre SBUF est utilisé pour le transit des données .Une écriture dans SBUF provoque un envoi de données sur la ligne et à la réception l'octet reçu est logé dans ce même registre qui doit être lu par le CPU. La réception débute sur le premier Start bit détecté si REN=1 . UTILISATION DU MODE 1 Dans ce mode 8 bits utiles sont transmis (LSB en tête) entre un startbit et un stop bit., le transfert est contrôlé par le registre SCON (Serial Contrôle ) et la vitesse de transfert (Baud rate ) définie par le timer 1 (ou le timer 2 du 8032 voir plus loin ) . Intervient également le bit SMOD du registre PCON . Ce bit est mis naturellement au 0 lors du reset . On notera que le registre PCON d’adresse 87H n’est pas adressable par bits ,l’instruction SETB SMOD n’est donc pas valable ,on utilisera par exemple MOV PCON,#80H Le timer 1 est utilisé en mode 2 (Reload) de façon qu’il ne soit pas nécessaire de le recharger à chaque utilisation., ceci est obtenu en plaçant dans la partie haute de TMOD les 4 bits 0010. Par exemple : mov TMOD,#20H La vitesse de transfert est alors donnée par la formule Débit = FOsc 2SMOD 32 12.(256− TH 1) 29 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------qui conduit au tableau suivant: Débit (Bauds) Fosc SMOD Mode 0 max 1mHz Mode 2 max 375kHz Modes 1 et 3 62500 19200 9600 4800 2400 1200 137500 110000 110000 12Mhz 12 X 1 Timer 1 C/T Mode X X X X 11,0592 11,0592 11,0592 11,0592 11,0592 11,0592 11,986 6 12 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 TH1 X X FF FD FD FA F4 E8 1D 72 FEEB 2 2 2 2 2 2 2 2 1 Le contenu du SCON est détaillé ci dessous on notera le rôle essentiel joué par les bits TI et RI qui contrôlent les transferts. MSB SM0 7 SM1 6 SM2 5 REN 4 TB8 3 RB8 2 TI 1 LSB RI 0 SM0 SM1 Mode 0 0 0 0 1 1 1 0 2 1 1 3 SM2 REN TB8 RB8 TI RI Permet une communication multi processeurs voir doc Autorisation de la réception série . Mis à 1 par soft pour autoriser la transmission à 0 pour l'interdire C'est le 9eme bit transmis en mode 2 et 3 Doit être mis à 0 ou 1 au choix. C'est le 9eme bit reçu en mode 2 ou 3 En mode 1 si SM2=0 c'est le stop bit reçu , non utilisé en mode 0 C'est le flag d'interruption de transmission . Il est mis à 1 lorsque le 8eme bit à été envoyé en mode 0 et au début du stop bit pour les autre modes. Doit être remis à 0 par le soft. C'est le flag d'interruption de réception. Il est mis à 1 lorsque le 8eme bit a été reçu en mode 0 .Pour les autres modes il est mis à 1 au milieu du stop bit reçu. Doit être remis à 0 par le programme. La procédure est alors la suivante: Initialisation Pour initialiser la transmission série les instructions suivantes doivent être exécutées préalablement par le processeur : mov TMOD,#20H ; mode du Timer 1 mov TH1,#0FDH ;9600 Bauds ( pour 19200 bauds cette valeur est la même mais le bit SMOD est au 1 ) mov SCON,#52H setb TR1 ;Mode 1 pour RS232 ;Lancement Timer 1 Utilisation : 30 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------- Emission: EMIS:jnb TI,EMI clr TI mov SBUF,A ret On attend que TI soit à 1 RAZ de TI émission Fin de sous progr Réception RECEP:jnb RI,RECEP clr RI mov A,SBUF ret Attente de data reçue RAZ de RI lecture octet dans A Liaison avec un ordinateur La liaison série du 8031 aboutit le plus souvent à un ordinateur type PC . Dans ce type de micro ordinateur le circuit de gestion de la liaison série est un UART ( 8250 ) contenant un certain nombre de registres. A l'émission ce sont les registres dans lequel se trouve le caractère à émettre (Tampon d’émission ) et celui qui contient l'octet en cours d’émission . A la réception on trouve de même un registre dans lequel se trouve l'octet en cours de réception et celui contenant le dernier caractère reçu. .(Tampon de réception ). Le transfert est défini par: - Un registre de définition de la vitesse et des paramètres nécessaires - Un registre d'état. Le registre d’Initialisation se trouve à l'adresse $03BF il a la configuration représentée dans les tableaux suivants: Le bit 7 joue un rôle important, il permet l'accès au registre définissant la vitesse .Ce registre de vitesse de 16 bits se trouve localisé aux adresses $3F8 et $3F9 mais n'est accessible que si le bit précédent est à 1 . En fonction de la vitesse désirée le mot à charger est indiqué dans le tableau ci contre.: Vitesse = F0 / Baud rate divisor Vitesse (Bauds) 1200 2400 4800 9600 19200 Baud rate divisor $0060 $0030 $0018 $000C $0006 Le registre d’adresse $3FB définit le format du transfert son contenu est détaillé dans le tableau suivant : Contenu du registre 3FB 7 6 5 4 0 1 0 1 0 1 ⇒ ⇒ 3 0 1 1 0 0 1 1 ⇒ ⇒ 0 0 1 0 1 ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ 0 1 ⇒ ⇒ 2 ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ 3FB Nombre de bits de données 5 6 7 8 Bits de Stop 1 bit de stop Si 5 bits de données 1,5 bit de stop Autre cas 2 stops bits Parité pas de bit de parité 1 bit de parité Type de parité Parité impaire Parité paire ⇒ Parité fixe parité dépendant de l'octet (Si bit 3 à 1) Parité fixe ⇒ Break forcé inutilisé envoie 0 sur tous les bits à émettre 31 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------0 1 ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ Accès au registre de vitesse accès aux autres registres accès au registre de vitesse Le registre d'état se trouve à l'adresse $03FD 0 1 2 3 4 5 6 1 si un octet est dans le tampon de réception 1 si erreur d'écrasement 1 si erreur de parité ( Attention ce bit est RAZ par la lecture ) 1 si erreur de trame 1 si détection d'un break 1 si le tampon d'émission est vide 1 si le registre d'émission est inoccupé Si le flag de réception (bit 0) est à 1 cela veut dire qu'une donnée peut être lue dans le tampon de réception . Il faut la récupérer puis remettre ce flag à 0 avant que la donnée suivante vienne écraser la précédente. Quand le flag d'émission (Bit 5) est à 1 l'envoi de la donnée est terminée Après avoir mis ce flag à 0 on peut placer la donnée suivante dans le tampon d'émission. Le registre tampon qui sert à l'émission et la réception est à l'adresse $03F8, il s'agit d'un registre qui se trouve à la même adresse que le registre de vitesse mais s'en distingue par l'état du bit 7 de $3FD .L’accès à ce tampon exige que ($3FD)-7 (Le DLBA) soit au 0. La gestion du transfert peut se faire par interruption ou plus aisément par scrutation du registre d'état. Le registre d’adresse 3F9 accessible avec DLAB=0 contient des informations sur les interruptions associées au circuit 8250 .Dans certains cas comme nous le verrons plus loin il est souhaitable de désactiver ces interruptions en chargeant 00000000 dans ce registre. Attention :Si on utilise seulement 3 fils RXD TXD et Masse, il relier faut ensembles - Request to Send et Clear to Send (RTS-CTS) - Data Set Ready et Data Terminal Ready (DSR-DTR) SIGNAL Masse Emission TXD Réception RXD RTS CTS DSR DTR DB25 7 2 3 4 5 6 20 DB9 5 3 2 7 8 6 4 liaisons à assurer 1 sur la fiche 5 6 9 Prise DB9 d'un PC vue arriére ou coté so de la fiche femelle au bout D'ou le logiciel de gestion: Initialisation : Port[$3FB]:=$80; PortW[$3F8]:=$000C; Port[$3FB]:=$03; Residu:=Port[$3F8]; accès au registre de vitesse Init 9600 bauds Init 8b,1bs,NoP Pour vider le tampon . Residu est un octet Lecture d'un octet arrivant vers le PC Repeat Res:=Port[$3FD] AND $01; Until Res=$01; DATA:=Port[$3F8] Attente d'arrivée bit 1 de 3FD La donnée s'appelle DATA Envoi d'un caractère sur le bus Repeat 32 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------Res:=( Port[$3FD] AND $20 ); Until Res=$20 Port[$3F8]:=DATA ; Attente de tampon d'émission vide bit 5 de 3FD; DATA est l'octet à envoyer EXEMPLES: 1. Transfert de PC vers 8031 . L’ordinateur envoie les nombres successifs de 0 à 255 vers le port P1 qui les affiche. La vitesse de transfert est déterminée par une instruction de retard (delay) de 100mS du programme PC Les deux fichiers implantés dans la ROM du 8031 et dans la mémoire du PC sont par exemple les suivants . (Comme dans les exemples suivants , les routines de gestion du BUS sont implantées à partir de l’adresse 80H et la programme principal à partir de 100H) a) En assembleur 8051 (PCV8031) ORG 0 LJMP 100H ORG 80H INIT232:MOV TMOD,#20H; ;Timer 1 en mode 2 MOV TH1,#0FDH ;Vtesse 9600 bauds MOV SCON,#52H ;Mode 1 pour transmission série ( SM0-SM1=01 mode 1 , REN=1 et TI=1),il est nécessaire de précharger TI à 1 car le soft surveille TI et s’il était à 0 croirait qu’une transmission est en cours et ne partirait jamais ) SETB TR1 ;Lancement du Timer 1 RET RECEPT:JNB RI,Recept; ;Boucle d’attente de réception CLR RI ;RI est remis à zéro dès que son passage à 1 est détecté MOV A,SBUF ;Lecture de l’octet reçu qui est transféré dans A RET EMET:JNB TI,EMET CLR TI MOV SBUF,A RET ;l’octet dans A est envoyé ORG 100H MOV P1,#0 ATTENTE:CALL RECEPT MOV P1,A SJMP ATTENTE END Pour initialiser les leds au départ Programme principal ,attente d’une réception Commande des leds b) En PASCAL dans le PC (PCV8031.PAS) Program Transfert_Serie_vers_8031; Var A,W:byte; Procedure INITRS232; Var Reste:byte; Begin Port[$3FB]:=$80; Portw[$3F8]:=$000C; Port[$3FB]:=$03; Accès au registre de vitesse Vitesse 9600 bauds Format 8 bits de données 1 stop bit pas de bit de parité 33 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------Reste:=Port[$3F8]; RAZ du registre de transfert End; Procedure EmetByte ( Data:byte); Begin Repeat Res:=((Port[$3FD] and ($20)); Until Res=$20; Port[$3F8]:=Data; End; Procedure RecoitByte( Var Data:byte); Begin Repeat Res:=((Port[$3FD]) and($01)); Until Res=$01; Data := Port[$3F8]; End; (****** Programme principal *****) Begin A:=0; (* initialisation *) W:=0; (* boucle sans fin *) While W=0 do Begin A:=A+1; EnvoiByte(A); Delay(100); (* Délai de 100ms entre chaque envoi *) End; End. 2. Envoi d’octets du 8031 vers le PC Le 8031 envoie des octets qui sont affichés sur l’écran du PC .Un sous programme de Délai est nécessaire pour laisser le temps au PC de recevoir et afficher chaque octet. a En assembleur 8031 (8031VPC) Les routines d’initialisation sont les mêmes qui plus haut et ne sont pas réécrites. ORG 0 LJMP 100H ORG 80H INITRS232..... RECEPT..... EMET..... DELAY:MOV R7,#03 RETR1:MOV R6,#100 RETR2:MOV R5,#255 RETR3:DJNZ R5,RETR3 DJNZ R6,RETR2 DJNZ R7,RETR1 RET ORG 100H LCALL INITRS232 MOV A,#0 BOUCLE:LCALL EMET MOV P1,A INC A LCALL DELAY 34 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------SJMP BOUCLE END. b) Dans le PC en turbo PASCAL (8031VPC.PAS) Program Transfert_Serie_vers_PC; Var A,W:Byte; Procedure INITRS232; ........ Procedure EmetByte(Data:Byte); ........ Procedure RecoitByte(Var data:Byte); ........ (* Programme principal *) Begin INITRS232; W:=0; ClrScr; (* Effacement écran *) While W=0 do Begin RecoitByte(A); Write(A,’ ‘); End; End. 3. Dialogue bi directionnel entre un PC et un 8031 Ce programme a comme intérêt de synchroniser l’échange qui se fait ainsi à la vitesse maximale acceptable pour les deux partenaires. Le PC commence l’échange en envoyant un octet (0), le 8031 le reçoit, l’affiche sur son port P1 et le renvoie sans modification. Le PC le reçoit, l’affiche, puis l’incrémente avant de le renvoyer , et ainsi de suite. Les deux partenaires affichent ainsi les nombres successifs, l’incrémentation s’effectuant dans le programme du PC . On pourrait bien sûr sécuriser les échanges en demandant au PC de vérifier à chaque étape que l’octet reçu du 8031 est bien identique à celui qui lui a été envoyé. a) Le programme en assembleur (ECH31PC) Org 0 LJMP 100H Org 80H INITRS232: (les sous programme décrits plus haut ) RECOIT: EMET: DELAY: ORG 100H LCALL INITRS232 MOV P1,#0 ;affichage initial 0 BOUCLE:LCALL RECOIT ; attend un octet MOV P1,A ; l’affiche sur P1 LCALL EMET ;le renvoie au PC SJMP BOUCLE END. b) En Turbo PASCAL pour le PC (ECH31PC.PAS) Program Dialogue_serie_entre_PC et_8031; Var A,W:Byte; 35 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------- Procedure INITRS232; ........ Procedure EmetByte(Data:Byte); ....... Procedure RecoitByte(Var Data;Byte); ....... (* Programme Principal *) Begin INITRS232; W:=0;A:=0; ClrScr; While W=0 do Begin EmetByte(A); RecoitByte(A); Write(A,’ ‘); A:=A+1; End; End. Le taux de transfert obtenu est de 10000 échanges par minute , cette durée tombe à 22 secondes seulement si l’on supprime l’affichage des octets successifs sur l’écran du PC UTILISATION DU MODE 3 Dans le programme précédent le transfert est contrôlé par renvoi de l’octet reçu et comparaison . Ce contrôle peut être effectué de façon bien plus rapide en utilisant la technique du bit de parité. Aux 8 bits de l’octet à transmettre est ajouté un neuvième bit , dit de parité , choisi de telle façon que le nombre de 1 parmi les 9 bits soit toujours pair (ou impair , on parle alors de bits d’imparité ) . Les modifications à apporter aux programmes précédents sont minimes : 1° Pour le programme du 8031 Il faut travailler en mode 3 .D’où pour l’Initialisation : MOV TMOD,#20H MOV TH1,#0FDH MOV TL1,#0FDH MOV SCON,#0D2H SETB TR1 Mode 2 du timer 1 L’octet définissant la vitesse reste inchangé Facultatif (SM0-SM1=11 mode 3 REN=1 TI=1) Lancement timer A l’émission il faut générer le bit de parité ,soit : EMET:JNB TI,EMET CLR TI MOV A,R0 MOV C,P MOV TB8,C MOV SBUF,A RET L’octet à transmettre que nous supposons dans R0 est nécessairement placé dans A pour en détecter la parité Le bit de parité est créé dans la retenue ( 1 s’il y a dans A un nombre impair de 1 ) et chargé dans TB8 (SCON.3) déclenche l’envoi A la réception saisir le bit de parité ( 9eme bit du transfert ) qui se trouve dans RB8, il y a erreur de transmission si ce bit est différent du bit de parité de l’octet reçu que l’on bascule dans A . L’absence d’instruction ou exclusif dans le processeur booléen complique un peu le logiciel qui peut par exemple être le suivant : RECEPT:MOV 20H,#0 36 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------MOV 21H,#0 ATTENT: JNB RI,ATTENT CLR RI MOV C,RB8 MOV 0,C MOV A,SBUF MOV C,P MOV 8,C MOV R0,A MOV A,21H XRL 20H,A Les deux octets 20 et 21 de la RAM sont remis à zéro Boucle d’attente de RI=1 RAZ RI Le bit de parité est placé dans le bit d’adresse 0 qui n’est pas autre chose que la case 0 de la mémoire 20H Octet reçu dans A Chargement de la parité de A dans C La parité de l’octet reçu qui vient d’être chargé en A est placée dans le bit d’adresse 8 qui n’est pas autre chose que le bit 0 de l’adresse 21H L’octet reçu est stocké dans R0 Le OU exclusif de 20H et 21H est stocké dans 20H .Cette case mémoire contient alors 0 si le ou exclusif est nul c’est à dire que les deux octets sont égaux donc P=RB8 ,ce qui est réalisé s’il n’y a pas d’erreur de transmission. RET A la sortie de ce sous programme R0 contient l’octet reçu et la case mémoire 20H contient O si aucune erreur de parité n’a été détectée. 2° Pour le programme dans la mémoire du PC A l’émission le bit de parité est automatiquement créé si le format de l’échange est convenablement défini , la seule ligne à changer à l’Initialisation est Port[$3FB]:=$1B 00011011 [ Non accès au registre de vitesse- (0) -Break (0)-Parité fonction de l’octet (0)-Parité paire (1)-1 bit de parité (1)-1 bit de stop (0) -8 bits de données (11)] A la réception il faut surveiller le bit 2 de 3FD qui , attention , est remis à zéro dès qu’il est lu , d’où ces instructions qui délivrent l’octet reçu dans A et positionnent le Booléen ERREUR Repeat B:=Port[$3FD]; res:=(B and $01); attente de passage à 1 du bit 0 de 3FD Until res=$01; A:=Port[$3F8]; Lecture de l’octet reçu IF (B AND $04) then ERREUR:=True else ERREUR:=FALSE ; La variable ERREUR est vraie (TRUE) s’il y a eu erreur . EXEMPLE: Le programme suivant est comme plus haut un échange d’octets entre un PC et un 8031 mais cette fois le contrôle de transfert est assuré par bit de parité. L’utilisateur introduit le nombre d’octets à transmettre ainsi que l’écart entre chacun d’entre eux en millisecondes. Le PC envoie vers le 8031 les octets successifs à partir de 0 ,ce dernier les lui renvoie en écho et sur l’écran sont affichés les deux octets envoyé et reçu qui doivent toujours égaux, ainsi que le mot OK si aucune erreur n’a été détectée. Sur la carte 8031 la valeur 99H est d’abord affichée sur le port P1 et dès que le transfert est commencé le contenu de 20H soit 00.L’allumage d’une LED de P1 est donc un témoin d’erreur de transfert. Il est facile de modifier ce programme pour obtenir un arrêt de transfert en cas d’erreur de parité. a) l’assembleur pour le 8031 ORG 0 LJMP 100H ORG 80H INIT:MOV TMOD,#20H MOV TH1,#0FDH 37 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------MOV TL1,#OFDH MOV SCON,#0D2H SETB TR1 RET RECEPT:MOV 20H,#0 MOV 21H,#0 ATTENT:JNB RI,ATTENT CLR RI MOV C,RB8 MOV 0,C MOV A,SBUF MOV C,P MOV 8,C MOV R0,A MOV A,21H XRL 20H,A RET EMET:JNB TI,EMET CLR TI MOV R0,A MOV C,P MOV TB8,C MOV SBUF,A RET ORG 100H LCALL INIT MOV P1,#99H DEBUT:LCALL RECEPT MOV P1,20H LCALL EMET SJMP DEBUT END. b) Le logiciel pour le PC en TURBO PASCAL Program Echange_PC_8031_avec_parite; Var Erreur:Boolean; I,N,Delai:integer; DATAE,DATAR:byte; Procedure InitialiseRS232; Var Reste:byte; Begin Port[$3FB]:=$80; PortW[$3F8]:=$000C; Port[$3FB]:=$1B; Reste:=Port[$3F8]; End; 8 bits Parité paire 1 bit Stop Procedure EnvoitOctet(D:byte); Var Res:Byte; Begin Repeat 38 --------------------------------------------------------------------------------------------------------- Le microcontroleur 8051 ----------------------------------------------------------------------------------------------------------------------------------Res:=(Port[$3FD] and $20); Until Res=$20; Port[$3F8]:=D; Port[$3F9]:=0; End ; Procedure RecoitOctet(Var D:byte;Var Err:Boolean); Var B,Res:Byte; Begin Repeat B:=Port[$3FD]; Res:=(B and $01); Until res=$01; D:=Port[$3F8]; If ((B AND $04)=1) then Err:=True else Err:=False; End; (* PROGRAMME PRINCIPAL *) Begin ClrScr; Writeln(' Echanges PC 8031 '); Titre Writeln; Write (' Nombre d''octets de l''‚échange '); Readln(N); Write (' Delai entre chaque ‚change en mS '); Readln(Delai); InitialiseRS232; DATAE:=0; For I:=0 to N-1 do Begin EnvoitOctet(DATAE); RecoitOctet(DATAR,Erreur); GotoXY(10,10); Write(I:5,' ',DATAE:3,' ',DATAR:3,' '); If ERREUR=FALSE THEN Writeln(' OK ') ELSE Writeln('*** ERREUR ***'); Delay(Delai); DATAE:=DATAE+1; End; GotoXY(10,12); Writeln(' FIN '); End 39 ---------------------------------------------------------------------------------------------------------