EXERCICE 21 :
Clignoter une LED reliée à RE0. La temporisation voisine de 0.5s sera réalisée à
l'aide de TMR1 par scrutation du drapeau TMR1IF
list p= 16f877 , r=dec
#include [Link]
__CONFIG H'3F39'
#define LED PORTE,0
bank0 macro
bcf STATUS,RP0
bcf STATUS,RP1
endm
bank1 macro
bsf STATUS,RP0
bcf STATUS,RP1
endm
bank3 macro
bsf STATUS,RP0
bsf STATUS,RP1
endm
org 0x00
goto start
start
bank1
movlw 0X06
movwf ADCON1 ; port E numérique (par défaut port E travail en analogique)
clrf TRISE ; E en sortie
bank0
movlw b'00110000' ;bit 7 et 6: existe pas
;bit 5 et 4 : prescalier / 8
;bit 3 : non utiliser
;bit 2 : chois de l'horloge interne du systeme
;bit 1 : demarage de Timer 1 : pas encors
movwf T1CON
Loop
movlw 0xff
movwf PORTE
call delay
clrf PORTE
call delay
goto Loop
; sous programme de la temporisation avec Timer 1
delay
bcf PIR1,TMR1IF ;baisser le flag de Timer 1 (pas obligatoire!)
movlw 0xdc
movwf TMR1L ;initialisation de Timer 1 pour obtenaire exactement
;0,5 s pour les 8 bits les plus faibles
movlw 0x0b
movwf TMR1H ; pour les 8 bits les plus forts
_________________________________________________
comment calculer 0,5 s
le Timer 1 compte de 0 à 2^16 = 65536
T = 65536*10^-6 = 0,065536 s
présalaire utiliser = 8, donc
T = 0,065536*8 = 0,524288 s > 0,5 s , donc comment résoudre ce problèmes?
La repense à cette question peut être résolu par plusieurs méthodes, mais la plus
exact c’est de modifier la valeur initiale de Timer 1 soit x la valeur initiale de
Timer 1 : je veux T = 0,5 s
donc 500000 = (65536-x)8 ==> x= 3036
= 0xbdc
; pour cette raison je met dans
TMR1L dc et dans TMR1H 0b
__________________________________________________
bsf T1CON,0 ; demarer le Timer 1
debut
btfss PIR1,TMR1IF ;est ce que le Timer déborde
goto debut ;si no : repeter
bcf PIR1,TMR1IF ;si oui: baisser le flag de Timer 1
return
END
EXERCICE 22 :
Clignoter une LED reliée à RD0. La temporisation voisine de 0.5s sera réalisée à
l'aide de TMR1 et son interruption TMR1I
list p= 16f877 , r=dec
#include [Link]
__CONFIG H'3F39'
cblock 0x20
conteur : 1
w_temp : 1
status_temp : 1
endc
#define LED PORTD,0
bank0 macro
bcf STATUS,RP0
bcf STATUS,RP1
endm
bank1 macro
bsf STATUS,RP0
bcf STATUS,RP1
endm
bank2 macro
bcf STATUS,RP0
bsf STATUS,RP1
endm
bank3 macro
bsf STATUS,RP0
bsf STATUS,RP1
endm
org 0x00
goto main
; programme de l'interuption TMR1I
org 0x04
movwf w_temp
swapf STATUS,w
movwf status_temp
bank0
decf conteur,f
bcf PIR1,TMR1IF
swapf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
retfie
; configuration des portes des variable
main
bank1
movlw b'11000000'
movwf INTCON
bcf TRISD,0
bsf PIE1,TMR1IE
bank0
Loop
bsf PORTD,0
call delay
bcf PORTD,0
call delay
goto Loop
; sous programme de la temporisation
delay
movlw 8
movwf conteur
bsf T1CON,0
movlw 0xdc
movwf TMR1L
movlw 0x0b
movwf TMR1H
debut
movlw 0x00
subwf conteur,w
btfss STATUS,Z
goto debut
return
END
EXERCICE 23 :
Programme qui génère le signal ci-dessous sur la sortie RE0 en utilisant TMR1
associé à CCP1
list p= 16f877 , r=dec
#include [Link]
__CONFIG H'3F39'
bank0 macro
bcf STATUS,RP0
bcf STATUS,RP1
endm
bank1 macro
bsf STATUS,RP0
bcf STATUS,RP1
endm
bank2 macro
bcf STATUS,RP0
bsf STATUS,RP1
endm
bank3 macro
bsf STATUS,RP0
bsf STATUS,RP1
endm
org 0x00
goto main
; configuration des portes et des registres
main
bank1
movlw 0X06
movwf ADCON1 ; port E numérique (par défaut port E travail en analogique)
CLRF TRISE ; port E en SORTIE
bank0
movlw b'00001011' ; mode comparaison + TMR1 = 0 (voir registre CP1CON)
movwf CCP1CON ; bits 7 : -
; bits 6 : -
; bits 5 : non utiliser mettre 0
; bits 4 : non utiliser mettre 0
; bits 3,2,1,0: Mode comparaison (drapeau CCP1IF + RAZ TMR1)
clrf TMR1H ; initialiser TMR1H = 0
clrf TMR1L ; initialiser TMR1L = 0
movlw 0xF4 ; w = 0xF4
movwf CCPR1L ; CCPR1L = 0XF4 les 8 bits les plus faible (LSB) de CCPR1
movlw 0x01 ; CCPR1L = 0XF4 les 8 bits les plus faible (LSB) de CCPR1
movwf CCPR1H ; charger dans CCPR1 500 = 0X1F4 c-à-d F4 dans
; CCPR1L et 01 dans CCPR1H
bank0
movlw b'00000000' ; configuration Timer 1
movwf T1CON ; bits 7 : -
; bits 6 : -
; bits 5 et 4 : présalaire 1:1
; bits 3 : pas utiliser : valeur par défaut 0 ou 1
; bits 2 : pas utiliser : valeur par défaut 0 ou 1
; bits 1 : oscillateur interne : mettre 0
; bits 0 : démarrer le Timer 1 : pas maintenant mettre 0
bcf PIR1,CCP1IF ; baisser le flag de CCP1 (par précaution)
bsf T1CON,TMR1ON ; démarer le Timer 1
; programme principale
Loop
btfss PIR1,CCP1IF ; tester le flag de CCP1
goto Loop ;
comf PORTE,f ; PORTE = ~PORTE
bcf PIR1,CCP1IF ; baisser le flag de CCP1 (pour autre utilisation )
goto Loop
END