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 $FFF1

Registre 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
		end

DEBUT DE PAGE

Même probleme avec l'eleboration des tempos des feux par timer.

SOMMAIRE


Giampiero D'AQUINO
Enseignant en Genie Electronique