 |
 |
 |
 |
;***********************************************************************
; interruption TMR1
; appelée à chaque interruption TMR1
;*********************************************************************** |
inttimer1 |
|
bcf |
T1CON, TMR1ON |
; arret timer |
|
movfw |
SAV_TMR1H |
; chargement timer poids fort |
|
movwf |
TMR1H |
; |
|
movfw |
SAV_TMR1L |
; chargement timer poids faible |
|
movwf |
TMR1L |
; |
 |
 |
 |
 |
|
movlw |
b'000000010' |
; inversion sortie |
|
xorwf |
GPIO,f |
; |
 |
 |
 |
 |
|
decfsz |
CPT_256,f |
; décrément compteur durée |
|
bsf |
T1CON, TMR1ON |
; relancer timer |
 |
 |
 |
 |
|
return |
|
; |
|
;*******************************************************************
; interruption TMR0
; appelée à chaque interruption TMR0 *
;******************************************************************* |
inttimer0 |
|
return |
|
; |
|
END |
|
; |
On va aussi suivre
ce sous-programme ligne
par ligne.
 Etiquette
nom du programme
 |
 |
 |
 |
|
bcf |
T1CON, TMR1ON |
; arret timer |
Arrêt du timer
: on met l´interrupteur à zéro (le bit TMR1ON de
l´octet T1CON). Ceci est une
précaution car on va juste après modifier la valeur du
timer, et le modifier alors qu´il continue de tourner risque
de lui faire perdre les pédales.
 |
 |
 |
 |
|
movfw |
SAV_TMR1H |
; chargement timer poids fort |
|
movwf |
TMR1H |
; |
|
movfw |
SAV_TMR1L |
; chargement timer poids faible |
|
movwf |
TMR1L |
; |
 On
charge les valeurs sauvegardées dans les sous-programmes précédents
dans le Timer1 pour un nouveau cycle.
On a ici une nouvelle
instruction movfw (Move File to
W), qui est l´inverse de movwf,
c'est-à-dire qu´elle charge le contenu du registre dans W.
Je pense que vous
savez maintenant qu´il faut procéder ainsi : pour charger
une valeur MaValeur dans un registre MonRegistre,
il faut d´abord copier MaValeur dans
W, puis de W dans ce MonRegistre.
Encore une fois
: il n´existe pas d´instruction
qui utilise deux registres, il faut toujours passer par
l´intermédiaire du registre de travail W.
 |
 |
 |
 |
|
movlw |
b'000000010' |
; inversion sortie |
|
xorwf |
GPIO,f |
; |
Chargement du littéral
(en binaire) 00000010 dans W, et
nouvelle instruction xorwf (eXclusive
Or W with File), ou exclusif ici entre W et le registre spécial GPIO.
 |
 |
 |
bit 1
 |
bit 2
 |
résultat
 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
|
|
 Un “ou
exclusif” entre deux bits donne 1 si les deux
bits sont 0 - 1 (différents), et 0 si les bits sont
0 - 0 ou 1 - 1 (identiques).
Voir
en rubrique la Techno facile, la
page consacrée à cette fonction logique méconnue. |
Si
le bit 1 est à 0, le résultat vaut le bit 2 ; si
le bit 1 est à 1 le résultat est l´inverse de
bit 2.
xorwf est
toujours effectué sur tous les bits du registre concerné,
ici GPIO, mais seul le bit 1 (deuxième à partir
de la droite) est concerné = il est automatiquement inversé.
D´une manière
générale, lorsque vous modifiez le registre GPIO,
tous les bits déclarés en sortie (uniquement le bit 1
du haut-parleur dans notre exemple), sont écrits, c'est-à-dire
la valeur électrique sur la patte est modifiée.
Le f après GPIO indique
que le résultat de l´instruction est rangé dans
le même registre.
 |
 |
 |
 |
|
decfsz |
CPT_256,f |
; décrément compteur durée |
|
bsf |
T1CON, TMR1ON |
; relancer timer |
L´instruction decfsz (Decrease
File and Skip if Zero) décrémente de 1 le registre, et
saute l´instruction suivante si le compteur passe à zéro.
Pour nous, ce compteur (chargé à 255 au lancement d´un
son) est décrémenté à chaque période.
Lorsqu´il
arrive à zéro, le programme saute la remise en route
du compteur Timer1, et l´émission
du son s´arrête ; s´il n´est pas à zéro,
on relance le compteur pour une autre période. Ici aussi, le f indique
que la valeur initiale moins un est rangée dans le même
registre.
 Fin
du sous-programme.
 |
 |
 |
 |
;*******************************************************************
; interruption TMR0
; appelée à chaque interruption TMR0
;******************************************************************* |
inttimer0 |
|
return |
|
; |
 |
 |
 |
 |
