Telechargé par BOUALAOUI7374

APPLICATIONS A VOIR PIC 16F84 OK

publicité
1)Allumage de LEDS en sortie.
;****************************
;*Allumer une LED sur PortB *
;****************************
; fichier 1_led.asm
;A la mise sous tension la LED SUR RB s'allume
;
; Device = 16F84
; Utilisation du circuit 16F84
; Horloge = XT
; Déclaration et config du Circuit
; Equivalence registres
;***********************
PORTB
equ
TRISB
equ
STATUS
equ
0x0006 ; Adresse du portb
0x0086 ; Adresse du registre de direction du portb
0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0
; ce qui donne acces au TRIS ou au PORT
; Equivalence DONNEES
; *******************
donnee
D2, D6 et D7
equ
0x0062 ; Donnee en hexa a stocker en sortie on allume les LED
;***************
;Initialisation*
;***************
org
00h
; Apres le reset le PC pointe l'adresse 00
goto
début
org
05h
clrf
bsf
movlw
movwf
bcf
PORTB
; Mise a zero des latches de sorties
STATUS,05 ; Selection de Bank 1 pour l'accès au TRIS
00h
TRISB
; RAZ registre de direction portb soit en sortie.
STATUS,05
; Selection de Bank 0 pour l'accès au PORT
;
;
;
;
On
04
On
en
saute les 5 premiers octets car à l'adresse
on a l'adresse d'interruption
prend l'habitude de ne pas ecrire sur ce segment
sautant simplement jusqu'apres ce segment
debut
;*********************
;Programme principal *
;*********************
; On active les sorties 1,5 et 6 sur le portb
movlw
movwf
donnee ; chargement dans le registre W valeur litterale
PORTB
; chargement du contenu de w dans le fichier PORTB
goto
fin
fin
end
2) Recopie d'un port en entrée sur sortie.
;*********************************
;*Recopier le portA sur le PortB *
;*********************************
; fichier 2_recop.asm
;
; Device = 16F84
; Horloge = XT
; Utilisation du circuit 16F84
; Déclaration et config du Circuit
; Equivalence registres
;***********************
PORTA
PORTB
TRISA
TRISB
STATUS
equ
equ
equ
equ
equ
;***************
;Initialisation*
;***************
org
0x0005
0x0006
0x0085
0x0086
0x0003
;
;
;
;
;
;
Adresse du porta
Adresse du portb
Adresse du registre de direction du portb
Adresse du registre de direction du porta
Le bit 5 permet d'acceder à la Banque 1 ou 0
ce qui donne acces au TRIS ou au PORT
00h
; Apres le reset le PC pointe l'adresse 00
goto
debut
;
;
;
;
org
05h
clrf
clrf
bsf
movlw
movwf
PORTB
PORTA
STATUS,05
00h
TRISB
;
;
;
;
;
movlw
movwf
bcf
1fh
TRISA
STATUS,05
;
; Declaration du porta en entree
; Selection de Bank 0 pour l'accès au PORT
On
04
On
en
saute les 5 premiers octets car à l'adresse
on a l'adresse d'interruption
prend l'habitude de ne pas ecrire sur ce segment
sautant simplement jusqu'apres ce segment
debut
Mise a zero des latches de sorties
Mise a zero des latches de sorties
Selection de Bank 1 pour l'accès au TRIS
Declaration du portb en sortie
;*********************
;Programme principal *
;*********************
boucle
movf
movwf
goto
end
PORTA,0
; chargement dans le registre Work du porta
PORTB
; chargement du contenu de w dans le fichier PORTB
boucle ; recopie permanente
1-3) Clignotement de toutes les LED sur un port en sortie à l'aide d'une tempo par
boucle.
;********************************
;*Faire clignoter tout le PortB *
;********************************
; fichier 3_cligno.asm
; Le clignotement n'est pas visible a l'oeil nu
; un oscilloscope sur l'une des sorties permet de s'assurer du
clignotement de la LED
; On pourra verifier aussi la mesure du temps à l'oscilloscope
; La comparer au calcul effectue
; Device = 16F84
; Utilisation du circuit 16F84
; Horloge = XT
; Déclaration et config du Circuit
; Equivalence registres
;***********************
PORTB
equ
TRISB
equ
STATUS
equ
0x0006 ; Adresse du portb
0x0086 ; Adresse du registre de
direction du porta
0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0
; ce qui donne acces au TRIS ou au PORT
;* Reservation memoire *
; Les registres occupent la RAM jusqu'en OBh
COMPT
equ
0Ch
;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
bsf
movlw
movwf
bcf
;Programme principal *
clrf
boucle
movlw
movwf
tempo
decfsz
goto
comf
goto
end
PORTB
STATUS,05
00h
TRISB
STATUS,05
;
;
;
;
;
Mise a zero des latches de sorties
Selection de Bank 1 pour l'accès au TRIS
PORTB
; Extinction de toutes les LEDS
0x00ff
COMPT
; chargement de COMPT de la valeur maximale
Declaration du portb en sortie
Selection de Bank 0 pour l'accès au PORT
COMPT,1
; Le temps de decompter 256 valeurs
tempo
; calcultemps : 1 instruction =Tquartz/4=1µs =1 cycle
; l'instruction decfz est de 2 cycles
; 2 instructions = 3µs repeter 256 fois t=768µs
PORTB,1
; on inverse l'etat des LEDs
boucle
; recopie permanente
1-4) Clignotement d'une seule LED sur un port en sortie à l'aide d'une tempo par
boucle. Introduction d'un sous programme.
;****************************************
;*Faire clignoter la LED 1 du PortB *
;****************************************
; fichier 4_ledcli.asm
; Le clignotement n'est pas visible
a l'oeil nu
; un oscilloscope sur la sortie
clignotante permet de s'assurer du
clignotement de la LED
; On pourra verifier aussi la mesure
du temps à l'oscilloscope
; La comparer au calcul effectue
;
;
; 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
;* Reservation memoire *
; Les registres occupent la RAM jusqu'en OBh
COMPT
equ
0Ch
;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
; Mise a zero des latches de sorties
bsf
STATUS,05
; Selection de Bank 1 pour l'accès au TRIS
movlw
00h
;
movwf
TRISB
; Declaration du portb en sortie
bcf
;Programme principal *
boucle
clrf
call
movlw
movwf
call
goto
;Sous Programmes *
tempo
movlw
movwf
delai
decfsz
goto
=1 cycle
STATUS,05
; Selection de Bank 0 pour l'accès au PORT
PORTB
tempo
01h
PORTB
tempo
boucle
; Extinction de toutes les LEDS
0x00ff
COMPT
; chargement de COMPT de la valeur maximale
COMPT,1
delai
; Le temps de decompter 256 valeurs
; calcul du temps : 1 instruction =Tquartz/4=1µs
; on inverse l'etat de la LED 1
; recopie permanente
; l'instruction decfz est de 2 cycles
; 2 instructions = 3 µs repeter 256 fois t=768µs
return
end
1-5) Clignotement d'une seule LED sur un port en sortie à l'aide d'une tempo par
boucles imbriquées
Faire clignoter la LED 0 sur le PortB a la frequence de 0,5 Hz *
; fichier 5_led1cl.asm
; Le clignotement est visible a l'oeil nu periode de 200 ms
; Device = 16F84
; Utilisation du circuit 16F84
; Horloge = XT
; Déclaration et config du Circuit
; Equivalence registres
PORTB
equ
0x0006 ;
TRISB
equ
0x0086 ;
STATUS
equ
0x0003 ;
* Reservation memoire *
; Les registres occupent la RAM jusqu'en OBh
COMPT
equ
0Ch
COMPT1
equ
0Dh
;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
; Mise a zero des latches de sorties
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
;Programme principal *
clrf
PORTB
; Extinction de toutes les LEDS
boucle
bsf
PORTB,0
; On allume la LED 1
call
tempo
bcf
PORTB,0
; On eteind la LED 1
call
tempo
goto
boucle
; recopie permanente
; SOUS PROGRAMME *
; SP tempo de 100 ms *
tempo
movlw
0x00C8
; chargement de COMPT1 DE 200
movwf
COMPT1
;
delai1
movlw
0x00A6
; chargement de COMPT
movwf
COMPT
delai
decfsz
COMPT,1
; Le temps de decompter 166 valeurs
goto
delai
; calcul temps:1 instruction =Tquartz/4=1µs =1 cycle
; l'instruction goto est de 2 cycles
; 2 instructions = 3 µs repeter 166 fois t=498 µs
decfsz
goto
return
end
COMPT1,1
delai1
; ON execute la boucle 200 fois
; calcul du temps : 500µs*200=100ms
1-6) Clignotement d'une seule LED2 sur le même port en sortie.
La durée d'extinction et d'allumage étant différente.
Introduction de variable et passage de paramètre
;********************************************
;* Faire clignoter la LED 0 sur le PortB
*
;* Duree niveau haut de 3s niveau bas de 1s *
;********************************************
; fichier 6_hautba.asm
; Device = 16F84
; Horloge = XT
; Utilisation du circuit 16F84
; Déclaration et config du Circuit
; Equivalence registres
;***********************
PORTB
TRISB
STATUS
equ
equ
equ
0x0006 ; Adresse du portb
0x0086 ; Adresse du registre de direction du porta
0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0
; ce qui donne acces au TRIS ou au PORT
equ
equ
1Dh
0Ah
; Constantes
;************
DUREEAL
DUREEET
; 30 * 1/10s
; 10 * 1/10s
;* Reservation memoire *
;***********************
; Les registres occupent la RAM jusqu'en OBh
COMPT
COMPT1
DUREE
equ
equ
equ
;***************
0Ch
0Dh
0Eh
;Initialisation*
;***************
org
goto
00h
; Apres le reset le PC pointe l'adresse 00
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
clrf
bsf
movlw
movwf
PORTB
STATUS,05
00h
TRISB
; Mise a zero des latches de sorties
; Selection de Bank 1 pour l'accès au TRIS
;
; Declaration du portb en sortie
bcf
clrf
STATUS,05
PORTB
; Selection de Bank 0 pour l'accès au PORT
; Extinction de toutes les LEDS
PORTB,07
; On allume la LED 7 seule
PORTB,0
DUREEAL
DUREE
tempo
PORTB,0
DUREEET
DUREE
tempo
boucle
; On allume la LED 0 seule
; Passage du parametre pour la duree
; de la tempo ici niveau haut
debut
;*********************
;Programme principal *
;*********************
bsf
boucle
bsf
movlw
movwf
call
bcf
movlw
movwf
call
goto
; On eteint la LED 0 seule
; Passage du parametre pour la duree
; de la tempo ici niveau bas
; recopie permanente
;******************
; SOUS PROGRAMME *
;******************
; SP tempo par passage de parametre duree est en 10 eme de seconde *
;*************************************************************************
tempo
movlw
movwf
0x00C8
COMPT1
; chargement de COMPT1 DE 200
;
movlw
movwf
0x00A5
COMPT
; chargement de COMPT de 165
decfsz
goto
COMPT,1
delai
; Le temps de decompter 165 valeurs
; calcul du temps : 1 instruction =Tquartz/4=1µs
delai1
delai
=1 cycle
decfsz
goto
decfsz
goto
return
end
COMPT1,1
delai1
DUREE,1
tempo
; l'instruction goto est de 2 cycles
; 2 instructions = 3 µs repeter 165 fois t=495 µs
; ON execute la boucle 200 fois
; calcul du temps : 500µs*200=100ms
; ON execute les boucles de la valeur de duree
; calcul du temps : duree*100ms
1-7) Même problème que ci-dessus avec modulation de la temporisation par
donnée sur port d'entrée.
;*********************************************
;* Faire clignoter la LED 0 sur le PortB
*
;* Duree niveau haut est module par le porta *
;*********************************************
; fichier 7_ledmod.asm
;
;
; Device = 16F84
; Horloge = XT
; Utilisation du circuit 16F84
; Déclaration et config du Circuit
; Equivalence registres
;***********************
PORTA
TRISA
PORTB
TRISB
STATUS
equ
equ
equ
equ
equ
0x0005
0x0085
0x0006
0x0086
0x0003
equ
equ
30
10
;
;
;
;
;
;
Adresse du portb
Adresse du registre de direction du porta
Adresse du portb
Adresse du registre de direction du porta
Le bit 5 permet d'acceder à la Banque 1 ou 0
ce qui donne acces au TRIS ou au PORT
; Constantes
;************
DUREEAL
DUREEET
;* Reservation memoire *
;***********************
; Les registres occupent la RAM jusqu'en OBh
COMPT
COMPT1
DUREE
equ
equ
equ
0Ch
0Dh
0Eh
;***************
;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
clrf
clrf
bsf
movlw
movwf
movlw
movwf
PORTA
PORTB
STATUS,05
00h
TRISB
1fh
TRISA
debut
; Mise a zero des latches de sorties
; Selection de Bank 1 pour l'accès au TRIS
;
; Declaration du portb en sortie
;
; Declaration du portA en entree
bcf
clrf
STATUS,05
PORTB
; Selection de Bank 0 pour l'accès au PORT
; Extinction de toutes les LEDS
bsf
PORTB,07
; On allume la LED 7 seule
bsf
movf
addlw
movwf
call
bcf
movlw
movwf
call
goto
PORTB,0
PORTA,0
1
DUREE
tempo
PORTB,0
DUREEET
DUREE
tempo
boucle
;
;
;
;
;*********************
;Programme principal *
;*********************
boucle
On allume la LED 0 seule
Passage du parametre pour la duree
on evite que duree est de 0
de la tempo ici niveau haut
; On eteint la LED 0 seule
; Passage du parametre pour la duree
; de la tempo ici niveau bas
; recopie permanente
;******************
; SOUS PROGRAMME *
;******************
; SP tempo par passage de parametre duree est en 10 eme de seconde *
;*************************************************************************
tempo
movlw
movwf
0x00C8
COMPT1
; chargement de COMPT1 DE 200
;
movlw
movwf
0x00A6
COMPT
; chargement de COMPT
decfsz
goto
COMPT,1
delai
decfsz
goto
decfsz
goto
COMPT1,1
delai1
DUREE,1
tempo
delai1
delai
return
end
; Le temps de decompter 166 valeurs
; calcultemps : 1 instruction =Tquartz/4=1µs =1cycle
; l'instruction goto est de 2 cycles
; 2 instructions = 3 µs repeter 166 fois t=498 µs
; ON execute la boucle 200 fois
; calcul du temps : 500µs*200=100ms
; ON execute les boucles de la valeur de duree
; calcul du temps : duree*100ms
8) Gestion d'un feu tricolore.
Elaboration d'une tempo de base de 1s et modulable par paramètre selon la durée des 3
feux.
Trois boucles imbriquées.
presentation du probleme
Séquence d'allumage :
Au démarrage :
Feu rouge
36s
Feu vert 32s
Feu Orange
4s
Pour une souplesse des temps de temporisation on se servira d'une base de temps de 1 seconde
avec une sous base de 0,1s.
;*******************************
;* Gestion d'un feu tricolore *
;*******************************
; fichier 8_feux.asm
;
;
;
;
;
Gestion D'un seul feu
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
; Horloge = XT
; Utilisation du circuit 16F84
; Déclaration et config du Circuit
; Equivalence registres
;***********************
PORTB
TRISB
STATUS
equ
equ
equ
0x0006 ; Adresse du portb
0x0086 ; Adresse du registre de direction du porta
0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0
; ce qui donne acces au TRIS ou au PORT
equ
equ
equ
24h
04h
20h
; Constantes
;************
DUREER
DUREEO
DUREEV
; 36 secondes
; 4 secondes
; 32 secondes
;* Reservation memoire *
;***********************
; Les registres occupent la RAM jusqu'en OBh
COMPT
COMPT1
COMPT2
DUREE
equ
equ
equ
equ
;***************
;Initialisation*
;***************
org
goto
0Ch
0Dh
0Eh
0Fh
00h
; Apres le reset le PC pointe l'adresse 00
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
clrf
bsf
movlw
movwf
bcf
clrf
PORTB
STATUS,05
00h
TRISB
STATUS,05
PORTB
debut
;
;
;
;
;
Selection de Bank 0 pour l'accès au TRIS
Declaration du portb en sortie
Selection de Bank 1 pour l'accès au PORT
Extinction de toutes les LEDS
;*********************
;Programme principal *
;*********************
; On allume le feu rouge et on eteint le feu Orange
boucle
movlw
movwf
movlw
movwf
call
02h
PORTB
DUREER ;
DUREE
tempo
; Seul le feu rouge est allume
; duree du feu rouge
; On allume le feu vert et on eteint le feu rouge
movlw
movwf
movlw
movwf
call
08h
PORTB
DUREEV
DUREE
tempo
; Seul le feu vert est allume
;
; duree du feu orange
; On allume le feu orange et on eteint le feu vert
movlw
movwf
movlw
movwf
call
04h
PORTB
DUREEO
DUREE
tempo
; Seul le feu orange est allume
goto
boucle
; feu permanent
;
; duree du feu vert
;******************
; SOUS PROGRAMME *
;******************
; SP tempo par passage de parametre duree est en seconde *
;*************************************************************************
tempo
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
decfsz
goto
COMPT,1
delai
; Le temps de decompter 165 valeurs
; calcul du temps : 1 instruction =Tquartz/4=1µs
delai2
delai1
delai
=1 cycle
; l'instruction decfz est de 2 cycles
; 2 instructions = 3 µs repeter 165 fois t=495
µs + 2 inst =497µs
decfsz
instr dont 1 à 2 cycle
goto
les 5µs rstant
COMPT1,1
; ON execute la boucle de 497µs 200 fois + 2
delai1
; calcul du temps : 500µs*200=100ms on neglige
decfsz
goto
COMPT2,1
delai2
; ON execute les boucles de 100 ms 10 fois
; calcul du temps : 100ms*10=1s
decfsz
goto
DUREE,1
tempo
; ON execute les boucles de la valeur de duree
; calcul du temps : duree*100ms
return
end
9- Gestion de 2 feux de carrefour
On 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
Horloge = XT
;
;
; Equivalence registres
;***********************
PORTB
TRISB
STATUS
; Constantes
;************
equ
equ
equ
0x0006 ;
0x0086 ;
0x0003 ;
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
equ
equ
equ
equ
0Ch
0Dh
0Eh
0Fh
;***************
;Initialisation*
;***************
org
00h
; Apres le reset le PC pointe l'adresse 00
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
goto
segment
; en sautant simplement jusqu'apres ce segment
org
05h
clrf
bsf
movlw
movwf
bcf
clrf
PORTB
STATUS,05
00h
TRISB
STATUS,05
PORTB
debut
;
;
;
;
;
Selection de Bank 1 pour l'accès au TRIS
Declaration du portb en sortie
Selection de Bank 0 pour l'accès au PORT
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
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
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 et on eteint les autres feux
movlw
movwf
movlw
movwf
call
28h
PORTB
DUREEV
DUREE
tempo
; FR1 et FO2 sont allumes
;
; duree des feux
; 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
;
; duree des feux
goto
boucle
; feu permanent
;******************
; SOUS PROGRAMME *
;******************
; SP tempo par passage de parametre duree est en seconde *
;*************************************************************************
tempo
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
decfsz
goto
COMPT,1
delai
; Le temps de decompter 165 valeurs
; calcul du temps : 1 instruction =Tquartz/4=1µs
delai2
delai1
delai
=1 cycle
; l'instruction decfz est de 2 cycles
; 2 instructions = 3 µs repeter 165 fois t=495
µs + 2 inst =497µs
decfsz
instr dont 1 à 2 cycle
goto
les 5µs rstant
COMPT1,1
; ON execute la boucle de 497µs 200 fois + 2
delai1
; calcul du temps : 500µs*200=100ms on neglige
decfsz
goto
COMPT2,1
delai2
; ON execute les boucles de 100 ms 10 fois
; calcul du temps : 100ms*10=1s
decfsz
goto
DUREE,1
tempo
; ON execute les boucles de la valeur de duree
; calcul du temps : duree*100ms
return
end
INTRODUCTION aux INTERRUPTIONS.
Il existe des interruptions materielles et logicielles.
Ces dernières permettent lorsque l'evenement arrive de le traiter sans l'attendre.
Lorsque l'on a au moins deux traitements à effectuer, au moins l'un des 2 est traite par
interruption, voire tous les traitements.
Interruptions materielles :
Une patte du microprocesseur est directement affectee par l'interruption. Un front ou un niveau
logique declenche l'interruption.
Interruptions Logicielle
Un bit concernant un registre provoque une interruption. Ce bit s'active par un evenement
logiciel.
Par exemple lorsque l'on reçoit une donnee d'un modem, le registre de la communication vers le
modem est rempli, une interruption est generee, le programme d'interruption lit la donnee. Ainsi
entre deux receptions d'octets on peut effectuer une autre tache (par emple traiter les info du
clavier de la souris, ect…)
Lors d'une interruption autorisee, le micro fini par executer l'instruction en cours, sauvegarde
l'adresse de retour dans la pile. Lorsque le programme execute le sous programme d'interruption,
le Bit de masque d'interruption est positionne à 1. (c'est à dire plus d'interruption autorisee). Lors
du retour du sous programme d'interruption il est repositionne à zero.
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
; Horloge = XT
; Utilisation du circuit 16F84
; 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
goto
04h
pieton
org
05h
debut
clrf
bsf
movlw
movwf
;*************************
;* Init interruption INT *
;*************************
bsf
bcf
bsf
PORTB
STATUS,RP0
01h
TRISB
; Selection de Bank 1 pour l'accès au TRIS
;
; Declaration du portb en sortie sauf RB0
INTCON,INTE
OPTION_REG,INTEDG
INTCON,GIE
; autorise les interuptions materielles
; interruption sur front montant
; Autorisation generale 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
movwf
movlw
movwf
call
; On allume le feu vert et on
02h
; Seul le feu rouge est allume
PORTB
DUREER ;
DUREE
; duree du feu rouge
tempo
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
; calcultemps :1 instruction =Tquartz/4=1µs =1cycle
; l'instruction decfz est de 2 cycles
;2 instructions =3 µs repeter 165 fois t=495 µs+2inst =497µs
decfsz
goto
COMPT1,1;executeboucle de 497µs 200fois+2instr dont1à2 cycle
delai1 ; calcultemps:500µs*200=100ms on neglige les 5µs rstant
decfsz
goto
COMPT2,1; ON execute les boucles de 100 ms 10 fois
delai2 ; calcul du temps : 100ms*10=1s
decfsz
goto
DUREE,1 ; ON execute les boucles de la valeur de duree
tempo
; calcul du temps : duree*100ms
return
;********************************
;* Sous Programme INTERRUPTION *
;********************************
pieton
; Sauvegarde des differentes 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 eteint 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 eteint le feu Orange
movlw
movwf
movlw
movwf
call
02h
PORTB
DUREEP ;
DUREE
tempo
; Seul le feu rouge est allume
; duree du feu rouge
; restitution de l'etat avant 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
BUFFERD,0
DUREE
;
bcf
INTCON,INTF
; Remise à zéro du drapeaux interruptions INT
retfie
end
;
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
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 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
clrf
bsf
PORTB
STATUS,05
; Selection de Bank 1 pour l'accès au TRIS et
movlw
movwf
00h
TRISB
;
; Declaration du portb en sortie
;PROGRAMME*
;***********
debut
registres
;*************************
;* Init interruption INT *
;*************************
bcf
bsf
OPTION_REG,T0CS
OPTION_REG,PS0
; prise en compte de l'horloge interne
; Division de l'horloge par 256 en
bsf
OPTION_REG,PS1
; PS0 PS1 a
OPTION_REG,PS2
; quartz 4Mhz fosc/4=1MHz T=1µs soit
OPTION_REG,PSA
INTCON,GIE
; Prediviseur assigne au timer
; Autorisation generale des interruptions
placant
1 et PS2 à 0, Predivision
par 16 de TM0
bcf
T=256µs apres division
bcf
bsf
;*Acces au ports
;****************
bcf
clrf
STATUS,05
PORTB
; Init Variables
; **************
movlw
movwf
0x007A
COMPT3
; Selection de Bank 0 pour l'accès au PORT
; 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
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
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
movlw
movwf
movlw
movwf
call
bcf
INTCON,T0IE
28h
PORTB
DUREEV ;
DUREE
tempo
INTCON,T0IE
; autorise les interuptions debordement timer
; FR1 et FO2 sont allumes
; duree des feux
; inhibe les interruptions debordement timer
; 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
;******************
; SOUS PROGRAMME *
;******************
; SP tempo
;**********
; duree des feux
tempo
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
decfsz
goto
COMPT,1
delai
; Le temps de decompter 165 valeurs
; calcul du temps : 1 instruction =Tquartz/4=1µs
delai2
delai1
delai
=1 cycle
; l'instruction decfz est de 2 cycles
; 2 instructions = 3 µs repeter 165 fois t=495
µs + 2 inst =497µs
decfsz
instr dont 1 à 2 cycle
goto
les 5µs rstant
COMPT1,1
; ON execute la boucle de 497µs 200 fois + 2
delai1
; calcul du temps : 500µs*200=100ms on neglige
decfsz
goto
COMPT2,1
delai2
; ON execute les boucles de 100 ms 10 fois
; calcul du temps : 100ms*10=1s
decfsz
goto
DUREE,1
tempo
; ON execute les boucles de la valeur de duree
; calcul du temps : duree*100ms
return
;*******************************
; SOUS PROGRAMME Interruption *
;*******************************
; SP debordement timer
;*********************
timer
decfsz
goto
COMPT3,1
fin
; Debordement toutes les 4,096ms
; Decompteur par 122 soit toutes les 0,5s
movlw
movwf
0x007A
COMPT3
; Init compteur
btfss
goto
bcf
goto
PORTB,4
afin
PORTB,4
fin
bsf
PORTB,4
bcf
retfie
INTCON,T0IF
afin
fin
end
; Remise à zéro du drapeau interruption TMR0
Téléchargement