Remarque (une nouvelle fois) pour les puristes : très souvent je ferai l´impasse sur certaines explications, et il m´arrivera même d´être à la limite de la vérité, uniquement parce que je souhaite présenter les microP de la manière la plus simple possible. Je ne parle donc que de ce qui est strictement nécessaire pour comprendre ce que nous faisons, pour le reste vous trouverez des commentaires plutôt du style “c´est comme ça et ne cherchez pas à comprendre”, car cela n´apporte rien à notre propos.
Plus tard, pour ceux que cela intéresse vraiment, il y a sur Internet des tas de bonnes présentations des microP, vous pourrez vous y reporter si vous devenez “mordus”.
Par ailleurs, installez-vous confortablement, éteignez la télé et concentrez-vous un peu. Ce qui suit n´est pas difficile, mais malheureusement on va se retrouver, comme déjà dit, avec pas mal de sigles et abréviations, toujours basés sur la langue anglaise, et de l´attention est nécessaire si on ne veut pas être perdu. N ´ayez pas peur, nous vous prenons par la main, mais il faudra peut-être quand même lire tout ça deux ou trois fois ! |
|
4.3.1. Début du programme |
Cette première
partie comprend d´abord
des commentaires généraux,
puis des éléments de paramétrages du
microP. C´est obligatoire, absolument standard (dans nos montages)
et donc oubliez tout ça.
Dans cette partie ,
on regroupe toutes les définitions des
registres généraux que nous utiliserons dans le programme
(il y en a 64 disponibles). Un registre ne peut être utilisé que
s´il est identifié ici.
Chaque registre est “nommé”, ici CPT_256, SAV_TMR1H et SAV_TMR1L, le ‘:1´ indiquant qu´un seul octet est utilisé. C´est ce nom qui sera utilisé plus loin lorsque l´on utilisera un registre. ‘CBLOCK 0x020´ et ‘ENDC´ ne sont que des indications de début et de fin des définitions.
J´avais indiqué plus
haut que notre microP comprend 35 registres spéciaux, qui servent à paramétrer
les différentes fonctions, mais que à notre niveau nous n´en
utiliserons que 3 ou 4. Il faut cependant mettre des paramètres
correspondant à nos besoins dans ces registres, valeurs qui sont
toujours les mêmes dans tous nos programmes.
La commande '#include' signifie
qu´il existe un fichier externe appelé ' 'Param_Std_12F.inc' qui
fait partie de notre programme. Le contenu de ce fichier est donc un morceau
de programme (d´une centaine de lignes), mais qui n´apparaît
pas dans notre liste d´instructions, ce qui améliore sa lisibilité (de
toute façon vous n´avez pas besoin, pour l´instant,
de savoir ce qu´il contient).
list0404
 |
 |
 |
 |
;***********************************************************************
; 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 |
;autorise les interruptions Timer1 |
|
bsf |
PIE1,TMR1IE |
|
|
BANK0 |
|
|
|
bcf |
GPIO,1 |
; sortie à 0 |
Dans cette partie , on initialise justement les registres spéciaux spécifiques à notre programme. Pour l´instant, oubliez cette partie, nous y reviendrons plus tard, je ne la laisse ici que parce que la construction du programme fait qu´elle se trouve ici.
|
4.3.2. Boucle principale |
Nous revoilà dans notre boucle principale telle que définie précédemment.
 |
 |
 |
 |
;***********************************************************************
; BouclePrincipale
;*********************************************************************** |
BouclePrincipale |
|
btfsc |
GPIO,5 |
; attente déclenchement |
|
goto |
BouclePrincipale |
; |
 |
 |
 |
 |
|
call |
SON_Tii |
; appel des sons |
|
call |
SON_Tii |
; |
|
call |
SON_Tii |
; |
|
call |
SON_Taa |
; |
|
call |
SON_Taa |
; |
|
call |
SON_Tii |
; |
|
call |
SON_Tii |
; |
 |
 |
 |
 |
|
goto |
BouclePrincipale |
; |
Si vous avez un peu de mémoire vive, cela doit quand même vous rappeler quelque chose.
Que ce passe-t-il dans ce morceau de programme ?
D´abord on teste l´entrée du bouton poussoir par btfsc GPIO,5 ! Oui ça parait incompréhensible, mais pas tant que ça :
  GPIO est un registre spécial qui contient la valeur lue (ou écrite) sur les entrées/sorties ; comme il y a 6 E/S dans mon microP, j´ai 6 bits (numérotés de 0 à 5) dans GPIO et qui me donnent l´état de mes 6 E/S.
Mon entrée, correspondant au bouton poussoir (voir le montage électronique) est la 5, je vais donc tester GPIO,5, ce qui veut dire tester le bit 5 du registre GPIO.
  Je teste par l´instruction btfsc (Bit Test File, Skip if Clear) ce qui donne en français “test d´un bit d´un registre et saut s´il est à 0”.
En clair, je vais donc tester le bit 5 du registre GPIO, et “sauter”´ s´il est à 0 (c´est-à-dire si le bouton poussoir est appuyé). Sauter dans ce cas veut simplement dire que je saute l´instruction suivante, qui est un goto. Sauter l'instruction ne veut pas dire Sauter à l'instruction !
En d´autres termes,
si mon bit est à 1 (je ne saute pas), j´exécute le goto,
c´est-à-dire que je retourne à BouclePrincipale (=
au début), sinon, si mon bit est à 0, je saute le goto,
et je me retrouve donc sur l´instruction call
SON_Tii, c´est-à-dire que je lance la séquence
d´émission des sons.
  On exécute alors l´appel des sous-programmes SON_Tii et SON_Taa, et finalement on retourne au début par le goto BouclePrincipale.
Nous avons ici le principe général de tous les tests : on teste si un bit est à 1 (Set) ou a zéro (Clear), et si oui on saute UNE instruction. Les deux instructions sont btfsc, test d´un bit à 0 (Skip if Clear) et btfss, test d´un bit à 1 (Skip if Set).
On va donc souvent retrouver la construction :
  Test du bit,
  Si le test n´est pas OK, goto pour aller ailleurs,
  Si le test est OK, suite des instructions.
Et deux instructions de plus !
 |
 |
 |
Résumé des instructions rencontrées jusqu´ici |
 |
 |
 |
Instruction |
Opérande |
Fonction |
 |
 |
 |
goto |
étiquette |
Déplace l´exécution du programme vers un autre endroit identifié par étiquette |
 |
 |
 |
call |
étiquette |
Appel un sous-programme identifié par étiquette |
 |
 |
 |
return |
pas d´opérande |
Fin de sous-programme, le programme revient à l´instruction suivant le call |
 |
 |
 |
btfsc |
registre, bit |
Test du bit bit dans le registre registre, si le bit est à 0, on saute l´instruction suivante, sinon on l´exécute |
 |
 |
 |
btfss |
registre, bit |
Test du bit bit dans le registre registre, si le bit est à 1, on saute l´instruction suivante, sinon on l´exécute |
 |
 |
 |
Vous avez suivi ? Si oui, vous avez à peu près tout compris de la programmation des microP, sinon faites ‘goto page1´ et revenez au début du texte...  |