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


;*******************************
;* Gestion d'un feu tricolore	 *
;* Orange clignotement         *
;* par debordement timer       *
;*******************************

; fichier 11_Ocli.asm

; Gestion de 2 feux
; tempo orange cligntant par interrup timer
; Feu tricolore sur portB 
; Feu rouge bit 1, orange bit 2 et vert bit 3.
; V  O  R  0  V  O  R
; 7  6  5  4  3  2  1  0
; 8  4  2  1  8  4  2  1
;
; Device = 16F84		; Utilisation du circuit 16F84
; Horloge =  XT		; Déclaration et config du Circuit
; Pas de WD

; 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
;************
 
DUREE2R		equ		02h		; 02 secondes
DUREEO		equ		04h		; 4 secondes
DUREEV		equ		20h		; 32 secondes

;* Reservation memoire *
;***********************

; Les registres occupent la RAM jusqu'en OBh
 
COMPT		equ		0Ch
COMPT1		equ		0Dh
COMPT2		equ		0Eh
DUREE		equ		0Fh
COMPT3		equ		10h


;***************
;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		timer

;PROGRAMME*
;***********
 
debut		
		clrf		PORTB		
		bsf		STATUS,05	; Selection de Bank 1 pour l'accès au TRIS et registres
		movlw		00h		;
		movwf		TRISB		; Declaration du portb en sortie

;*************************
;* Init interruption INT *
;*************************
 
		bcf		OPTION_REG,T0CS		; prise en compte de l'horloge interne		
		bsf		OPTION_REG,PS0		; Division de l'horloge par 256 en placant
		bsf		OPTION_REG,PS1		; PS0 PS1 a  1 et PS2 à 0, Predivision par 16 de TM0
		bcf		OPTION_REG,PS2		; quartz 4Mhz fosc/4=1MHz T=1µs soit T=256µs apres division
		bcf		OPTION_REG,PSA		; Prediviseur assigne au timer		
		bsf		INTCON,GIE		; Autorisation generale des interruptions

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

; Init Variables
; **************
 
		movlw		0x007A
		movwf		COMPT3
	
;*********************
;Programme principal *
;*********************

; On allume le feu rouge 1 et le feu vert 2 et on eteint les autres feux
 
boucle
		movlw		82h		; FR1 et FV2 sont allumes
		movwf		PORTB
		movlw		DUREEV		; 
		movwf		DUREE		; duree des feux 
		call		tempo	

; On allume le feu rouge 1 et le feu orange 2 et on eteint les autres feux
 
		movlw		42h		; FR1 et FO2 sont allumes
		movwf		PORTB	
		movlw		DUREEO		; 
		movwf		DUREE		; duree des feux 
		call		tempo	

; On allume le feu rouge 1 et le feu rouge 2 et on eteint les autres feux
 
		movlw		22h		; FR1 et FO2 sont allumes
		movwf		PORTB	
		movlw		DUREE2R		; 
		movwf		DUREE		; duree des feux 
		call		tempo	

; On allume le feu vert 1 et le feu rouge 2 Orange clignotant et on eteint les autres feux
 
		bsf		INTCON,T0IE	; autorise les interuptions debordement timer
		movlw		28h		; FR1 et FO2 sont allumes
		movwf		PORTB	
		movlw		DUREEV	; 
		movwf		DUREE		; duree des feux 
		call		tempo	
		bcf		INTCON,T0IE		; inhibe les interruptions debordement timer

; On allume le feu orange 1 et le feu rouge 2 et on eteint les autres feux
 
		movlw		24h		; FR1 et FO2 sont allumes
		movwf		PORTB	
		movlw		DUREEO	; 
		movwf		DUREE		; duree des feux 
		call		tempo	

; On allume le feu rouge 1 et le feu rouge 2 et on eteint les autres feux
 
		movlw		22h		; FR1 et FO2 sont allumes
		movwf		PORTB	
		movlw		DUREE2R	; 
		movwf		DUREE		; duree des feux 
		call		tempo	

		goto		boucle		; feu permanent


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


; SP tempo 
;**********

 
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 *
;*******************************
		
; SP debordement timer
;*********************
 
timer
		decfsz		COMPT3,1	; Debordement toutes les 4,096ms 
		goto		fin		; Decompteur par 122 soit toutes les 0,5s
		
		movlw		0x007A		; Init compteur
		movwf		COMPT3

		btfss		PORTB,4
		goto		afin
		bcf		PORTB,4
		goto		fin
afin		
		bsf		PORTB,4	
fin		
		bcf		INTCON,T0IF	; Remise à zéro du drapeau interruption TMR0
		retfie

 		
		end


DEBUT DE PAGE

SOMMAIRE


Giampiero D'AQUINO
Enseignant en Genie Electronique