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