Vous êtes sur la page 1sur 9

Gestion d'un feu tricolore avec piton prioritaire

Feu tricolore avec piton prioritaire

;*******************************
;* Gestion d'un feu tricolore *
;* avec piton prioritaire
*
;*******************************
Gestion D'un seul feu avec piton
Le piton appui n'importe quand le feu passe lorange et puis rouge. La
cohrence de la ralit 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
; Dclaration et config du Circuit
directive d'assemblage

list
p=16f84
#include p16f84.inc
; Dans le fichier p16f84.inc on trouve l'quivalence de tous les registres
; ainsi que les bits de ces registres

; Constantes
;************
DUREER
DUREEO
DUREEV
DUREEP

equ
equ
equ
equ

24h
04h
20h
0Ah

;
;
;
;

36 secondes
4 secondes
32 secondes
10 secondes

;* Reservation memoire *

;***********************
Feu tricolore avec piton prioritaire
; Les registres occupent la RAM jusqu'en OBh
COMPT

equ

0Ch

COMPT1

equ

0Dh

COMPT2

equ

0Eh

DUREE

equ

0Fh

BUFFERB

equ

10h

BUFFER

equ

11h

BUFFER1

equ

12h

BUFFER2

equ

13h

BUFFERD

equ

14h

; Variable de tempo dcrmenter


Pour augmenter le temps
; Variable de tempo dcrmenter
Pour augmenter le temps
; Variable de tempo dcrmenter
Pour augmenter le temps
; Variable temps la valeur
Correspond au temps en seconde
; Sauvegarde du portb en
Interruption
; Sauvegarde de compt en
Interruption
; Sauvegarde de compt1 en
Interruption
; Sauvegarde de compt2 en
Interruption
; Sauvegarde de duree en
Interruption

;***************

;Initialisation*
;***************
org

debut

00h

goto

debut

org
goto
org

04h
pieton
05h

clrf
bsf

PORTB
STATUS,RP0

movlw
movwf

01h
TRISB

; Aprs le reset le PC pointe


l'adresse 00
; On saute les 5 premiers octets
car l'adresse
; 04 on a l'adresse d'interruption
; On prend l'habitude de ne pas
crire sur ce segment
; en sautant simplement jusqu'aprs
Ce segment

; Slection de Bank 1 pour l'accs


Au TRIS
;
; Dclaration du portb en sortie
Sauf RB0

;*************************

;* Init interruption INT *


;*************************
bsf

INTCON,INTE

bcf

OPTION_REG,INTEDG

bsf

INTCON,GIE

; autorise les
Interruptions matrielles
; prise en compte de
Linterruption sur front
montant
; Autorisation gnrale des
Interruptions

Accs au ports
**************

bcf

STATUS,RP0

clrf

PORTB

; Slection de Bank 0 pour l'accs


Au PORT
; Extinction de toutes les LEDS

;*********************

;Programme principal *
Feu tricolore avec piton prioritaire
;*********************

; On allume le feu rouge et on teint 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 teint 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 teint le feu vert
movlw
04h
; Seul le feu orange est allume
movwf
PORTB
movlw
DUREEO ;
movwf
DUREE
; duree du feu vert
call
tempo
goto
;******************

; SOUS PROGRAMME

boucle ; feu permanent

;******************
; SP tempo par passage de paramtre dure 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=1s =1 cycle
; l'instruction decfz est de 2 cycles
; 2 instructions = 3 s rpter 165 fois
t=495 s + 2 inst =497s
decfsz
goto

COMPT1,1; ON execute la boucle de 497s 200 fois +


2 instr dont 1 2 cycle
delai1 ; calcul du temps : 500s*200=100ms on
nglige les 5s restant

decfsz
goto

COMPT2,1; ON execute les boucles de 100 ms 10 fois


delai2 ; calcul du temps : 100ms*10=1s

decfsz

DUREE,1 ; ON excute les boucles de la valeur de


Dure
tempo
; calcul du temps : duree*100ms

goto
return

;********************************

;* Sous Programme INTERRUPTION *


Feu tricolore avec piton prioritaire
;********************************

pieton
; Sauvegarde des diffrentes valeurs utilises aussi dans le pgm interupt
movf
movwf

PORTB,0
BUFFERB

movf
movwf
movf
movwf
movf
movwf
movf
movwf

COMPT,0
BUFFER
COMPT1,0
BUFFER1
COMPT2,0
BUFFER2
DUREE,0
BUFFERD

; On allume le feu orange et on teint le feu vert


movlw
movwf
movlw
movwf
call

04h
PORTB
DUREEO
DUREE
tempo

; Seul le feu orange est allume


;
; duree du feu orange

; On allume le feu rouge et on teint le feu Orange


movlw
movwf
movlw
movwf
call
; restitution de l'tat avant

02h
; Seul le feu rouge est allume
PORTB
DUREEP ;
DUREE
; duree du feu rouge
tempo
l'appui sur le poussoir

movf
movwf

BUFFERB,0
PORTB

movf
movwf

BUFFER,0
COMPT

movf
movwf

BUFFER1,0
COMPT1 ;

movf
movwf

BUFFER2,0
COMPT2 ;

movf
movwf
bcf

BUFFERD,0
DUREE
INTCON,INTF

retfie
end

;
; Remise zro du drapeaux
Interruptions INT

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


Feu tricolore avec piton prioritaire

;*******************************
;* Gestion d'un feu tricolore
*
;* Orange clignotementFeu tricolore
* avec piton prioritaire
;* 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
Horloge = XT
Pas de WD

; Utilisation du circuit 16F84


