Même probleme avec l'elaboration des tempo des feux par debordement de timer

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
     
    

    DEBUT DE PAGE

    Suite

    SOMMAIRE


    Giampiero D'AQUINO
    Enseignant en Génie Electronique -