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
---------------------------------------------------------------------------------------------------------