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
Giampiero D'AQUINO
Enseignant en Genie Electronique