Meme probleme avec l'elaboration des tempo des feux par de Timer Output Compare

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
 

DEBUT DE PAGE

SOMMAIRE


Giampiero D'AQUINO
Enseignant en Genie Electronique -