9- Gestion de 2 feux de carrefourOn effectue la gestion de 2 feux de carrefour. Les SP de temporisation reprennent ceux precedents.
![]()
;******************************* ;* Gestion d'un feu tricolore * ;******************************* ; fichier 9_2feux.asm ; Gestion de 2 feux ; Feu tricolore sur portB ; Feu rouge bit 1, orange bit 2 et vert bit 3. ; V O R 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 ; Equivalence registres ;*********************** PORTB equ 0x0006 ; Adresse du portb TRISB equ 0x0086 ; Adresse du registre de direction du porta STATUS equ 0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0 ; ce qui donne acces au TRIS ou au PORT ; 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 ;*************** ;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 05h debut clrf PORTB bsf STATUS,05 ; Selection de Bank 1 pour l'accès au TRIS movlw 00h ; movwf TRISB ; Declaration du portb en sortie bcf STATUS,05 ; Selection de Bank 0 pour l'accès au PORT clrf PORTB ; Extinction de toutes les LEDS ;********************* ;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 et on eteint les autres feux movlw 28h ; FR1 et FO2 sont allumes movwf PORTB movlw DUREEV ; movwf DUREE ; duree des feux call tempo ; 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 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 end
Giampiero D'AQUINO
Enseignant en Genie Electronique