2-1) Gestion d'un feu tricolore avec pieton prioritaire


;*******************************
;* Gestion d'un feu tricolore  *
;* avec pieton prioritaire     *
;*******************************

; fichier 10_pieto.asm

;  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

; Feu tricolore sur portB 
; Feu rouge bit 1, orange bit 2 et vert bit 3.
;             V  O  R
; 7  6  5  4  3  2  1  0
 
;
; Device = 16F84		; Utilisation du circuit 16F84
; Horloge =  XT		; Déclaration et config du Circuit

; directive d'assemblage 
 
	list	p=16f84
	#include p16f84.inc
 
; Dans le fichier p16f84.inc on trouve l'equivalence de tous les registres
; ainsi que les bits de ces registres

; Constantes
;************
 
DUREER		equ		24h		; 36 secondes
DUREEO		equ		04h		; 4 secondes
DUREEV		equ		20h		; 32 secondes
DUREEP		equ		0Ah		; 10 secondes
 
;* Reservation memoire *
;***********************

; Les registres occupent la RAM jusqu'en OBh
 
COMPT		equ		0Ch		; Variable de tempo decrementer pour augmenter le temps
COMPT1		equ		0Dh		; Variable de tempo decrementer pour augmenter le temps
COMPT2		equ		0Eh		; Variable de tempo decrementer pour augmenter le temps
DUREE		equ		0Fh		; Variable temps la valeur correspond au temps en seconde
BUFFERB		equ		10h		; Sauvegarde du portb en interruption
BUFFER		equ		11h		; Sauvegarde de compt en interruption
BUFFER1		equ		12h		; Sauvegarde de compt1 en interruption
BUFFER2		equ		13h		; Sauvegarde de compt2 en interruption
BUFFERD		equ		14h		; Sauvegarde de duree en interruption
 

;***************
;Initialisation*
;***************
 
		org		00h		; Apres le reset le PC pointe l'adresse 00

 
		goto		debut		; On saute les 5 premiers octets car à l'adresse
						; 04 on a l'adresse d'interruption
						; On prend l'habitude de ne pas ecrire sur ce segment
						; en sautant simplement jusqu'apres ce segment

 
		org		04h

 
		goto		pieton

 
		org		05h

 
debut		
		clrf		PORTB		
		bsf		STATUS,RP0	; Selection de Bank 1 pour l'accès au TRIS
		movlw		01h		;
		movwf		TRISB		; Declaration du portb en sortie sauf RB0


;*************************
;* Init interruption INT *
;*************************

 	
		bsf		INTCON,INTE			; autorise les interuptions materielles
		bcf		OPTION_REG,INTEDG		; prise en compte de l'interruption sur front montant
		bsf		INTCON,GIE			; Autorisation generale des interruptions


Acces au ports
**************

 
		bcf		STATUS,RP0	; Selection de Bank 0 pour l'accès au PORT
		clrf		PORTB		; Extinction de toutes les LEDS


;*********************
;Programme principal *
;*********************

; On allume le feu rouge et on eteint le feu Orange

 
boucle
		movlw		02h		; Seul le feu rouge est allume
		movwf		PORTB	
		movlw		DUREER	; 
		movwf		DUREE		; duree du feu rouge 
		call		tempo	


; On allume le feu vert et on eteint le feu rouge

 
		movlw		08h		; Seul le feu vert est allume
		movwf		PORTB	
		movlw		DUREEV	; 
		movwf		DUREE		; duree du feu orange 
		call		tempo	


; On allume le feu orange et on eteint le feu vert

 
		movlw		04h		; Seul le feu orange est allume
		movwf		PORTB	
		movlw		DUREEO	; 
		movwf		DUREE		; duree du feu vert 
		call		tempo	

		goto		boucle	; feu permanent


;******************
; SOUS PROGRAMME  *
;******************

; SP tempo par passage de parametre duree est en seconde *
;*************************************************************************

 
tempo

		movlw		0x000A	; chargement de COMPT2 DE 10
		movwf		COMPT2	; 
delai2
		movlw		0x00C8	; chargement de COMPT1 DE 200
		movwf		COMPT1	; 
delai1
		movlw		0x00A5	; chargement de COMPT de 165
		movwf		COMPT
delai
		decfsz		COMPT,1	; Le temps de decompter 165 valeurs 
		goto		delai	; calcul du temps : 1 instruction =Tquartz/4=1µs =1 cycle 
					; l'instruction decfz est de 2 cycles
					; 2 instructions = 3 µs repeter 165 fois t=495 µs + 2 inst =497µs

 
		decfsz		COMPT1,1; ON execute la boucle de 497µs 200 fois + 2 instr dont 1 à 2 cycle
		goto		delai1	; calcul du temps : 500µs*200=100ms on neglige les 5µs rstant

		decfsz		COMPT2,1; ON execute les boucles de 100 ms 10 fois  
		goto		delai2	; calcul du temps : 100ms*10=1s

		decfsz		DUREE,1	; ON execute les  boucles de la valeur de duree   
		goto		tempo	; calcul du temps : duree*100ms
		
		return


;********************************
;* Sous Programme INTERRUPTION  *
;********************************

 
pieton

 
; Sauvegarde des differentes valeurs utilises aussi dans le pgm interupt

 
		movf		PORTB,0	
		movwf		BUFFERB
				
		movf		COMPT,0	
		movwf		BUFFER
		movf		COMPT1,0
		movwf		BUFFER1
		movf		COMPT2,0
		movwf		BUFFER2
		movf		DUREE,0	
		movwf		BUFFERD


; On allume le feu orange et on eteint le feu vert
 
		movlw		04h		; Seul le feu orange est allume
		movwf		PORTB	
		movlw		DUREEO		; 
		movwf		DUREE		; duree du feu orange 
		call		tempo	


; On allume le feu rouge et on eteint le feu Orange

 
		movlw		02h		; Seul le feu rouge est allume
		movwf		PORTB	
		movlw		DUREEP	; 
		movwf		DUREE		; duree du feu rouge 
		call		tempo	


; restitution de l'etat avant l'appui sur le poussoir

 
		movf		BUFFERB,0
		movwf		PORTB

		movf		BUFFER,0
		movwf		COMPT		;

		movf		BUFFER1,0
		movwf		COMPT1	;

		movf		BUFFER2,0
		movwf		COMPT2	;

		movf		BUFFERD,0
		movwf		DUREE		;

		bcf		INTCON,INTF	; Remise à zéro du drapeaux interruptions INT

		retfie

 
		end


DEBUT DE PAGE

2-2)Gestion de 2 feux de carrefour ajout d'un feu clignotant.

SOMMAIRE


Giampiero D'AQUINO
Enseignant en Genie Electronique