; Dclaration 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
;************
DUREE2R
DUREEO
DUREEV

equ
equ
equ

02h
04h
20h

; 02 secondes
; 4 secondes
; 32 secondes

;* Reservation memoire *
;***********************
; Les registres occupent la RAM jusqu'en OBh
COMPT
COMPT1
COMPT2
DUREE
COMPT3

equ
equ
equ
equ
equ

0Ch
0Dh
0Eh
0Fh
10h

;***************
;Initialisation*
;***************
org

00h

; Apres le reset le PC pointe

goto

debut

; On saute les 5 premiers octets

l'adresse 00

car l'adresse
ecrire sur ce segment
ce segment

; 04 on a l'adresse d'interruption
; On prend l'habitude de ne pas
; en sautant simplement jusqu'apres

org
goto

04h
timer

Feu tricolore avec piton prioritaire

;PROGRAMME*
;***********
debut
clrf
bsf
au TRIS et registres
movlw
movwf

PORTB
STATUS,05

; Selection de Bank 1 pour l'accs

00h
TRISB

;
; Declaration du portb en sortie

;*************************
;* Init interruption INT *
;*************************
bcf
OPTION_REG,T0CS
l'horloge interne
bsf
OPTION_REG,PS0
256 en placant
bsf
OPTION_REG,PS1
Predivision par 16 de TM0
bcf
OPTION_REG,PS2
T=1s soit T=256s apres division
bcf
OPTION_REG,PSA
timer
bsf
INTCON,GIE
interruptions

; prise en compte de
; Division de l'horloge par
; PS0 PS1 a

1 et PS2 0,

; quartz 4Mhz fosc/4=1MHz


; Prediviseur assigne au
; Autorisation generale des

;*Acces au ports
;****************
au PORT

bcf

STATUS,05

; Selection de Bank 0 pour l'accs

clrf

PORTB

; Extinction de toutes les LEDS

; Init Variables
; **************
movlw
movwf

0x007A
COMPT3

;*********************
;Programme principal *
;*********************
; On allume le feu rouge 1 et le feu vert 2 et on eteint les autres feux
boucle
movlw
movwf
movlw
movwf
call

82h
PORTB
DUREEV
DUREE
tempo

; FR1 et FV2 sont allumes


;
; duree des feux

; On allume le feu rouge 1 et le feu orange 2 et on eteint les autres feux


movlw
movwf
movlw
movwf
call

42h
PORTB
DUREEO
DUREE
tempo

; FR1 et FO2 sont allumes


;
; duree des feux

; On allume le feu rouge 1 et le feu rouge 2 et on eteint les autres feux

Feu tricolore avec piton prioritaire

movlw
movwf
movlw
movwf
call

22h
PORTB
DUREE2R
DUREE
tempo

; FR1 et FO2 sont allumes


;
; duree des feux

; On allume le feu vert 1 et le feu rouge 2 Orange clignotant et on eteint les


autres feux
bsf
debordement timer
movlw
movwf
movlw
movwf
call
bcf
debordement timer

INTCON,T0IE

; autorise les interuptions

28h
PORTB
DUREEV ;
DUREE
tempo
INTCON,T0IE

; FR1 et FO2 sont allumes


; duree des feux
; inhibe les interruptions

; On allume le feu orange 1 et le feu rouge 2 et on eteint les autres feux


movlw
movwf
movlw
movwf
call

24h
PORTB
DUREEO ;
DUREE
tempo

; FR1 et FO2 sont allumes


; duree des feux

; On allume le feu rouge 1 et le feu rouge 2 et on eteint les autres feux


movlw
movwf
movlw
movwf
call

22h
PORTB
DUREE2R ;
DUREE
tempo

; FR1 et FO2 sont allumes

goto

boucle

; feu permanent

movlw
movwf

0x000A
COMPT2

; chargement de COMPT2 DE 10
;

movlw
movwf

0x00C8
COMPT1

; chargement de COMPT1 DE 200


;

movlw
movwf

0x00A5
COMPT

; chargement de COMPT de 165

COMPT,1
delai

; Le temps de decompter 165 valeurs


; calcul du temps : 1 instruction

; duree des feux

;******************
; SOUS PROGRAMME *
;******************
; SP tempo
;**********
tempo

delai2
delai1
delai

decfsz
goto
=Tquartz/4=1s =1 cycle

; l'instruction decfz est de 2

cycles

Feu tricolore avec piton prioritaire


; 2 instructions = 3 s repeter 165

fois t=495 s + 2 inst =497s


decfsz
COMPT1,1
fois + 2 instr dont 1 2 cycle
goto
delai1
on neglige les 5s rstant
10 fois

valeur de duree

; ON execute la boucle de 497s 200


; calcul du temps : 500s*200=100ms

decfsz

COMPT2,1

; ON execute les boucles de 100 ms

goto

delai2

; calcul du temps : 100ms*10=1s

decfsz

DUREE,1

; ON execute les

goto

tempo

; calcul du temps : duree*100ms

boucles de la

return

;*******************************
; SOUS PROGRAMME Interruption *
;*******************************
; SP debordement timer
;*********************
timer
les 0,5s

afin
fin

decfsz
goto

COMPT3,1
fin

; Debordement toutes les 4,096ms


; Decompteur par 122 soit toutes

movlw
movwf

0x007A
COMPT3

; Init compteur

btfss
goto
bcf
goto

PORTB,4
afin
PORTB,4
fin

bsf

PORTB,4

bcf
interruption TMR0
retfie
end

INTCON,T0IF

; Remise zro du drapeau