Gestion de 2 feux de carrefour ajout d'une feu clignotant.On reprend le probleme n°9 gestion de 2 feux et on rajoute un feu clignotant orange pour tourner a droite lorsque le feu 1 est vert. Le clignotement du feu orange se fait par l'interruption temps reel (RTI). On autorise son clignotement que lorsque le feu 1 est vert.
![]()
Le problème se situe sur le clignotement du feu orange.
La RTI est une interruption qui arrive régulièrement dans le temps. Chaque fois qu'elle se présente on exécute le programme D'interruption associé.
Le vecteur d'interruption est à l'adresse : $FFF0 $FFF1Registre PACTL bits RTR0, RTR1 : ils déterminent la période d'interruption
Pulse Accumulator Control Register (PACTL $1026)
Bit7 6 5 4 3 2 1 Bit 0 DDRA7 PAEN PAMOD PEDGE DDRA3 I4/O5 RTR1 RTR0 RTR[1:0] — RTI Interrupt Rate Select :
Ces deux bits determinent l'intervalle de temps entre deux interruptions RTI.
Ce temps est pilote par la division de l'horloge E/213. Cette horloge est independante de l'horloge TIMER 'voir exo suivant). La combinaison de ces deux bits permettent la division selon le tableau ci-dessous.
RTR[1:0] E = 3 MHz E = 2 MHz E = 1 MHz E = X MHz 0 0
0 1
1 0
1 1
2.731 ms
5.461 ms
10.923 ms
21.845 ms
4.096 ms
8.192 ms
16.384 ms
32.768 ms
8.192 ms
16.384 ms
32.768 ms
65.536 ms
(E/2 13 )
(E/2 14 )
(E/2 15 )
(E/2 16 )
Pour obtenir ne période de 32,768 ms, RTR0 et RTR1=1
ldaa #$03 staa pactl * Horloge 8Mhz RTR0=RTR1=1 t=32.77ms
Registre TMSK2 bit 6 RTII autorise l'interruption RTI
Timer Interrupt Mask Register 2 (TMSK2 $1024)
Ce registre contient le bit de validation de l'interruption temps reel.
Bit 7 6 5 4 3 2 1 Bit 0 TOI RTII PAOVI PAII - - PR1 PR0 RTII — Validation de Real-Time Interrupt
0 = L'interruption est desactive
1 = L'interruption est active, elle sera demande lorsque RTIF (voir TFLG2) est a 1.
* Autorisation de l'interruption RTI *bset tmsk2,x,#$40 Registre TFLG2 bit 6 RTIF indique l'état de l'interruption Timer Interrupt Flag Register 2 (TFLG2 — $1025)
Ce registre est liee au registre TMSK2, chaque bits de TFLG2 a sa correspondance bit a bit avec TMSK2.
Le bit RTIF passe a un et demande une interruption de type RTI. Il faut le remettre à 0 au depart et à chaque sortie du SP d'interruption.
Bit 7 6 5 4 3 2 1 Bit 0 TOF RTIF PAOVF PAIF - - - -
RTIF — Real-Time Interrupt Flag Le drapeau RTIF est automatiquement mis a un a la fin de chaque periode de determine par RTR0 et RTR1. Pour le remettre a zero on ecrit un 1 dans le registre.
* Etat de la RTI Forcage du bit rtif a 0 *
bset tflg2,x,#$40 * Permet de remettre le bit RTIF a 0 * Chez motorola pour mettre un drapeau a 0 * On le remet avec un 1 Resolution du probleme presente par RTI.
* fichier feuclign.asc * (32s) Rouge feu 1/vert feu 2 - (4s) Rouge feu 1/Orange feu 2 - (2s) Rouge feu 1/Rouge feu 2 * (32s) Vert feu 1 Orange2 clignotant/Rouge feu 2 - (4s) Orange1 feu 1/Rouge feu 2 - (2s) Rouge feu 1/Rouge feu 2 * Gestion D'un seul feu * Feu tricolore 1 sur portB Feu rouge bit 2, orange bit 1 et vert bit 0. * Feu tricolore 2 sur portB Feu rouge bit 7, orange bit 6 et vert bit 5. * R O V OC R O V * 7 6 5 4 3 2 1 0 * 8 4 2 1 8 4 2 1 portb equ $04 pactl equ $1026 tmsk2 equ $24 tflg2 equ $25 * Constantes dureev equ 32 dureeo equ 4 duree2r equ 2 pile equ $ff *Variables org $0000 duree rmb 1 * Parametre contenant la duree en seconde compt rmb 1 * Compteur contenant le nombre d'interruption RTI permettant * de conaitre la duree entre 2 interruptions RTI *Début du programme implantation en EEPROM org $F800 ******************** * Configuration ******************** * Pile start lds #$00ff * Initilisation de Y pour adressage indexé specifique aux instructions BSET BCLR BRSET BRCLR ldy #$1000 *Initialisation de la RTI ************************** * Horloge 8Mhz RTR0=RTR1=1 t=32.77ms ldaa #$03 staa pactl * Etat de la RTI Forcage du bit rtif a 0 * bset tflg2,y,#$40 * Ce bit indique l'etat de la RTI * Chez Motorola pour remettre à zero les flag on met un 1 d'ou l'utilisation de BSET ci-dessus * Autorisation des interruptions Générales masquable par I du CCR cli ******************** *Programme principal ******************** * allumage du feu rouge feux 1 et vert feux 2. debut ldaa #$81 staa portb,y * tempo de 32 secondes bsr tempo32 * allumage du feu rouge feux 1 et feu orange feux 2 ldaa #$82 staa portb,y * tempo de 4 secondes bsr tempo4 * allumage du feu rouge feux 1 et feu rouge feux 2 ldaa #$84 staa portb,y * tempo de 2 secondes bsr tempo2 * allumage du feu vert feux 1 et rouge feux 2. ldaa #$24 staa portb,y * Autorisation de l'interruption RTI * bset tmsk2,y,#$40 * tempo de 32 secondes bsr tempo32 * allumage du feu orange feux 1 et feu rouge feux 2 ldaa #$44 staa portb,y * inibition de l'interruption RTI * bclr tmsk2,y,#$40 * tempo de 4 secondes bsr tempo4 * allumage du feu rouge feux 1 et feu rouge feux 2 ldaa #$84 staa portb,y * tempo de 2 secondes bsr tempo2 bra debut ***************** * Sous programmes * ***************** *Sous programmes tempo32 ********************** * duree de temporisation de 32 secondes tempo32 ldaa #dureev staa duree bsr tempo rts *Sous programmes tempo4 ********************* * duree de temporisation de 4 secondes tempo4 ldaa #dureeo staa duree bsr tempo rts *Sous programmes tempo2 ********************** * duree de temporisation de 2 secondes tempo2 ldaa #duree2r staa duree bsr tempo rts *Sous programme tempo* ******************** * lecture du paramètre duree determinant la duree de la tempo en seconde tempo ldaa duree * on effectue 10 boucles de 100 ms tduree ldab #10 * Duree de base de 100ms par decrementation de X qui dure 3µs*33333=99999µs t1s ldx #33333 t100ms dex bne t100ms * fin de la boucle 100ms decb bne t1s *fin de la boucle 1s deca bne tduree *fin de la duree fois 1s rts ******************************** * Sous programmes interruption* ******************************** * SP RTI * ********** orange inc compt * 23 (23*32,768 = 754ms) fois la RTI (1/2 periode de clignotement) ? ldaa compt suba #23 bne fin *sortir de la rti duree inferieure a 754 ms depuis le dernier *changement du feu orange clignotant * Test s'il faut eteindre ou allumer le feu orange clignotant ldaa portb,y bita #$10 beq inv * On eteint le feu orange clignotant bclr portb,y,#$10 bra suite * On allume le feu orange clignotant inv bset portb,y,#$10 *RAZ compteur pour compter de nouveau un temps de 754ms suite clr compt * rtif=0 pour revenir en rti 32.77ms apres fin bset tflg2,y,#$40 rti *************************** * Vecteurs d'interruptions *************************** *vecteur Real time interrupt org $fff0 rtivect fdb orange *vecteur de reset org $fffe rstvect fdb start endMême probleme avec l'eleboration des tempos des feux par timer.
Giampiero D'AQUINO
Enseignant en Genie Electronique