L'avantage de l'utilisation du timer est :Sa precision pouvant atteindre 0,5µs (pas exploite ici mais dans le chapitre suivant). L'utilisation en interruption permet d'effectuer d'autres taches au lieu d'attendre que le temps passe. Le TIMER est la partie la plus vaste du HC11.
Ici on utilise le débordement du Timer, on ne presentera que cette partie du timer.
![]()
Les bit PR0 et PR1 permettent de prediviser l'horloge par 1, 4, 8, ou 16, ainsi le compteur TCNT peut être 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. Lors du debordement du compteur (Passage de $FFFF a $0000) le bit TOF est mis a 1. On peut remetre ce bit a zero. Registre TMSK2
bit 7 TOI autorise l'interruption Debordement Timer
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
TOI — Validation de Timer Overflow
0 = L'interruption est desactive
1 = L'interruption est active, elle sera demande lorsque TOF (voir TFLG2) est a 1.Registre TFLG2 bit 7 TOF 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 TOF passe a un et demande une interruption de type TO. 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 - - - -
TOF — Timer Overflow Flag Le drapeau TOF 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.Adresse du vecteur d'interruption
$FFDE et $FFDF
Organigrammes de fonctionnement
![]()
* fichier feutimer.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 tmsk2 equ $24 tflg2 equ $25 *Constantes dureev equ 64 * Duree de 64/2 d'allumage du feu vert dureeo equ 8 * Duree de 8/2 d'allumage du feu orange duree2r equ 4 * Duree de 4/2 d'allumage du feu rouge 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 drapeau rmb 1 * Drapeau permettant de connaitre l'etat de la tempo compt1 rmb 1 * Compteur pour la tempo *Début du programme implantation en EEPROM org $F800 ******************** * Configuration ******************** *initialisation de la pile start lds #pile * Initilisation de Y pour adressage indexé 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) * Autorisation interruption debordement TCNT bset tmsk2,y,#$83 *Interruption toutes les 524,28ms *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 attente rts *Sous programmes tempo4 ********************* * duree de temporisation de 4 secondes tempo4 ldaa #dureeo staa duree bsr attente rts *Sous programmes tempo2 ********************** * duree de temporisation de 2 secondes tempo2 ldaa #duree2r staa duree bsr attente rts *Sous programmes Attente ********************** * Attente d'interruption attente ldaa drapeau beq attente clr drapeau rts ******************************** * Sous programmes interruption* ******************************** * SP TIMER Depassement TCTNT * ****************************** tempo inc compt1 * Tempo de 0,52428 x duree ldaa duree * Donne le temps suba compt1 * comparaison de compt1 bne fin1 * a Duree ldaa #$01 * Drapeau = 1 fin tempo staa drapeau * clr compt1 * Preparation pour tempo suivante * TOF=0 pour revenir en interruption 524,28ms apres fin1 bclr tflg2,y,#$7F * On utilise ici bclear au lieu de bset pour ne pas toucher au bit RTIF utilise dans la RTI 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 Timer Debordement TCTNT org $ffde rstctnt fdb tempo *vecteur Real time interrupt org $fff0 rstrti fdb orange *vecteur de reset org $fffe rstvect fdb start end
Giampiero D'AQUINO
Enseignant en Génie Electronique -