Académique Documents
Professionnel Documents
Culture Documents
Pierre LOGLISCI
Le microcontrôleur
PIC
16F84
Edition de l’Auteur
2
Dédicace
Lorsque ce travail n’était qu’un manuscrit, mon plus grand problème fut
de savoir comment faire pour lui donner une forme dactylographique
acceptable pour être lu par tous.
Si j’y suis parvenu, c’est grâce à l’aide spontanée et constante que m’a
apportée ma fille Elodie qui - comme un guide de haute montagne - m’a
précédé dans la difficile ascension en m’ouvrant des chemins faciles et sûrs,
toujours en se mettant à ma place, dosant les difficultés à la mesure de
l’effort qu’elle savait que j’étais capable de fournir .
Sans jamais faire de concessions, elle s’est de nombreuses fois obligée à
chercher - chez elle, sur son propre PC - les solutions pratiques aux
problèmes que je lui soumettais, au fur et à mesure qu’ils se présentaient.
4
Pour son aide, bien sûr ; mais aussi pour les constants encouragements
répétés qu’elle m’a donnés, l’enthousiasme qu’elle a partagé avec moi
pendant tout le temps que j’ai consacré au projet, et son doux sourire, dont
elle m’entoure encore.
5
Avant-propos
Du contrôleur au microcontrôleur
Pour le dire avec des mots simples, un contrôleur est un dispositif
qui - placé au cœur d’un processus - surveille l’évolution d’un événement et
compare son état (ou sa valeur) à une donnée prédéterminée, pour
intervenir dès que les limites préfixées sont atteintes.
Le microcontrôleur 16F84
Présentation générale
Les Entrées/Sorties
A part les cinq pins réservées au cortège des invariants devant
nécessairement figurer dans tout montage, les treize autres pins du 16F84
servent d’entrées/sorties.
A remarquer que RB0 (pin 6) et RA4 (pin 3), outre qu’à pouvoir
servir d’entrées/sorties, selon la façon dont on les programme peuvent
respectivement servir l’une comme entrée d’interruption et l’autre comme
entrée d’horloge externe pour le pilotage du timer (TMR0).
14
1019 adresses
restantes, .
disponibles pour y loger
les instructions de
votre programme .
Dans cet espace mémoire, les cinq premières adresses (000, 001,
002, 003, et 004) sont réservées au microcontrôleur.
Pour lire dans cette mémoire, les étapes à suivre sont les suivantes :
1) on écrit l’adresse dans le registre EEADR ;
2) on met à 1 le bit 0 (RD : Read Data) du registre EECON1 (ce qui
provoque le transfert de la donnée dans le registre EEDATA) ;
3) on lit la donnée dans le registre EEDATA où elle est devenue disponible.
16
BCF STATUS,RP0
MOVLW 03
MOVWF EEADR
BSF STATUS,RP0
BSF EECON1,0
BCF STATUS,RP0
BCF STATUS,RP0
MOVLW adresse dont on veut lire le contenu
MOVWF EEADR
BSF STATUS,RP0
BSF EECON1,0
BCF STATUS,RP0
MOVF EEDATA,W
BCF STATUS,RP0
BCF INTCON,7
MOVLW donnée que l’on veut écrire
MOVWF EEDATA
MOVLW adresse
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,4
BSF EECON1,2
MOVLW 55
MOVWF EECON2
MOVLW AA
MOVWF EECON2
17
BSF EECON1,1
BCF EECON1,2
BSF INTCON,7
BCF STATUS,RP0
Cette séquence montre que pour écrire dans cette mémoire, les étapes à
suivre sont un peu plus complexes, car on est obligé de passer d’abord par
EECON2 avant de confirmer la donnée par EECON1 :
1) on interdit les interruptions ;
2) on écrit la donnée dans le registre EEDATA ;
3) on écrit l’adresse dans le registre EEADR ;
4) on configure le registre EECON1
5) on envoie la séquence définie par Microchip (55 et AA)
6) on reconfigure les registres EECON1, INTCON et STATUS.
EEDATA EQU 08
EEADR EQU 09
EECON1 EQU 88
EECON2 EQU 89
INTCON EQU 0B
BCF INTCON,7
MOVLW 13
MOVWF EEDATA
MOVLW 1F
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,4
BSF EECON1,2
MOVLW 55
MOVWF EECON2
MOVLW AA
MOVWF EECON2
BSF EECON1,1
BCF EECON1,2
BSF INTCON,7
BCF STATUS,RP0
18
Page 0 Page 1
00 Adressage indirect 80 Adressage indirect
01 TMR0 81 OPTION
02 PCL 82 PCL
03 STATUS 83 STATUS
04 FSR 84 FSR
05 PORT A 85 TRIS A
06 PORT B 86 TRIS B
07 87
08 EEDATA 88 EECON1
09 EEADR 89 EECON2
0A PCLATH 8A PCLATH
0B INTCON 8B INTCON
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
32
33
34
35
36
37
38
39
3A
20
3B
3C
3D
3E
3F
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
ORG OC
Compteur RES 3
Compteur à l’adresse 0C
Compteur+1 à l’adresse 0D
Compteur+2 à l’adresse 0E .
Ainsi, par exemple :
Lui aussi mot de 14 bits, dont les cinq premiers seulement sont utilisables :
4 3 2 1 0
CP PWRTE WDTE FOSC1 FOSC0
Nous avons dit que dans l’espace mémoire RAM que Microchip
appelle Register File, une zone est réservée aux registres spéciaux.
Bit 0 : RD (ReaD)
Normalement à 0. Il se met dans cet état de lui-même.
Le programmeur ne peut y écrire que un 1.
N’accepte pas d’être programmé à zéro.
Bit 1 : WR (WRite)
Normalement à 0. Il se met dans cet état de lui-même.
Le programmeur ne peut écrire que un 1.
N’accepte pas d’être programmé à zéro.
L’interruption peut être commandée soit par un flanc montant, soit par un
flanc descendant : cela dépend de la façon dont on a préalablement
programmé le bit 6 (INTEDG) du registre OPTION :
1 = l’interruption est générée à l’apparition d’un front
montant ;
0 = l’interruption est générée à l’apparition d’un front
descendant.
7 6 5 4 3 2 1 0
GIE EEIE TOIE INTE RBIE TOIF INTF RBIF
7 6 5 4 3 2 1 0
EEIE
31
7 6 5 4 3 2 1 0
TOIE
7 6 5 4 3 2 1 0
INTE
7 6 5 4 3 2 1 0
RBIE
7 6 5 4 3 2 1 0
RBIF
Le fonctionnement de ce flag
est conditionné par l’état du bit 3. Il ne fonctionne
que si le bit 3 a préalablement été mis à 1.
Dans la mesure où le bit 3 est à 1, ce bit passe à 1
chaque fois qu’il y a un changement d’état sur l’une
des lignes du port B (RB4, RB5, RB6 ou
RB7) par rapport à la dernière opération de lecture du
port B (dans la mesure, évidemment, où les lignes de ce
port sont configurées en entrée).
33
OPTION
7 6 5 4 3 2 1 0
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
Facteur de division
PS2 PS1 PS0
Pour le TMR0 Pour le Watch-Dog
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128
PORT A - PORT B
Alors que TRIS A et TRIS B se limitent à définir le sens de chaque
ligne des ports (entrée ou sortie), PORT A et PORT B permettent
concrètement au microcontrôleur de communiquer avec l’extérieur.
1) Comment écrire un 0 sur une ligne de port (par exemple, sur RA0) :
2) Comment écrire un 1 sur une ligne de port (par exemple, sur RA2) :
7 6 5 4 3 2 1 0
RP0 TO PD Z DC C
Bit 0 : C (Carry)
Flag indiquant si une retenue a eu lieu dans un octet lors
d’une addition ou d’une soustraction.
Si une retenue a été générée, ce bit passe à 1.
Bit 2 : Z (Zero)
Ce flag passe à 1 si le résultat d’une opération (arithmé-
tique ou logique) est 0.
Exemples de programmation :
1) BCF STATUS, RP0 (Bit Clear File STATUS Register Page 0).
Met à zéro le bit RP0 du registre
d’état. Autrement dit : sélectionne
le banc mémoire 0 (adresses 00 à
7F).
1) pour le lire :
MOVF TMR0 ,W
(porte la valeur de TMR0 dans W)
TRIS A - TRIS B
Toute ligne mise à 1 est programmée comme entrée, tandis que toute ligne
mise à zéro est programmée comme sortie.
Exemple :
Le bit 0 du port A est défini comme entrée, tandis que les sept autres lignes
sont définies comme sorties.
44
La PROGRAMMATION
Avantages :
La programmation en langage ASSEMBLEUR se fait à l’aide d’un outil de
programmation entièrement gratuit et que l’on peut diffuser librement.
Cet outil (qui est un magnifique environnement de programmation complet)
s’appelle MPLAB.
Il est disponible en téléchargement gratuit sur le site de Microchip.
Inconvénients :
Pour programmer en langage ASSEMBLEUR, il faut non seulement
connaître le fonctionnement de chaque instruction, mais aussi l’architecture
interne du microcontrôleur, la structure de sa mémoire, les adresses des
registres spéciaux, le fonctionnement de chacune de ses ressources internes,
etc..
La programmation en langage ASSEMBLEUR s’appuie sur des
organigrammes plus travaillés, et requiert plus de rigueur et de minutie.
Le programmeur doit plus faire attention aux impératifs machine qu’à la
finalité de son programme.
Distrait par le impératifs machine, le programmeur commet souvent des
erreurs.
Ces erreurs sont souvent difficiles à déceler et à corriger.
46
Avantages :
La programmation en BASIC se fait à l’aide d’un langage facile et direct
qui (bien qu’étant de l’anglais) comprend des mots puissants, si bien qu’un
programme écrit en BASIC comporte peu de mots.
Les erreurs de programmation sont plus rares, et se décèlent facilement.
L’écriture des programmes prend peu de temps.
Inconvénients :
La programmation en BASIC nécessite un COMPILATEUR
expressément conçu pour la programmation des PIC.
Il s’agit d’un produit commercial, fruit d’un travail d’équipe, et donc
payant.
Les programmes en langage BASIC, bien que très courts pour le
programmeur qui les écrit, demandent plus de place EEPROM car, vus côté
PIC, ils demandent plus d’instructions élémentaires. A tel point que parfois
un microcontrôleur pouvant contenir à l’aise un programme écrit en
langage assembleur, s’avère posséder une mémoire insuffisante s’il était
programmé en langage BASIC, pour faire la même chose.
47
3) un PROGRAMMATEUR de PIC.
Relativement simple à réaliser.
Il existe des modèles pour port série et des modèles pour port parallèle.
Je vous conseille un modèle pour port parallèle.
Cherchez un schéma sur un magazine d’Electronique, ou achetez un kit.
3) un PROGRAMMATEUR de PIC
(mêmes remarques qu’à propos des outils pour programmer
en langage ASSEMBLEUR)
Processor 16F84
Déclarations obligatoires Radix .....
Include <<P16F84>>
Initialisation de la RAM
et réservation d’un ORG 0C
certain nombre d’adresses RES ...
mémoire
Instructions
Sous programmes
PROGRAMMATION
en langage ASSEMBLEUR
XXXX
A remarquer qu’étant donné que les deux bits de poids fort (bits 12
et 13) ne peuvent prendre que seulement quatre valeurs binaires (00 - 01 -
10 et 11), il en résulte que la première valeur de toute instruction codée en
hexadécimal ne peut dépasser 3.
Autrement dit : eu égard à la première valeur de chaque instruction codée
en hexadécimal, les seuls formats possibles sont :
0XXX...
1XXX...
2XXX...
3XXX...
GOTO
NOP No OPeration
SLEEP
SUBLW SUBtract Literal with W
SUBWF SUBtract W from File
SWAPF SWAP File
- instructions d’incrémentation :
DECF
DECFSZ
INCF
INCFSZ
- instructions d’effacement :
CLRF
CLRW
CLRWDT
- instructions de mouvement :
MOVF
MOVLW
MOVWF
- instructions de rotation :
RLF
RRF
- instructions logiques :
ANDLW
ANDWF
COMF
IORLW
IORWF
XORLW
XORWF
57
- instructions diverses :
NOP
OPTION
TRIS
SLEEP
SWAPF
58
ADDWF f,d
ANDWF f,d
COMF f,d
DECF f,d
DECFSZ f,d
INCF f,d
INCFSZ f,d
IORWF f,d
MOVF f,d
RLF f,d
RRF f,d
SUBWF f,d
SWAPF f,d
XORWF f,d
60
0 1 2 3
0000 NOP 1xxx BCF 2xxx CALL 30xx MOVLW
0008 RETURN 1xxx BSF 2xxx GOTO 34xx RETLW
0009 RETFIE 1xxx BTFSC 38xx IORLW
0062 OPTION 1xxx BTFSS 39xx ANDLW
0063 SLEEP 3Axx XORLW
0064 CLWDT 3Cxx SUBLW
006x TRIS 3Exx ADDLW
00xx MOVWF
0100 CLRW
01xx CLRF
02xx SUBWF
03xx DECF
04xx IORWF
05xx ANDWF
06xx XORWF
07xx ADDWF
08xx MOVF
09xx COMF
0Axx INCF
0Bxx DECFSZ
0Cxx RRF
0Dxx RLF
0Exx SWAPF
0Fxx INCFSZ
61
ADDLW
ADD Literal to W
- 1 cycle d’horloge
- Encodage de l’instruction :
13 0
11 111x kkkk kkkk
3 E ↓↓↓↓ ↓↓↓↓
Valeur de l’octet que
l’on veut ajouter à W
(valeur pouvant aller
de 00 à FF).
- Exemple de programmation :
ADDLW 06
ADDWF
ADD W to File
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 0111 dfff ffff
0 7 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
dont le contenu est
à additionner à W.
- Exemples de programmation :
1) MOVF VentesDuMois,W
ADDWF,0
63
2) MOVF VentesDuMois,W
ADDWF,1
ANDLW
AND Literal and W
- 1 cycle d’horloge
- Encodage de l’instruction :
13 0
11 1001 kkkk kkkk
3 9 ↓↓↓↓ ↓↓↓↓
Valeur de l’octet avec
laquelle on veut
effectuer le ET logique
(valeur pouvant aller
de 00 à FF).
A B Q
0 0 0
0 1 0
1 0 0
1 1 1
65
- Exemple de programmation :
ANDLW A7
A7 = 10100111
5C = 01011100
AND = 00000100 (04 en hexa)
ANDWF
AND W and File
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 0101 dfff ffff
0 5 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
avec lequel on veut
faire le ET logique.
- Exemples de programmation :
1) ANDWF,0 Adresse
2) ANDWF,1 Adresse
67
A B Q
0 0 0
0 1 0
1 0 0
1 1 1
BCF
Bit Clear File
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
01 00bb bfff ffff
1 ↓↓ ↓↓↓↓ ↓↓↓↓
Position
du bit
dans
l’octet.
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
sur lequel on veut opérer.
110
101
100
11
10
7 0
- Exemples de programmation :
etc...
70
BSF
Bit Set File
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
01 01bb bfff ffff
1 ↓↓ ↓↓↓↓ ↓↓↓↓
Position
du bit
dans
l’octet.
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
sur lequel on veut opérer.
110
101
100
11
10
7 0
- Exemples de programmation :
etc...
72
BTFSC
Bit Test File, Skip if Clear
- Vérifie l’état logique du bit désigné de l’octet situé (en mémoire RAM) à
l’adresse indiquée de suite (adresse comprise entre 0C et 4F).
Est-il à zéro ?
S’il est à zéro, ignore l’instruction suivante.
- Encodage de l’instruction:
13 0
01 10bb bfff ffff
1 ↓↓ ↓↓↓↓ ↓↓↓↓
Position
du bit
dans
l’octet.
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
sur lequel on veut opérer.
110
101
100
11
10
7 0
73
- Organigramme du traitement :
- Exemple de programmation :
En supposant que l’octet dont on veut tester un bit soit situé à l’adresse 1A,
la programmation serait la suivante :
etc...
74
BTFSS
Bit Test File, Skip if Set
- Vérifie l’état logique du bit désigné de l’octet situé (en mémoire RAM) à
l’adresse indiquée de suite (adresse comprise entre 0C et 4F).
Est-il à 1 ?
S’il est à 1, ignore l’instruction suivante.
- Encodage de l’instruction:
13 0
01 11bb bfff ffff
1 ↓↓ ↓↓↓↓ ↓↓↓↓
Position
du bit
dans
l’octet.
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
sur lequel on veut opérer.
110
101
100
11
10
7 0
75
- Organigramme du traitement :
- Exemple de programmation :
En supposant que l’octet dont on veut tester un bit soit situé à l’adresse 1C,
la programmation serait la suivante :
etc...
76
CALL
CALL subroutine
- Appel à sous-programme.
- La pile (stack) est une zone de mémoire ne pouvant contenir que 8 mots
de 13 bits.
Ceci limite à 8 niveaux les possibilités d’imbrication. S’il y en avait un
neuvième, la première adresse de retour serait perdue...
- Encodage de l’instruction :
13 0
10 0kkk kkkk kkkk
2 ↓↓↓ ↓↓↓↓ ↓↓↓↓
Adresse de l’EEPROM
de programme à laquelle
est logé le sous-programme
(adresse comprise entre 000 et 3FF).
77
- Organigramme du traitement :
Programme principal
..................................
..................................
..................................
CALL sous-programme---------------
-->.................................. ↓
↑ .................................. ↓
↑ .................................. ↓
↑ sous-programme <----- ↓
↑ ..................................
↑ ..................................
↑<-- RETURN
- Exemple de programmation :
CLRF
CLeaR File
- 1 cycle d’horloge
- Encodage de l’instruction :
13 0
00 0001 1fff ffff
0 1 ↓↓↓ ↓↓↓↓
Adresse de la RAM
(entre 00 et 4F)
où se trouve l’octet
qu’on veut effacer.
- Exemples de programmation :
CLRW
CLeaR W
- 1 cycle d’horloge
- Encodage de l’instruction :
13 0
00 0001 xxxx xxxx
0 1 0 0
- Exemple de programmation :
CLRWDT
CLeaR Wach Dog Timer
- Met à zéro le compteur du chien de garde (ainsi que celui du pré diviseur,
si celui-ci est activé).
- 1 cycle d’horloge
- Encodage de l’instruction :
13 0
00 0000 0110 0100
0 0 6 4
- Exemple de programmation :
COMF
COMplement File
- Effectue un complément bit à bit sur l’octet situé (en mémoire RAM) à
l’adresse indiquée de suite (adresse comprise entre 0C et 4F) ; avec deux
variantes : le résultat peut être placé soit dans le registre W, soit dans la
mémoire RAM à la place de l’octet utilisé pour faire le complément (la
nouvelle valeur prend la place de l’ancienne).
Faire le complément bit à bit d’un octet équivaut à changer ses zéros en 1,
et inversement.
Exemple : le complément de 00111100 est 11000011.
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 1001 dfff ffff
0 9 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
sur lequel on veut opérer.
- Exemples de programmation :
DECF
DECrement File
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 0011 dfff ffff
0 3 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
qu’on veut décrémenter.
- Exemples de programmation :
DECFSZ
DECrement File, Skip if Zero
- Encodage de l’instruction:
13 0
00 1011 dfff ffff
0 B ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
qu’on veut décrémenter.
- Exemples de programmation :
GOTO
- Branchement inconditionnel.
Va de façon inconditionnelle à l’adresse indiquée de suite (adresse de
démarrage du sous-programme). Il peut s’agir aussi bien d’une adresse que
d’une label.
Cette instruction interrompt l’exécution séquentielle des instructions et
oblige à poursuivre le programme d’une adresse complètement ailleurs.
A la différence de l’instruction CALL (qui fait toujours revenir le
programme principal à l’endroit où il avait été abandonné) , l’instruction
GOTO provoque l’abandon complet de la séquence et peut conduire soit à
une toute autre action, soit à l’arrêt total du programme.
- Encodage de l’instruction :
13 0
10 1kkk kkkk kkkk
2 ↓↓↓ ↓↓↓↓ ↓↓↓↓
Adresse de l’EEPROM
de programme, à laquelle
le programme doit se rendre
pour poursuivre
(adresse comprise entre 005 et 3FF).
- Exemple de programmation
GOTO ALLUMAGE
INCF
INCrement File
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 1010 dfff ffff
0 A ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
qu’on veut incrémenter.
- Exemples de programmation :
INCFSZ
INCcrement File, Skip if Zero
- Encodage de l’instruction:
13 0
00 1111 dfff ffff
0 F ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
qu’on veut incrémenter.
- Exemples de programmation :
IORLW
Inclusive OR Literal with W
- 1 cycle d’horloge
- Encodage de l’instruction :
13 0
11 1000 kkkk kkkk
3 8 ↓↓↓↓ ↓↓↓↓
Valeur de l’octet avec
lequel on veut
effectuer le OU inclusif
(valeur pouvant aller
de 00 à FF).
A B Q
0 0 0
0 1 1
1 0 1
1 1 1
91
- Exemple de programmation :
IORLW B5 (10110101)
B5 = 10110101
49 = 01001001
OR = 11111101 (FD en hexa)
Une fois forcés à 1, on peut utiliser ces bits (ou l’octet) comme on veut.
92
IORWF
Inclusive OR With File
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 0100 dfff ffff
0 4 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F) où se trouve
l’octet avec lequel on veut faire le OU inclusif.
A B Q
0 0 0
0 1 1
1 0 1
1 1 1
93
- Exemples de programmation :
Une fois forcés à 1, on peut utiliser ces bits (ou l’octet) comme on veut.
94
MOVF
MOVe File
Bien que ça paraisse comique de copier le contenu d’un registre sur lui-
même, en fait - étant donné que cette opération modifie le bit Z du registre
d’état - elle est utile quand on a besoin de faire un test à zéro sur l’octet, en
toute sécurité.
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 1000 dfff ffff
0 8 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
où se trouve l’octet qu’on veut traiter.
95
- Exemples de programmation :
MOVLW
MOVe Literal to W
- 1 cycle d’horloge
- Encodage de l’instruction :
13 0
11 00xx kkkk kkkk
3 0 ↓↓↓↓ ↓↓↓↓
Valeur du literal
- Exemple de programmation :
MOVWF
MOVe W to File
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 0000 1fff ffff
0 0 ↓↓↓ ↓↓↓↓
Adresse de la RAM (entre 0C et 4F) à laquelle
on veut mettre la valeur du registre W.
- Exemple de programmation :
NOP
No OPeration
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 0000 0xx0 0000
0 0 0 0
- Exemple de programme:
NOP
99
OPTION
load OPTION register
RETFIE
RETurn From IntErrupt
- Encodage de l’instruction:
13 0
00 0000 0000 1001
0 0 0 9
- Exemple de programme :
RETFIE
101
RETLW
RETurn from subroutine with Literal in W
- Encodage de l’instruction:
13 0
11 01xx kkkk kkkk
3 4 ↓↓↓↓ ↓↓↓↓
Valeur de l’octet avec laquelle on veut
charger W en rentrant du sous-programme
(valeur pouvant aller de 00 à FF).
102
RETURN
RETURN from subroutine
- Encodage de l’instruction:
13 0
00 0000 0000 1000
0 0 0 8
103
RLF
Rotate Left File
- Rotation à gauche.
← C ← 7 6 5 4 3 2 1 0 ←
- 1 cycle d’horloge
104
- Encodage de l’instruction:
13 0
00 1101 dfff ffff
0 D ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
où se trouve l’octet dont on veut
effectuer la rotation à gauche.
105
RRF
Rotate Right File
- Rotation à droite.
→ C → 7 6 5 4 3 2 1 0 →
- 1 cycle d’horloge
106
- Encodage de l’instruction:
13 0
00 1100 dfff ffff
0 C ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
où se trouve l’octet dont on veut
effectuer la rotation à droite.
107
SLEEP
- Mise en veilleuse.
Cette instruction s’utilise non pas pour mettre le µC hors tension, mais
pour arrêter le séquencement des instructions (ralentir le signal d’horloge
jusqu’à l’extrême limite : la fréquence zéro).
Pendant cette mise en veilleuse, l’horloge externe (faisant partie de ce que
nous avons appelé le cortège des invariants) est coupée. Le flux du
programme est bloqué.
Seul le chronomètre du Watch Dog (chien de garde) reste actif.
La consommation du boîtier (qui normalement est de 2 mA) tombe à 30
µA.
Parmi les causes pouvant réveiller le µC retenons : une demande
d’interruption, ou un signal provenant du chronomètre (timer) du chien de
garde.
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 0000 0110 0011
0 0 6 3
108
SUBLW
SUBtract Literal with W
Literal diminuende
- W - diminuteur
= résultat = différence
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
11 110x kkkk kkkk
3 C ↓↓↓↓ ↓↓↓↓
Valeur de l’octet (literal)
représentant le diminuende
(valeur pouvant aller de 00 à FF).
109
SUBWF
SUBtract W from File
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 0010 dfff ffff
0 2 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
à laquelle on veut ranger la différence.
110
SWAPF
SWAP File
- Echange les quatre bits de poids fort d’un octet se trouvant (en mémoire
RAM) à l’adresse indiquée de suite (adresse comprise entre 00 et 4F), avec
ses propres quatre bits de poids faible :
1 0 0 0 1 0 1 1
devient
1 0 1 1 1 0 0 0
Avec deux variantes : le résultat de l’échange peut être placé soit dans le
registre W, soit dans la mémoire RAM en lieu et place de l’octet utilisé
pour effectuer le swap.
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 1110 dfff ffff
0 E ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
où se trouve l’octet dont on veut
échanger les quartets.
111
TRIS
TRIState port
- Encodage de l’instruction :
13 0
00 0000 0110 0fff
0 0 6 ↓↓↓
Ne peut prendre que
deux valeurs :
101 (pour désigner le port A)
110 (pour désigner le port B)
- Exemple de programmation :
A partir de ce moment le port est configuré, mais aucune donnée n’y entre,
aucune donnée n’y sort.
Les lignes du port sont mises en haute impédance (tristate).
113
XORLW
EXclusive OR Literal and W
A B Q
0 0 0
0 1 1
1 0 1
1 1 0
114
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
11 1010 kkkk kkkk
3 A ↓↓↓↓ ↓↓↓↓
Valeur de l’octet avec lequel
on veut effectuer le OU exclusif
(valeur pouvant aller de 00 à FF).
XORWF
Exclusive OR W and File
A B Q
0 0 0
0 1 1
1 0 1
1 1 0
116
- 1 cycle d’horloge
- Encodage de l’instruction:
13 0
00 0110 dfff ffff
0 6 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
où se trouve l’octet avec lequel on veut
effectuer le OU exclusif.
w = registre W (accumulateur)
Exemples de programmes
écrits en langage ASSEMBLEUR
Programme 1
a) Organigramme
119
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
RADIX HEX
INCLUDE « P16F84.INC »
__CONFIG 3FF1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEUR de RESET
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START ;Renvoi à l’adresse EEPROM 05 (hexa)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05 ;Saut introduit pour passer au-dessus
;des 5 premières adresses de la mémoire
;EEPROM (00 – 01 – 02 – 03 et 04).
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LOOP BSF PORTB,0 ;Allume la LED, car l’instruction
; « BSF » met à 1 (set).
;Dans le cas présent, elle met à 1 le
;bit zéro du Port B (PORTB,0).
Programme 2
a) Organigramme
122
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
RADIX HEX
INCLUDE « P16F84.INC »
__CONFIG 3FF1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS DES VARIABLES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
COMPT1 EQU 0C ;On met la variable COMPT1 à
;l’adresse RAM 0C.
COMPT2 EQU 0D ;On met la variable COMPT2 à
;l’adresse RAM 0D.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEUR DE RESET
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START ;Renvoi à l’adresse EEPROM 05 (hexa)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05 ;Saut introduit intentionnellement pour faire
;démarrer le programme à l’adresse EEPROM 05.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MAIN BCF PORTB,0 ;LED éteinte car l’instruction
; « BCF » met à 0 (clear).
;Ici, elle met à 0 le bit 0 du
;Port B (PORTB,0).
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SOUS-PROGRAMME de TEMPORISATION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DELAI DECFSZ COMPT1,1 ;Décrémente COMPT1et - s’il n’est pas
GOTO DELAI ;à zéro - va à DELAI
PROGRAMME 3
a) Organigramme
126
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
RADIX HEX
INCLUDE « P16F84.INC »
__CONFIG 3FF1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS DES VARIABLES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
COMPT1 EQU 0C ;On met la variable COMPT1 à
; l’adresse RAM 0C.
COMPT2 EQU 0D ; On met la variable COMPT2 à
; l’adresse RAM 0D.
nFOIS EQU 0E ; On met la variable nFOIS à
; l’adresse RAM 0E.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEUR DE RESET
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START ;Renvoi à l’adresse EEPROM 05 (hexa)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05 ;Saut introduit intentionnellement pour faire
;démarrer le programme à l’adresse EEPROM 05.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SOUS-PROGRAMME de TEMPORISATION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TEMPO MOVLW .255 ;Charge COMPT2 (« grande boucle »)
MOVWF COMPT2 ;avec la valeur décimale 255.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MAIN1 MOVLW .2 ;On définit le nombre de cycles de la
MOVWF nFOIS ;première phase (ici : 2 clignotements)
PROGRAMME 4
a) Organigramme
131
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
RADIX HEX
INCLUDE « P16F84.INC »
__CONFIG 3FF1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
STATUS EQU 03 ; Aurions pu ne pas les
RP0 EQU 05 ; déclarer, car ces
PORTA EQU 05 ; équivalences sont
PORTB EQU 06 ; définies dans le fichier
TRISA EQU 85 ; INCLUDE « P16F84.INC ».
TRISB EQU 86 ; C’est redondant. Mais ce n’est
START EQU 05 ; pas interdit.
COMPT1 EQU 0C ;On met la variable COMPT1 à
; l’adresse RAM 0C.
COMPT2 EQU 0D .On met la variable COMPT2 à
; l’adresse RAM 0D.
nFOIS EQU 0E ;On met la variable nFOIS
;à l’adresse RAM 0E.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SOUS-PROGRAMMES
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MAIN BTFSS PORTA,4 ;Est-ce que l’entrée RA4 est activée ?
END
PROGRAMME 5
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
INCLUDE « P16F84.INC »
__CONFIG 3FF1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEURS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; START
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LOOP GOTO LOOP ;Boucle introduite juste pour occuper
;le processeur, car le but du programme
;est d’attendre l’apparition du signal
;d’interruption.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME d’INTERRUPTION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
END
137
PROGRAMME 6
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
INCLUDE « P16F84.INC »
__CONFIG 3FF1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SAVE_W EQU 0C
SAVE_STAT EQU 0D ;Variables
CHOIX EQU 0E
COMPT EQU 0F
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEURS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; START
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MAIN BSF PORTB,1 ;On allume la LED (BR1) et on la
GOTO MAIN ;laisse toujours allumée, en attendant
;l’apparition d’une interruption.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME d’INTERRUPTION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
END
140
PROGRAMME 7
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
INCLUDE « P16F84.INC »
__CONFIG 3FF1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS des VARIABLES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SHIFT EQU 0C
COMPT1 EQU 0D
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEURS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START ;Renvoi à l’adresse EEPROM 05
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05 ;Saut introduit intentionnellement
;pour passer au-dessus des adresses
;EEPROM 01 – 02 – 03 – et 04,
;et obliger le programme à démarrer
;à l’adresse 05.
MOVLW .125
MOVWF COMPT1
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LOOP1 GOTO LOOP1 ;Boucle introduite pour occuper le
;processeur, car le but principal du
;programme est d’attendre l’apparition
;du signal d’interruption pour
;déclencher l’animation du chenillard.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME d’INTERRUPTION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INT_VECT MOVLW b’00000001’ ;On allume la LED
MOVWF SHIFT ;branchée sur RB0,
MOVF SHIFT,0 ;en transitant par
MOVWF PORTB ;la variable SHIFT.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SOUS-PROGRAMME de TEMPORISATION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MPLAB
- écran VGA ;
- la souris.
147
Puis acceptez encore ce qui vous est proposé dans la fenêtre qui
suit :
155
Vous arrivez enfin à la dernière fenêtre : celle qui vous dit que
maintenant tout est prêt pour que l’installation démarre de vrai !
Comme l’on sait que dans tout logiciel bien conçu plus il y a
d’outils disponibles et plus le travail est facile, la première évidence est que
MPLAB est un logiciel sympathique.
A ajouter aussi que MPLAB est un logiciel sûr, et qu’il possède plusieurs
points d’entrée.
159
MPLAB est un logiciel sûr : vous pouvez l’utiliser sans vous faire
le moindre souci, car il ne vous laissera jamais modifier ou supprimer quoi
que ce soit présentant le moindre danger pour l’intégrité des fichiers sans
vous mettre en garde et vous demander de confirmer la commande;
Créer un projet
Dans le champ File Name entrez le nom que vous voulez donner à
votre projet (nous avons convenu de l’appeler phase1) suivi de .pjt
(phase1.pjt).
Deuxième étape :
écriture du programme source
File
↓
New
Lorsque toutes les lignes du programme ont été saisies, allez dans :
File
↓
Save As...
Troisième étape:
conversion du programme source
en programme objet
Project
↓
Edit Project
170
Mais cette fois, dans la zone Project Files, figurent les noms de
deux fichiers :
- celui à extension .hex
- et celui à extension .asm
173
Project
↓
Build All
A supposer que tel soit le cas, vous devriez voir s’ouvrir la fenêtre
suivante :
Quatrième étape:
correction des erreurs
Cinquième étape:
simulation du programme
Debug
↓
Run
↓
Step
Debug
↓
Run
↓
Step Over
182
Ouverture de fenêtres
Window
↓
Watch Windows
↓
New Watch Window
186
Cette manœuvre ouvre une fenêtre comportant tous les noms des
registres et variables utilisé dans votre programme :
PROGRAMMATION
en langage BASIC
Le BASIC que nous allons utiliser est le PicBASIC élaboré par la
Société MICRO ENGINEERING Labs (représentée en France par
SELECTRONIC à Lille).
Merveilleux, non ?
Symbol
Avec la directive Symbol on peut associer un nom à une variable
ou à une pin du microcontrôleur.
Ainsi définies, telle variable ou telle pin du microcontrôleur
peuvent alors être plus facilement utilisées dans l’écriture d’un programme.
Par exemple : Symbol LED = Pin 0
Signifie : associe à Pin 0 (c’est à dire à RB0) le nom LED.
Ainsi, par exemple l’instruction :
LED = 1
est plus facile à lire dans le programme, car on comprend qu’elle allume la
LED (met au niveau logique haut la pin 0 du Port B).
Attention donc !
- Pour vous référer à l’un des 5 bits du Port A vous direz :
Pin0, Pin1, Pin2, Pin3, Pin4.
Mais la façon dont MEL PicBASIC configure les bits n’est pas la
même pour le Port A et pour le Port B.
Port A
a) Pour configurer le Port A en entrée (associé - par exemple - à
des interrupteurs) il faut premièrement s’adresser au Registre du Port A
(situé à l’adresse 5). Puis il faut définir la direction de ce Port en s’adressant
au Registre TRISA (situé à l’adresse 85).
Les bits mis à 0 deviennent des entrées. Tandis que les bits mis à 1
deviennent des sorties.
Pour configurer tout le Port A en entrée il faut donc écrire :
Symbol PORTA = 5
Symbol TRISA = $85
POKE TRISA,255 (255 = 11111111)
(Tous bits du Port A en entrée).
Port B
DIRS = X X X X X X X X
0 = entrée
1 = sortie
Exemples :
PEEK PORTA,B0
Ce qui signifie : lire le contenu du Port A et le stocker dans la
variable B0. En fait cette variable peut être l’une quelconque
des variables prédéfinies pour le 16F84 (B0... B51).
ou
etc..
196
Les constantes
- décimale
- binaire
- hexadécimale
Les labels
Les commentaires
Tout ce qui est écrit après une apostrophe est ignoré par le
compilateur.
Le set d’INSTRUCTIONS du
MEL PicBASIC
- GOTO
- Goto
- goto
- GoTO
- goTO
- gOto
- etc...
200
BRANCH
Cette instruction est une variante de GOTO.
Comme GOTO, elle permet de sauter à des sous-programmes.
Mais ici en fonction de la valeur prise par la variable donnée en offset.
SYNTAXE :
BRANCH offset (Label1, Label2, ... )
Si offset vaut 0, le programme saute à Label1
S’il vaut 1, le programme saute à Label2
et ainsi de suite..
EXEMPLE :
BRANCH B5 (Label1, Label2, Label3)
Si B5 vaut 0, le programme fait un GOTO au sous-programme
appelé Label1.
S’il vaut1, le programme fait un GOTO au sous-programme
appelé Label2.
S’il vaut2, le programme fait un GOTO au sous-programme
appelé Label3.
BUTTON
Cette instruction lit l’état d’un interrupteur placé sur l’une des 8
lignes (0.....7) du Port B (RB) et peut :
- déclencher une procédure d’anti-rebonds
- déclencher une procédure d’auto-répétition
- tester si l’interrupteur ferme vers la masse ou vers le +
- faire un GOTO à un sous-programme, selon que l’interrupteur
soit ouvert ou fermé.
SYNTAXE :
BUTTON Pin, Down, Delay, Rate, Var, Action, Label
Nom du sous-programme
auquel il faut sauter.
EXEMPLE :
BUTTON 2, 0, 100, 10, B0, 0, CLIGNOTE
Lit l’état de l’interrupteur placé sur RB2 (en supprimant les
rebonds des contacts) et – si l’interrupteur est ouvert – saute au
sous-programme appelé CLIGNOTE.
205
CALL
SYNTAXE :
CALL Label
EXEMPLE :
CALL DELAI
DELAI DECFSZ COMPT1,1
GOTO DELAI
MOVLW .255
MOVWF COMPT1
DECFSZ COMPT2,1
GOTO DELAI
MOVLW .255
MOVWF COMPT1
MOVLW .255
MOVWF COMPT2
RETURN
206
DEBUG
DIRS
SYNTAXE :
DIRS = X X X X X X X X
(octet de configuration)
(0.......255)
0 = entrée
1 = sortie
EXEMPLES :
1)
DIRS = 255 (255 décimal, donc 11111111 en binaire)
Cela peut s’écrire aussi :
DIRS = %11111111
Tous bits du Port B configurés en sortie
2)
DIRS = 0
Tous bits du Ports B configurés en entrée.
208
EEPROM
SYNTAXE :
EEPROM Adresse, (Donnée, Donnée, Donnée,......)
EXEMPLE :
EEPROM 8, (2, 4, 8, 16, 32, 64, 128)
END
FOR... NEXT
SYNTAXE :
FOR Variable = Début TO Fin (Pas)
.
.
. .
.
NEXT Variable
EXEMPLE :
FOR B1 = 1 TO 10
HIGH 0
PAUSE 200
LOW 0
PAUSE 200
NEXT B1
211
EXEMPLE :
LOOP
FOR B0 = 1 TO 5
FOR B1 = 1 TO 7
HIGH B1
PAUSE 10
LOW B1
PAUSE 500
NEXT B1
NEXT B0
GOTO LOOP
Puis, ça recommence.
LOOP
FOR B0 = 1 TO 5
FOR B1 = 0 TO 7
HIGH B1
PAUSE 10 Le travail...
LOW B1 que doivent faire
PAUSE 500 chacune des valeurs
NEXT B1 de B1, autant de fois...
NEXT B0 .... que chacune des valeurs de B0
GOTO LOOP
Autrement dit :
etc....
jusqu’à 7.
LOOP FOR B0 = 0 TO 7
HIGH B0
NEXT B0
END
213
GOSUB
SYNTAXE :
GOSUB Label
.
.
.
RETURN
Programme principal
DEBUT
INSTRUCTION 1
INSTRUCTION 2
INSTRUCTION 3
Sous-programme
TEMPO
INSTRUCTION a
INSTRUCTION b
INSTRUCTION c
INSTRUCTION 37 INSTRUCTION d
INSTRUCTION 38 INSTRUCTION e
GOSUB TEMPO RETURN
INSTRUCTION 40
INSTRUCTION 41
FIN
216
GOTO
SYNTAXE :
GOTO Label
EXEMPLE :
GOTO END
(Arrête le programme)
217
HIGH
SYNTAXE :
HIGH Pin
EXEMPLE :
HIGH 0
Sort un 1 sur RB0
I2Cin
SYNTAXE :
I2Cin Contrôle, Adresse, Variable
Octet composé de :
- la clé d’accès spécifique au circuit I2C utilisé,
telle qu’elle a été définie par son fabricant (sur 4 bits)
- 1 bit (celui de plus fort poids) désignant la largeur du
bus d’adresses (0 = 8 bits ; 1 = 16 bits)
- 3 bits (ceux de plus faible poids) servant à la sélection
des blocs internes (pages de 256 octets).
EXEMPLE :
I2Cin %01010000, 12, B0
Lit le contenu de l’adresse 12 et le stocke dans la variable B0.
Ce tableau donne les clés d’accès des EEPROM les plus courantes :
I2Cout
SYNTAXE :
I2Cout Contrôle, Adresse, (Valeur)
EXEMPLE :
I2Cout %01010000, 17, (42)
PAUSE 10
I2Cout %0101000, 125 (B3)
PAUSE 10
If... Then
Then est ici une sorte de Goto. C’est pourquoi après Then on doit
impérativement indiquer le nom du sous-programme auquel le programme
doit se rendre.
Si la condition est fausse, le programme continue en séquence et analyse
l’instruction suivante.
SYNTAXE :
IF Comparaison THEN Label
EXEMPLE :
IF Pin0 = 0 THEN OUVERT
IF B0 >=9 THEN PORTE
INPUT
SYNTAXE :
INPUT Pin
EXEMPLE :
INPUT 3
LET
EXEMPLE :
LET B0 = 37
LOOKdown
SYNTAXE :
LOOKDOWN Recherche, (Constante, Constante, Constante...), Index
Par exemple : si la liste des Constantes est (3, 12, 14, 27, 9) et la valeur de
Recherche est 14, Index prendra la valeur 2 puisque 14 est la troisième
constante de la liste (le décompte commence à 0).
EXEMPLE :
SERin 1, N2400, B0
LOOKDOWN B0, (″ 0123456789ABCDEF″ ), B1
SERout 0, N2400, (#B1)
Lit les caractères arrivant dans une réception série sur RB1 (pin 1
du Port B), les stocke un à la fois dans la variable B0, et fournit la
position de chacun d’eux dans la variable B1, mise ensuite en
sortie sur RB0 (pin 0 du Port B).
226
LOOKup
SYNTAXE :
LOOKUP Index, (Constante, Constante, Constante....), Variable
Nom de la variable
dans laquelle on veut
mémoriser la variable
recherchée.
EXEMPLE :
FOR B0 = 0 to 6
LOOKUP B0, (″BONJOUR″), B1
SERout 0, N2400, (B1)
NEXT B0
LOW
Cette instruction met à l’état logique bas (0) une ligne (0... 7) du
Port B (RB).
SYNTAXE :
LOW Pin
EXEMPLE :
LOW 3
NAP
SYNTAXE :
NAP Période
(0... 7)
0 18 ms
1 36 ms
2 72 ms
30 144 ms
4 288 ms
5 576 ms
6 1.152 ms
7 2.304 ms
OUTPUT
SYNTAXE :
OUTPUT Pin
EXEMPLE :
OUTPUT 3
PAUSE
Instruction introduisant une temporisation.
SYNTAXE :
PAUSE Période
EXEMPLE :
PAUSE 500
PEEK
SYNTAXE :
PEEK Adresse, Variable
EXEMPLE :
PEEK PORTA, B0
Autre EXEMPLE :
Symbol PORTA = 5
Symbol TRISA = $85
POKE TRISA, 255
PEEK PORTA, B0
IF BIT0 = 0 THEN......
IF BIT0 = 1 THEN......
PINS
Cette instruction met en sortie, sur le Port B, l’octet spécifié après
le signe =
SYNTAXE :
PINS = X X X X X X X X
Octet à spécifier.
EXEMPLES :
1) PINS = $2B
Met la valeur hexadécimale 2B (00101100) sur le Port B.
Ce qui a pour effet de mettre :
le bit 0 à 0
le bit 1 à 0
le bit 2 à 1
le bit 3 à 1
le bit 4 à 0
le bit 5 à 1
le bit 6 à 0
le bit 7 à 0.
2) PINS = B1
Met chacun des bits du Port B à l’état haut ou à l’état bas,
conformément à l’octet se trouvant dans la variable B1.
3) PINS = 255
Met à l’état haut tous les bits du Port B.
END
POKE
C’est l’instruction par laquelle on écrit une donnée à l’adresse que l’on
désigne.
SYNTAXE :
POKE Adresse, Donnée
Donnée à écrire.
EXEMPLES :
1) POKE TRISA, 0
Met 0 dans TRISA.
END
POT
SYNTAXE :
POT Pin, Echelle, Variable
Ici, en définitive, on lit des paliers. Mais la valeur qu’assume tour à tour
Variable chaque fois qu’on tourne l’axe du potentiomètre, renseigne
suffisamment sur la position de l’axe et – par là même – sur la valeur
prise par la résistance, si on connaît sa valeur de butée.
EXEMPLE :
POT 7, 255, B0
SERout 0, N2400, (#B0)
PULSin
Mesure la durée d’une impulsion arrivant sur une pin du Port B (RB).
La pin désignée est automatiquement mise en entrée.
NB : La durée est exprimée par unités de 10 µs. Autrement dit : le résultat
de la mesure est à multiplier par 10 pour avoir le nombre de microsecondes
recherché.
SYNTAXE :
PULSin Pin, Etat, Variable
( 0 ou 1 )
Définit la partie du signal dont on veut lire la durée :
1 = la partie haute
0 = la partie basse.
( 0... 7 )
Numéro de la pin du Port B (RB) qui reçoit le signal dont on veut
mesurer la durée.
Attention : seul le numéro de la pin doit être noté ( 0..... 7).
238
EXEMPLE :
PULSin 5, 1, W0
Mesure la durée de la partie haute d’une impulsion arrivant sur
RB5 et stocke le résultat dans la variable (à16 bits) W0.
PULSout
SYNTAXE :
PULSout Pin, Période
EXEMPLE :
PULSout 4, 100
Envoie sur RB4 une impulsion de 1 ms (100x10 µs).
240
PWM
Pulse With Modulation
Modulation par largeur d’impulsions
Cette instruction génère sur une pin du Port B (RB) un train d’impulsions
modulées en largeur.
241
SYNTAXE :
PWM Pin, Duty, Cycle
Temps « ON »
Rapport cyclique = ---------------------
Temps de cycle
RANDOM
SYNTAXE :
RANDOM Variable
EXEMPLE :
RANDOM W0
Génère un nombre aléatoire de 16 bits et le
stocke dans la wariable W0.
READ
SYNTAXE :
READ Adresse, Variable
RETURN
REVERSE
SYNTAXE :
REVERSE Pin
EXEMPLE :
OUTPUT 7
REVERSE 7
Met d’abord RB7 en sortie, puis inverse le sens
et met RB7 en entrée.
SERin
Serial Input
SYNTAXE :
SERIN Pin, Mode, (Qualificateur), Variable
Etant donné que les circuits d’interface RS232 (même les plus
économiques) présentent d’excellentes caractéristiques d’entrée/sortie,
les signaux peuvent être gérés par les PIC sans besoin d’un convertisseur
de niveux.
Les signaux présentés en format TTL inversé doivent être utilisés
moyennant une résistance de limitation de courant :
EXEMPLE :
LOOP SERin 7, n1200, B0
IF B0>0 THEN SORTIE
SORTIE POKE Pin3, B0
PAUSE 300
GOTO LOOP
Reçoit un signal série sur RB7, en TTL inversé, à la vitesse de
1200 Bauds, et le stocke dans la variable B0.
Si B0 contient une donnée, elle est envoyée sur la pin 3 du Port A
(RA3). On temporise 300 ms. Puis on recommence avec
l’octet suivant.
250
SERout
Serial Output
SYNTAXE :
SERout Pin, Mode, (Donnée, Donnée....)
Pin désigne le numéro (0... 7) de la pin du Port B (RB) que l’on veut
utiliser pour sortir le signal série.
Etant donné que les circuits d’interface RS232 (même les plus
économiques) présentent d’excellentes caractéristiques d’entrée/sortie,
les signaux peuvent être gérés par les PIC sans besoin d’un convertisseur
de niveux.
Les signaux présentés en format TTL inversé doivent être utilisés
moyennant une résistance de limitation de courant :
252
EXEMPLES :
SLEEP
SYNTAXE :
SLEEP Période
EXEMPLE :
SLEEP 60
Met le µC en veille pendant 1 minute (60 secondes).
254
SOUND
SYNTAXE :
SOUND Pin, (Note, Durée, Note, Durée,...)
EXEMPLES :
TOGLE
SYNTAXE :
TOGLE Pin
EXEMPLE :
LOW 0
TOGLE 0
Dans un premier temps on met RB0 à l’état bas,
puis on inverse l’état de RB0 (RB0 passe
de l’état bas à l’état haut).
257
TRISA
Exemples :
1) SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 0
On configure le Port A en sortie
2) SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 255
On configure le Port A en entrée
258
WRITE
SYNTAXE :
WRITE Adresse, Donnée
Donnée à écrire.
EXEMPLE :
WRITE 6, B0
Ecrit à l’adresse 6 la donnée se trouvant dans la variable B0.
Exemples de programmes
écrits en langage PicBASIC
Bonne programmation.
260
Programme 1
LOOP : HIGH 0
PAUSE 1000
LOW 0
PAUSE 1000
GOTO LOOP
END
La LED s’allume pendant 1 seconde (1000 ms), puis s’éteint pendant
1 seconde.
Puis le cycle recommence indéfiniment.
Pour que la LED clignote plus vite, il faut ajuster la durée de PAUSE.
Exemple :
LOOP : HIGH 0
PAUSE 100
LOW 0
PAUSE 100
GOTO LOOP
END
Dans ce cas la LED s’allume pendant 100 ms, puis s’éteint pendant 100 ms.
Puis le cycle recommence indéfiniment.
261
Programme 2
Programme 3
Programme 4
LOOP : FOR B0 = 0 TO 7
HIGH B0
NEXT B0
END
265
Programme 5
LOOP : FOR B0 = 0 TO 7
HIGH B0
PAUSE 100
LOW B0
PAUSE 900
NEXT B0
GOTO LOOP
END
266
Programme 6
Programme 7
LOOP : FOR B1 = 0 TO 7
HIGH B1
PAUSE 50
LOW B1
PAUSE 500
NEXT B1
FOR B0 = 1 TO 5
HIGH B1
PAUSE 50
LOW B1
PAUSE 50
NEXT B1
NEXT B0
GOTO LOOP
269
Programme 8
LOOP : FOR B0 = 1 TO 5
FOR B1 = 0 TO 7
HIGH B1
PAUSE 100
LOW B1
PAUSE 500
NEXT B1
NEXT B0
GOTO LOOP
END
Programme 9
DIRS = 255
LOOP : FOR B1 = 0 TO 255
PINS = B1
PAUSE 200
NEXT B1
GOTO LOOP
Dans ce programme :
- DIRS = 255 définit les 8 lignes du Port B comme sorties ;
- Le comptage se fait de 0 à 255 (décimal)
(on pourrait écrire : FOR B1 = %0 TO %11111111
ou aussi : FOR B1 = $0 TO $FF ) ;
- A chaque incrément de la valeur assumée par la variable B1
(de 0 à 255 en décimal) l’instructions PINS = B1 visualise la
valeur courante de B1 ;
- L’instruction PAUSE 200 maintient cette visualisation active
pendant 200 ms.
271
Programme 10
SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 255
B1 = 127
LOOP : PEEK PORTA, 0
PWM 3, B1, 10
IF Bit 0 = 1 THEN INC
IF Bit 1 = 1 THEN DEC
GOTO LOOP
INC : IF B1 > 250 THEN LOOP
B1 = B1 + 5
GOTO LOOP
DEC : IF B1 < 5 THEN LOOP
B1 = B1 – 5
GOTO LOOP
END
Les trois premières lignes sont des initialisations . On y dit que PORTA est
à l’adresse 5, TRISA est à l’adresse 85, et qu’on veut tous les bits du
Port A en entrée.
B1 = 127 donne à la LED une luminosité initiale moyenne (127 est à la
moitié entre 1 et 256).
PEEK PORTA, 0 lit l’état de RA0.
Puis on définit les paramètres de la PWM, avec un coefficient changeant
de 5% par coup, sur 10 cycles, et si RA0 est à 1 on incrémente la variable
B1 (en appelant le sous programme INC), tandis que si RA1 est à 1, on
décrémente la variable B1 ( en appelant le sous programme DEC).
272
Programme 11
Programme 12
Programme 13
LOOP B0 = 0
INC FOR B0 = B0 + 5
SOUND 7, (B0, 100)
NEXT B0
IF B0 > 100 THEN LOOP
GOTO INC
END
Programme 14
SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 255
LOOP : PEEK PORTA, B0
IF Bit0 = 1 THEN ZERO
IF Bit1 = 1 THEN UN
IF Bit2 = 1 THEN DEUX
IF Bit3 = 1 THEN TROIS
IF Bit4 = 1 THEN QUATRE
GOTO LOOP
ZERO : HIGH 0
GOTO LOOP
UN : HIGH 1
GOTO LOOP
DEUX : HIGH 2
GOTO LOOP
TROIS : HIGH 3
GOTO LOOP
QUATRE : HIGH 4
GOTO LOOP
END
Programme 15
SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 255
LOOP : PEEK PORTA, B0
IF Bit0 = 1 THEN 1_bip
IF Bit1 = 1 THEN 2_bips
IF Bit2 = 1 THEN 3_bips
IF Bit3 = 1 THEN 4_bips
IF Bit4 = 1 THEN 5_bips
GOTO LOOP
1_bip : SOUND 7, (100, 50)
GOTO LOOP
2_bips : SOUND 7, (100, 50, 100, 50)
GOTO LOOP
3_bips : SOUND 7, (100, 50, 100, 50, 100, 50)
GOTO LOOP
4_bips : SOUND 7, (100, 50, 100, 50, 100, 50, 100, 50)
GOTO LOOP
5_bips : SOUND 7, (100, 50, 100, 50, 100, 50, 100, 50, 100, 50)
GOTO LOOP
END
Programme 16
SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 255 (Port A en entrée)
LOOP : PEEK PORTA, B0 (Mémorise le Port A dans B0)
PAUSE 200
SERout , T2400, (B0)
GOTO LOOP
END
Programme 17
Recevoir en mode série, à 2400 Bauds, un code entrant sur la pin RB6.
Stocker le code reçu dans la variable B0.
BIBLE pour
DESASSEMBLER A LA MAIN
Version 1.00
Il est donc possible de procéder à l’inverse, c’est à dire : partir des codes
hexadécimaux et remonter aux instructions.
1) Les codes hexadécimaux qui ne figurent pas dans cette bible, sont :
- soit inexistants (exemple : 0087)
- soit illégaux ;
4) Cette bible est ma première tentative ( en quoi, je pense avoir innové car
- à ma connaissance - il n’existe rien de semblable ni en librairie ni sur le
WEB). C’est pourquoi je vous l’ai présentée comme une nouveauté
MONDIALE.
C’est la version 1.00
J’y ai consacré beaucoup de temps, et j’ai veillé à l’exactitude de chaque
code.
Cependant j’espère que vous me pardonnerez une éventuelle faute de
frappe, une omission, un double-emploi ou une bévue.
N’hésitez pas à me signaler ce qui vous paraît douteux, pour que je puisse
étudier votre proposition, éventuellement corriger, et en distribuer une
nouvelle version.
281
LEXIQUE
391
Adresse
Prenez une longue rue, avec une infinité de maisons toutes pareilles.
Ce qui les différencie est le numéro figurant au-dessus de chaque porte
(l’adresse).
Assemblage
Après avoir écrit un programme source, il faut l’assembler.
L’assemblage est une étape importante dans la phase de développement
d’un programme.
La tâche de l’assembleur est de traduire le programme source en langage
machine (programme objet), de construire la table des symboles utilisée par
le programme, d’indiquer les éventuelles erreurs et de les compter.
Directives d’assemblage
Les directives d’assemblage sont des instructions que l’on donne
exclusivement à l’assembleur. Elles ne sont pas traduites en langage
machine.
Les directives d’assemblage permettent entre autres :
392
Digit Carry
Le Digit Carry est l’un des flags du registre d’état.
C’est l’indicateur que l’on appelle retenue auxiliaire, ou retenue
intermédiaire ; c’est à dire le débordement du quartet de poids faible d’un
octet sur son quartet de poids fort.
Quartets de Quartets de
poids fort poids faible
0000 1001
+ 0000 1001
_________________
= 0001 0010
↑←↓
Include
Cette instruction inclut un fichier source dans un programme pour que
celui-ci s’y ajoute.
Cela revient à copier son contenu dans un listing, sans qu’il soit nécessaire
de réécrire une à une toutes les instructions qui le composent.
Exemple : INCLUDE « P16F84.INC »
On peut inclure un ou plusieurs fichiers, en faisant chaque fois appel à
l’instruction INCLUDE.
INCLUDE est une instruction qui s’adresse à l’assembleur ou au
compilateur.
L’effet produit par l’instruction INCLUDE est exactement le même que
celui qu’on obtiendrait si l’on écrivait – à l’endroit où celle-ci figure dans le
programme – toutes les lignes du fichier inséré.
Les instructions INCLUDE peuvent être imbriquées jusqu’à 6 niveaux.
Le nom du fichier peut être écrit de deux façons :
394
Interruption
Une interruption est un événement externe, qui se produit à un instant
aléatoire, sans préavis, qui demande au µC d’abandonner ce qu’il est en
train de faire, et de diriger toute son attention ailleurs.
Pile (Stack)
La pile (Stack) est une zone de la mémoire RAM dans laquelle sont
mémorisées les adresses de retour chaque fois qu’on fait appel à une
instruction CALL, c’est à dire chaque fois que le programme arrête
l’exécution séquentielle des instructions et se débranche pour aller exécuter
les instructions contenues dans un sous-programme.
Le vecteur de RESET
A la mise sous tension, avant d’obéir à l’une quelconque des instructions du
programmeur, le µC obéit à une instruction pré-définie par son fabricant,
que personne ne peut ni supprimer ni modifier.
Cette instruction est l’instruction RESET.
Sommaire
Copyright............................................................................... Page 2
Dédicace............................................................................... Page 3
Avant-propos........................................................................ Page 5
Du contrôleur au microcontrôleur........................................ Page 7
Le microcontrôleur 16F84................................................... Page 8
- Présentation générale...................................................... Page 8
- Brochage du PIC 16F84................................................. Page 9
- Le cortège des invariants................................................ Page 10
- Pilotage par quartz.......................................................... Page 11
- Pilotage par oscillateur RC........................................ Page 12
Les Entrées/Sorties.............................................................. Page 13
Organisation de la mémoire du PIC 16F84......................... Page 14
Les registres spéciaux.......................................................... Page 23
- EEADR........................................................................... Page 24
- EECON1......................................................................... Page 25
- EECON2......................................................................... Page 26
- EEDATA........................................................................ Page 27
- FSR File Select Register)............................................... Page 28
- INTCON (INTerrupt CONtrol)...................................... Page 29
- OPTION.......................................................................... Page 33
- PCL (Program Counter Low)......................................... Page 36
- PCLATH Program Counter LATch High)..................... Page 37
- PORTA-PORTB............................................................ Page 38
- STATUS Registre d’état).............................................. Page 40
- TMR0 (Timer 0)............................................................. Page 42
- TRISA-TRISB............................................................... Page 43
La Programmation............................................................... Page 44
- Différentes façons de programmer................................. Page 44
Avantages et inconvénients de la programmation en
langage ASSEMBLEUR................................................ Page 45
Avantages et inconvénients de la programmation en
langage BASIC............................................................... Page 46
Les outils nécessaires pour programmer en
langage ASSEMBLEUR................................................. Page 47
Les outils nécessaires pour programmer en
langage BASIC............................................................... Page 48
Structure d’un programme................................................... Page 49
Canevas d’un programme.................................................... Page 50
399