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

On reprend le probleme de base 8 (gestion d'un feu tricolore), on introduit une entree active par un pieton.
Des que le pieton appui le feu passe a l'orange puis au rouge.
Ce probleme ne tient pas compte de la realite.

L'organigramme du programme principal est quasi identique qu'au probleme 8. La modification est mentionne ci-dessous:

* fichier PIETON.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 IRQ
* 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
 
*Constantes 

dureer		equ		36
dureev		equ		32
dureeo		equ		4
dureep		equ		10
pile		equ		$ff

*Variables
 
		org		$0000
duree		rmb		1
buffer		rmb		1


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

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

* Validation de toutes les interruption mascable par I
 
		CLI		; valide toutes les interruptions


********************
*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 IRQ
*******
* 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 IRQ
 
		org		$fff2
irqvect		fdb		pieton

*vecteur de reset 
 
		org		$fffe
rstvect		fdb		start
		end

DEBUT DE PAGE

Meme probleme a resoudre avec XIRQ

SOMMAIRE


Giampiero D'AQUINO
Enseignant en Genie Electronique