|
END |
|
; |
Pour des besoins de
construction de mon programme, il est nécessaire d´avoir
un sous-programme inttimer0 “bidon”,
c'est-à-dire juste avec l´instruction return.
END signale
simplement la fin des lignes de programme.
5.4. Initialisation des paramètres
Au début du
programme, j´avais volontairement sauté cette partie du
code :
 |
 |
 |
 |
;*******************************************************************
; PARAMETRES SPECIFIQUES *
;******************************************************************* |
|
BANK1 |
|
; |
|
clrf |
TRISIO |
; port en sortie |
|
bsf |
TRISIO,5 |
; sauf 5 pour déclenchement |
|
bsf |
WPU,5 |
; résistance de rappel sur le port 5 |
 |
 |
 |
 |
|
; registre controle interruptions |
|
clrf |
INTCON |
; |
|
bsf |
INTCON,GIE |
; interruptions activées en permanence |
|
bsf |
INTCON,PEIE |
; autorise interruption périphériques |
|
|
|
; (notamment Timer1) |
; registre interruptions périphériques |
|
clrf |
PIE1 |
; |
|
bsf |
PIE1,TMR1IE |
; ; autorise les interruptions Timer1 |
|
BANK0 |
|
; |
|
bcf |
GPIO,1 |
; sortie à 0 |
On va maintenant également
la passer en revue ligne par ligne, cela devrait être facile
après avoir compris le reste du programme.
Rappel : ce bout
de programme n´est exécuté qu´une seule fois,
au début du programme, avant d´entrer dans la boucle principale.
5.4.1. Pour
des raisons physiques, les registres spéciaux du microP sont
rangés dans deux endroits différents nommés BANK0 et BANK1.
Le déroulement normal du programme se fait en général
en BANK0, mais pour certains registres
particuliers comme ceux que nous allons initialiser ici, il faut passer
en BANK1. Ces deux instructions
permettent de naviguer entre les deux parties.
 |
 |
 |
 |
|
clrf |
TRISIO |
; port en sortie |
|
bsf |
TRISIO,5 |
; sauf 5 pour déclenchement |
5.4.2. Le registre TRISIO est
le registre qui permet de définir le sens des entrées/sorties,
les bits 0 à 5 correspondent aux E/S 0 à 5. Un
bit à 1 indique une E/S configurée en entrée, un
bit à zéro
une E/S en sortie. En général, il vaut mieux mettre
les E/S non utilisées en sortie, pour ne pas récupérer
de parasites.
Dans notre cas,
seule l´E/S 5 est en entrée (c'est le bouton poussoir),
les autres en sortie.
clrf est
une nouvelle instruction (Clear File), qui met à zéro
les huit bits du registre.
bsf,
déjà vu plus haut, met à 1 juste le bit 5 du registre.
 |
 |
 |
 |
|
clrf |
WPU |
; pas de résistances de rappel sauf |
|
bsf |
WPU,5 |
; résistance de rappel sur le port 5 |
 |
 |
 |
 |
; registre contrôle interruptions |
|
clrf |
INTCON |
; |
|
bsf |
INTCON,GIE |
; interruptions activées en permanence |
|
bsf |
INTCON,PEIE |
; autorise interruption périphériques |
|
|
|
; (notamment Timer1) |
5.4.4. Le registre INTCON (oui,
le “tiroir” de tout à l´heure !) commande
toutes les interruptions existantes dans le microP.
Dans notre cas,
nous mettons à 1 (on, set)
deux bits :
  le
bit GIE, qui autorise les interruptions
d´une manière générale,
  le
bit PEIE, qui autorise une catégorie
particulière d´interruptions appelés “interruptions
périphériques”, et dont le Timer1 fait
partie.
 |
 |
 |
 |
; registre interruptions périphériques |
|
clrf |
PIE1 |
; |
|
bsf |
PIE1,TMR1IE |
; autorise les interruptions Timer1 |
5.4.5. Le
registre PIE est le registre spécifique
aux interruptions périphériques. Dans notre cas nous
mettons à 1 le bit correspondant à Timer1 (TMR1IE =
Timer1 Interrupt Enabled).
Attention, tous
ces paramétrages ne sont que des paramétrages, c´est-à-dire
que l´on ne fait que préparer le microP à l´utilisation
ultérieure du timer, il ne se passe rien pour l´instant.
5.4.6. À la
fin de ces paramétrages, il ne faut pas oublier de repasser
en BANK0 pour le déroulement
du programme.
À titre de
précaution, on met la sortie haut-parleur à zéro.
D´une manière générale, il est préférable
de mettre les sorties à zéro (c'est-à-dire à la
masse) au début du programme, car les sorties peuvent être
dans une position “ indéterminée” lorsque
l´on met le courant.
5.5. Résumé des
instructions rencontrées jusqu´ici
 |
 |
Sur les 35 instructions
de notre microprocesseur, nous n´en avons finalement utilisé que
13 pour ce klaxon. |