Ici on utilise le timer par comparaison. On obtient ainsi un temps d'une precision allant jusqu'a 0,5µs. Dans l'exemple precedent le temps etait fixe par le debordement du timer. Ce qui implique que le compteur s'incremente 65535 fois. Avec l'utilisation de la comparaison on choisit le nombre de fois que le compteur s'incremente pour creer un evenement.
Ici on utilise la comparaison du Timer, on ne presentera que cette partie du timer. L'exemple est donne sur TOC2.
![]()
Les bit PR0 et PR1 permettent de prediviser l'horloge par 1, 4, 8, ou 16, ainsi le compteur TCNT peut etre cadence par E, ou E/4 E/8 ou E/16. Ce prediviseur doit etre programme durant les 64 premiers clock d'horloge pour etre pris en compte. La predivision donne la precision du compteur. Pour 8Mhz ce dernier est incremente toutes les 500 ns, 2µs, 4µs ou 8µs selon la combinaison de PR[0:1] Le compteur TCNT est un compteur qui n'est jamais arrete. On peut le lire mais pas l'arreter, pas le forcer a zero ou autres valeurs.
La valeur du compteur sur 16 bits est compare a une valeur sur 16 bits, la valeur de TOC2. Lorsqu'il ya egalite le bit OC2F passe a 1. Si l'on a autorise l'interruption par 0C2I, une requete d'interruption est demande.Registre TMSK2
Bit 0 et 1 predivision de E
Timer Interrupt Mask Register 2 (TMSK2 $1024)
Bit 7 6 5 4 3 2 1 Bit 0 TOI RTII PAOVI PAII - - PR1 PR0
PR[1:0] Predivision 0 0
0 1
1 0
1 1
1
4
8
16
Registre TMSK1
Bit 6 Autorisation interruption de TOC 2, sa mise a un autorise l'interruption TOC2. Des que FLAG TOC2 passe a un on part en interruption (voir registre ci-apres).
Timer Interrupt Mask Register 1 (TMSK1 $1022)
Bit 7 6 5 4 3 2 1 Bit 0 OC1I OC2I OC3I OC4I I4/O5I IC1I IC2I IC3I Registre TFGL1
Bit 6 Flag de TOC 2, des qu'il est a un on part en interruption si l'on est autorise. Il faut donc le remettre a zero a la fin du SP d'interruption par TOC2.
Timer FLAG Register 1 (TFLG1 $1023)
Bit 7 6 5 4 3 2 1 Bit 0 OC1F OC2F OC3F OC4F I4/O5F IC1F IC2F IC3F
Adresse du vecteur d'interruption
$FFDE et $FFE6
Organigrammes de fonctionnement
![]()
* fichier feutoc.asc * Gestion des tempos par timer * (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 *Equivalences registres portb equ $04 pactl equ $1026 tmsk1 equ $22 * Bit 6 autorisation OC2 tmsk2 equ $24 tflg1 equ $23 tflg2 equ $25 toc2 equ $18 *Constantes dureev equ 32 * Duree de 32s d'allumage du feu vert dureeo equ 4 * Duree de 4s d'allumage du feu orange duree2r equ 2 * Duree de 2s d'allumage du feu rouge pile equ $ff *Variables org $0000 compt rmb 1 * Compteur contenant le nombre d'interruption RTI permettant * de conaitre la duree entre 2 interruptions RTI temps rmb 2 * Temps en seconde, variable ou l'on stocke ; * le temps a attendre qu'un actionneur soit actif et qui est * decompte ; drapeau rmb 1 * Valeur binaire 0 temps non atteint 1 temps atteint ; compt1 rmb 1 * Compteur de 10 eme de seconde *Debut du programme implantation en EEPROM org $F800 ******************** * Configuration ******************** *initialisation de la pile start lds #pile * Initilisation de Y pour adressage indexe specifique aux instructions BSET BCLR BRSET BRCLR ldy #$1000 * Init Timer ************ *Predivision du timer avant 64 clock d'horloge *PR0=PR1=1 Predivision par 16 (16*500ns=8µs) bset tmsk2,y,#$03 * Init TOC2 ************ * Validation de l'interruption OC2 bset tmsk1,y,#$40 *Initialisation de la RTI ************************** * Horloge 8Mhz RTR0=RTR1=1 t=32.77ms ldaa #$03 staa pactl * Init compteur 10 * 100ms pour faire 1 s ldaa #10 staa compt1 * Autorisation des interruptions Generales 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 * ***************** * duree de temporisation de 32 secondes tempo32 ldx #dureev stx temps bsr attente rts *Sous programmes tempo4 ********************* * duree de temporisation de 4 secondes tempo4 ldx #dureeo stx temps bsr attente rts *Sous programmes tempo2 ********************** * duree de temporisation de 2 secondes tempo2 ldx #duree2r stx temps bsr attente rts *Sous programmes Attente ********************** * Attente d'interruption attente ldaa drapeau beq attente clr drapeau rts ******************************** * Sous programmes interruption* ******************************** * SP TIMER comparaison OC2 * **************************** * Preparation de la prochaine interruption ajout de 100 ms tempo ldd #12500 addd toc2,y std toc2,y * Base de 10 fois 100ms = 1s dec compt1 bne fin1 * Init de compt a 10 pour la prochaine interruption ldaa #10 staa compt1 * Temps en seconde executer ldx temps dex stx temps bne fin1 * Drapeau ldaa #$01 staa drapeau * OC2F pour revenir en interruption. fin1 bclr tflg1,y,#$bf rti * 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 bclr tflg2,y,#$BF * On utilise ici bclear au lieu de bset pour ne pas toucher au bit TOF utilise dans debordement TIMER interupt rti *************************** * Vecteurs d'interruptions *************************** *vecteur TOC2 org $ffe6 vectoc2 fdb tempo *vecteur Real time interrupt org $fff0 vecrti fdb orange *vecteur de reset org $fffe rstvect fdb start end
Giampiero D'AQUINO
Enseignant en Genie Electronique -