Gestion d'un feu tricolore avec pieton prioritaire - Solution par XIRQ

* fichier PIETON2.asc
* gestion d'un feu tricolore
* Gestion D'un seul feu avec pieton
* Le pieton appui n'importe quand le feu passe au orange et puis rouge.
* La coherence de la realite fait que l'on appui seulement quand le feu est vert
* Interruption par XIRQ
* Feu tricolore sur portB Feu rouge bit 2, orange bit 1 et vert bit 0.
*                R  O  V
* 7  6  5  4  3  2  1  0

*Equivalences registres
 
portb		equ		$1004

* Constantes
 
dureet		equ		10

*Variables
 
		org		$0000
duree		rmb		1


*Début du programme implantation en EEPROM
 
		org		$F800

********************
*   Configuration        
********************
* Pile
 
start		lds		#$00ff

*L'interruption XIRQ n'est pas demasquable par cli donc on doit faire passer le bit de masque X
* du CCR a 0 par une autre instruction
*Le bit X du CCR est le Bit 6.

 
		clra		*bit 6 à 0
		tap		* Transfert a vers CCR


********************
*Programme principal  
********************
* allumage du feu rouge et extinction du feu orange
 
debut		ldaa		#$04
		staa		portb

* tempo de 36 secondes
 
		bsr		tempo36

* allumage du feu vert et extinction du feu rouge
 
		ldaa		#$01
		staa		portb

* tempo de 32 secondes
 
		bsr		tempo32

* alumage du feu orange et extinction du feu vert
 
		ldaa		#$02
		staa		portb

* tempo de 4 secondes
 
		bsr		tempo4

* Retour
 
		bra		debut

********************
*  Sous Programmes 
********************

*SP Tempo36
***********
* tempo de 36 secondes
 
tempo36		ldaa		#dureer
		staa		duree
		bsr		tempo
		rts

*SP Tempo32
***********

* tempo de 32 secondes
 
tempo32		ldaa		#dureev
		staa		duree
		bsr		tempo
		rts

*SP Tempo4
***********

* tempo de 4 secondes
 
tempo4		ldaa		#dureeo
		staa		duree
		bsr		tempo
		rts

*SP Tempo10
***********

* tempo de 10 secondes
 
tempo10		ldaa		#dureep
		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 XIRQ
*******
* Sauvegarde des feux car on utilise le portb
 
pieton		ldaa		portb
		staa		buffer

* Passage du feu au Orange
 
		ldaa		#$02
		staa		portb

* Tempo feu orange
 
		bsr		tempo4

* Passage du feu au Rouge pour que le pieton puisse travailler
 
		ldaa		#$04
		staa		portb

* Tempo feu rouge pendant 10s
 
		bsr		tempo10

* Restitution de l'etat du portb avant l interruption
 
		ldaa		buffer
		staa		portb
		rti

***************************
* Vecteurs d'interruptions
***************************
* Vecteur XIRQ
		 
		org		$fff4
xirqvect	fdb		pieton

*vecteur de reset 
 
		org		$fffe
rstvect		fdb		start
		end

DEBUT DE PAGE

Gestion de 2 feux de carrefour ajout d'une feu clignotant. .

SOMMAIRE


Giampiero D'AQUINO
Enseignant en Genie Electronique