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 end2-2)Gestion de 2 feux de carrefour ajout d'un feu clignotant.
Giampiero D'AQUINO
Enseignant en Genie Electronique