Cours de Microcontroleur
Cours de Microcontroleur
Cours de Microcontroleur
3-5) Le timer
1
1-GENERALITES
Bus d’adresses
Bus de données
lecture
écriture
bus de contrôle
Le développement d’un tel système à base de microprocesseur se trouve donc pénalisé par
La nécessite de prévoir l’interconnexion de ces composants (bus , câblage,
nappes de connexion)
La place occupée physiquement par les composants
La consommation énergétique
Le cout financier
Par rapport à des systèmes électroniques à base de microprocesseurs , les microcontrôleurs
permettent de diminuer la taille en rassemblant ces éléments essentiels dans un seul circuit
intégré , la consommation électrique et le coût des produits. Un microcontrôleur est donc un
composant autonome , capable d’exécuter le programme contenu dans sa mémoire morte dès
qu’il est mis sous tension. Selon les modèles et les conditions de fonctionnement , les
2
microcontrôleurs peuvent avoir besoin de quelques composants externes (quartz ,quelques
condensateurs). Ils sont fréquemment utilisés dans les systèmes embarqués , comme les
téléphones mobiles, les jouets, l’électroménager ,les télécommandes, automobile, baladeurs,
transport aérien/ maritime/ fluvial ,récepteurs GPS ,etc
Le microcontrôleur que nous allons étudier est celui de la sociteté Americaine « Microchip »
,car par rapport aux autres fabricants , les microcontrôleurs de Microchip sont facilement
disponibles sur le marché ; leur jeu d’instruction est réduit ,gratuité des outils de
développement(logiciels) .Le prix des composants et des programmateurs sont aussi à la portée
de toutes les bourses . Ces circuits connaissent actuellement un succès que l’on peut , sans
exagérer qualifier de planétaire et sont largement utilisés dans l’industrie.
Ils sont connus sur la dénomination PIC(Peripheral Interface Controller) qui est sous copyring de
Microchip.
MICROCONTROLEUR
EXTERIEUR
3
1-2 Les différentes familles des PICS
Un composant qu’on ne peut reprogrammer est appelé O.T.P pour One Time Programming :
composant à programmation unique.
Puis vous constatez que les derniers chiffres identifient précisément le PIC.
Enfin vous verrez sur les boitiers le suffixe « -XX » dans lequel XX représente la fréquence
d’horloge maximale que le PIC peut recevoir.
EXEMPLE :
PIC 16 F 87 - 04
Fréquence maximale de fonctionnement = 4MHz
4
Le PIC16F84A est un microcontrôleur de la famille des Mid-Range .Il dispose d’un bus de
données de huit bits . Chaque registre de données dans laquelle chaque emplacement ( défini par
une adresse) possède huit cases pouvant contenir chacune un bit.
RA2 1 18 RA1
RA3 2 17 RA0
RA4/TOCLK 3 16 OSC1/CLKIN
I
MCLR 4 15 OSC2/CLKOUT
RB0/INT 6 13 RB7
RB1 7 12 RB6
RB2 8 11 RB5
RB3 9 10 RB4
Figure 2
Le PIC16F84A est composé de :
Un port A de 5 bits de RA0 ~ RA4
Un port B de 8 bits RB0 ~ RB7
chacun des bits de ces ports peut être configuré comme une entrée ou une sortie. Certaines de
ces broches ont aussi d’autres fonctions ( interruption ,timer)
deux entrées oscillateur sur lesquelles se branche l’horloge ( QUARTZ ; RC etc…)
_____
Une entrée de MCLR pour la remise à zéro.
Vss et VDD pour la masse et l’alimentation
2-3) Architecture interne simplifiée
5
Figure 3
6
utilise une architecture Harvard les mots de programme peuvent avoir une largeur (nombre de
bits) différente de celle des mots de la mémoire de données et des registres. Par exemple
pour le PIC16F84A :
- bus d’instructions : 14 bits
- bus de données : 8 bits
L’architecture classique traditionnelle est celle de von Neumann ou on utilise le même bus pour
les instructions et les données .
1FFFH
Figure 4
La mémoire EEPROM (Electrical Erasable Programmable Read Only Memory), est constituée
de 64 octets que vous pouvez lire et écrire depuis votre programme. Ces octets sont conservés
après une coupure de courant et sont très utiles pour conserver des paramètres semi permanents.
3-3) La mémoire RAM
La mémoire RAM (Random Acces Memory) est organisée en 2 pages (voir figure5). Dans
chacune des pages nous allons trouver des « cases mémoires spéciales » appelées REGISTRES
SPECIAUX.Ils permettent la configuration et la surveillance de l’etat du processeur et de ses
periphériques ; ces registres sont accessibles en lecture ou en ecriture suivant leur fonction.
Le bus d’adresse qui permet d’adresser la RAM est composé de 7 fils (voir figure3) ce qui veut
dire qu’il est capable d’adresser 128 emplacements différents . Or , chaque page de la RAM est
composée de 128 octets, le bus d’adresse ne peut donc pas accéder aux deux pages , c’est
pourquoi on utilise une astuce de programmation qui permet de diriger le bus d’adresse soit sur
la page 0 ,soit sur la page 1. Cela est réalisé grâce à un bit d’un registre spécifique( le bit RP0 du
registre STATUS) dont nous verrons le fonctionnement plus loin .
La RAM de données proprement dite se réduit donc à la zone notée GPR ( registre à usage
général ) ( voir figure5) qui s’étend de l’adresse 0Ch ( 12 en décimale ) jusqu’à 4Fh( 79
décimale) soit au total 68 registres en page 0 et autant en page 1 , mais on constate que les
données écrites en page 1 sont redirigées en page 0 cela signifie qu’au final l’utilisateur dispose
uniquement de 68 registres( donc 68 octets de mémoire vive) qui permettent le stockage de
variables ; ils sont accessibles en lecture et en ecriture par le programme ; sachant qu’ à la mise
hors tension , ces données sont perdues.
8
MEMOIRE DE DONNEES
RAM
REGISTRES
SPECIAUX
REGISTRES A
USAGE GENERAL
NON INPLEMENTES
7FH FFH
Page 0 Page 1
Figure 5
Nous allons détailler un à un les registres spéciaux et voir comment on peut accéder à la page 0
ou à la page 1 .
9
( drapeaux ou flag en Anglais) caractérisant le résultat de l’opération réalisée par l’ UAL
. Le bit RP0 est lui en lecture / écriture et c’est lui qui permet de sélectionner la page
dans la mémoire RAM .
___ __
RP0 TO PD Z DC C
GIE : ( Global Interrupt Enable) : mis à 1 autorise toutes les interruptions non masquées
par leur bit individuel
EEIE : ( EEprom Interrupt Enable) : autorise les interruptions de fin d’écriture dans
l’EEPROM
TOIE : ( Timer 0 Interrupt Enable) : autorise l’interruption provoquée par le
débordement du Timer 0
INTE : ( Interrupt Enable) : autorise l’interruption provoquée par un changement d’état
sur la broche RB0/ INT.
RBIE : ( RB Interrupt Enable) : autorise les interruptions provoquée par un changement
d’états sur l’une des broches RB4 à RB7.
Si ces bits sont mis à 1 , ils autorisent les interruptions pour les lesquels ils sont dédiés
10
Drapeaux :
TOIF : (Timer0 Interrupt Flag ) est mis à 1 en cas de débordement du timer 0
INTF ( Interrupt Flag) est mis 1 si une interruption est générée par la broche RBO/ INT
RBIF ( RB interrupt Flag) : est mis à 1si une interruption est générée par l’une des
broches RB4- RB7
Adresse 81 , OPTION
3-5) Le Timer
Dans la majeure partie des applications , il est nécessaire de contrôler le temps , afin de ne pas
occuper le microcontrôleur qu’à cette tache. On le décharge en utilisant un timer. Le PIC16F84A
dispose de deux timers, un à usage général (TMRO) et un autre utilisé pour le chien de Garde
(Watch dog ;WDT).
Le TMRO est un compteur ascendant de 8 bits qui peut être chargé sur une valeur initiale
quelconque ( voir figure 5 ci-dessous).
Figure 5
Le TMRO peut remplir deux fonctions :
12
-Temporisateur ou contrôle du temps .Son entrée d’incrémentation est alors l’horloge qui
correspond au cycle instruction (Fosc/4).Il est possible d’utiliser un pre-diviseur de fréquence que
nous verrons plus loin.
-Compteur d’événements, dans ce cas les impulsions d’entrées du timer sont fournies par la patte
RA4/ TOCK1
Le choix s’effectue grâce au bit (TOCS) du registre OPTION.
Le pic 16F84A dispose d’un pré-diviseur de fréquence qui peut être assigné soit au chien de
garde soit au TMRO ( uniquement un à la fois).L’assignation du pre-diviseur se fait grâce au bit
PSA du registre OPTION.
Suivant que le pre-diviseur est assigné au chien de garde ou au TMRO, La valeur de la pre-
division n’est pas la même, il faut donc être vigilant lors de la programmation ( voir figure 6 ).
REGISTRE OPTION
FIGURE 6
3-7) Interruptions
13
Le PIC 16F84A dispose de 4 sources d'interruptions :
- Interruption sur la broche RB0/INT
- Interruption "RB" : sur changement du niveau logique d'au moins une de ces 4 broches
: RB4, RB5, RB6 ou RB7 (port B)
- Interruption de débordement du registre TMR0 (H'FF' -> H'00')
- Interruption de fin d'écriture de l'EEPROM
INTEDG = 0 : l'interruption de la broche RB0/INT est active sur un front descendant (bit 6 du
registre OPTION_REG)
On veut donc provoquer une interruption quand on appuie sur le bouton poussoir.
Pour cela, il faut commencer par autoriser les interruptions de manière globale :
16
Le PIC 16F84A fait partie de la famille des circuits RISC ( Reduced Instruction Set Computer
ou Composant à jeu d’instructions réduits ) . Il dispose seulement 35 instructions ( voir
tableau), soit une centaine de moins que le microcontrôleur 68HC11 de MOTOROLA par
exemple.Toutes les instructions sont codées en un seul mot de 14 bits (0 à 13).
Bits
Mnémonique Opérande Explication Cycles
affectés
Instructions qui manipulent des registres
ADDWF f,d Additionne W et f 1 C,DC,Z
ANDWF f,d AND de W et f 1 Z
CLRF f Mise à 0 de f 1 Z
CLRW Mise à 0 de W 1 Z
COMF f,d Complement f 1 Z
DECF f,d Decrement f 1 Z
INCF f ,d Increment f 1 Z
IORWF f ,d Inclusive OR W with f 1 Z
MOVF f,d Deplacement de f 1 Z
MOVWF f Deplacement de W dans f 1
RLF f,d Rotation à gauche avec retenue 1 C
RRF f,d Rotation à droite avec retenue 1 C
SUBWF f,d Soustrait W de f 1 C,DC,Z
SWAPF f ,d Inversion des 4 bits haut et bas 1
XORWF f,d OU exclusif logique entre W et f 1 Z
Instructions qui manipulent des bits
BCF f,b Mise à 0 du bit b de f 1
BSF f,b Mise à 1 du bit b de f 1
Instructions qui manipulent les opérandes immédiats
ADDLW K Additionne littéral à W 1 C,DC,Z
ANDLW K AND entre Littéral et W 1 Z
IORLW K OR entre littéral et W 1 Z
MOVLW K Déplacement de littéral dans W 1 Z
SUBLW K Soustrait W de literal (K-W) 1 C,DC, Z
XORLW K OU exclusif entre literal et W
Instructions de saut
BTFSC f,b Bit Test f , Skip if Clear 1(2)
BTFSS f,b Bit Test f , Skip if Set 1(2)
DECFSZ f,d Decrement f , Skip if 0 1(2)
INCFSZ f,d Increment f, Skip if 0 1(2)
Instruments de commande et spéciales
CALL K Appel de sous programme 2
CLRWDT Mise à 0 du WDT 1 TO/ PD/
GOTO K Branchement sur une adresse 2
NOP Aucune opération 1
RETFIE Return d’une interruption 2
RETLW K Retour et charge de W avec literal 2
RETURN Retour de sous-programme 2
SLEEP Mise en mode Stanb-by ou sommeil 1 TO/ PD/
Avec f : Registre(File Register)
17
d: Destination de l’opération
K: Valeur immédiate (Littéral value)
b: Position du bit dans l’octet
a) Le registre INDF
Le registre INDF n’est pas un registre physique. L’adresser revient à adresser le registre dont
l’adresse est contenue dans le registre FSR. Il est de ce fait un pointeur. Il est situé à l’adresse
0x00.
Ce registre n’existe pas vraiment. Ce n’est qu’un procédé d’accès particulier à FSR utilisé par le
PIC pour des raisons de facilité de construction électronique interne.
b) Le registre FSR
Il est situé à l’adresse 0x04 dans les 2 banques. Il n’est donc pas nécessaire de changer de banque
pour y accéder, quelle que soit la banque en cours d’utilisation.
L’adressage indirect est un peu particulier sur les PICs, puisque c’est toujours à la même adresse
que se trouvera l’adresse de destination. Comment cela se passe t-il ?
- Premièrement, on doit écrire l’adresse pointée dans le registre FSR.
- Ensuite on accède à cette adresse pointée par le registre INDF.
On peut dire que INDF est en fait le registre FSR utilisé pour accéder à une case mémoire.
Donc quand on veut modifier une case mémoire pointée, on modifie FSR, quand on veut
connaître l’adresse d’une case pointée, on accède également à FSR. Si on veut accéder au
contenu d’une case pontée, on y accède via INDF.
18
4-2.1 L’instruction « GOTO » (aller à)
Cette instruction effectue ce qu’on appelle un saut inconditionnel, encore appelé rupture de
séquence synchrone inconditionnel.
Exemple
Start
goto plusloin ; saute à l’instruction qui suit l’étiquette plus loin
xxxxxxx
xxxxxxxx
plusloin
xxxxxxxx ; instruction exécutée après le saut : le programme se poursuit ici
Syntaxe
incf f,d
comme pour toutes les instructions que nous verrons , f représente file, c'est-à-dire
l’emplacement mémoire(Registre) concerné pour cette opération.
et d représente la destination si d est égale à :
- f( la lettre f) ou 1 : dans ce cas le résultat est stocké dans l’emplacement mémoire.
- W(la lettre W) ou 0 : dans ce cas , le résultat est laissé dans le registre de travail, et le
contenu de l’emplacement mémoire n’est pas modifié.
Exemples
Syntaxe
Exemples
Cette instruction charge la valeur spécifiée (valeur littérale, ou encore valeur immédiate), dans le
registre de travail W. On parle d’adressage immédiat ou littéral.
Syntaxe
Exemple
Syntaxe
Exemple 1
20
movf mavariable,w ; charge le contenu de mavariable dans w.
Exemple 2
movf mavariable , f
Que fait cette instruction ? si vous avez tout suivi , elle place le contenu de mavariable dans
mavariable . Dire que cela ne sert à rien est tentant mais prématuré.
En effet , si le contenu de mavariable reste bien inchangé , par contre le bit Z est positionné .
Cette instruction permet donc de vérifier si (mavariable)=0.
Syntaxe
Exemple
movlw 0x50
movwf mavariable
Cette opération permet d’ajouter une valeur littérale (adressage immédiat) au contenu du
registre de travail W.
Syntaxe
Exemple
21
movlw .253 ; charger 253 en décimal dans W
addlw .4 ; Ajouter 4.W contient 1, Z vaut 0, C vaut 1(débordement)
addlw .255 ; ajouter 255 W vaut 0, C vaut 1, Z vaut 1
Syntaxe
Exemple
movlw .12 ; charger 12 dans W
movwf mavariable ; mavariable vaut maintenant 12
movlw .25 ; charger 25 dans W
addwf mavariable,f ; résultat : (W) + (mavariable), donc 25+12, résultat = 37 sauvé
; dans mavariable (,f).
Syntaxe
Notez ici que le bit C fonctionne de manière inverse que pour l’addition . Ceci est commun à la
plupart des microcontrôleurs du marché.
Si le résultat est positif , donc pas de débordement C=1 . S’il y a débordement , C devient 0
Exemple 1
movlw 0x01 ; charger 0x01 dans W
sublw 0x02 ; soustraire W de 2
; résultat : 2 – (W) = 2-1 = 1
; Z = 0, C = 1, donc résultat positif
22
Exemple 2
movlw 0x02 ; charger 0x02 dans W
sublw 0x02 ; soustraire 2 – (w) = 2 –2 = 0
; Z = 1 , C = 1 : résultat nul
Exemple 3
movlw 0x03 ; charger 0x03 dans W
sublw 0x02 ; soustraire 2 – (W) = 2 – 3 = -1
; Z = 0, C = 0, résultat négatif
Nous restons dans les soustractions, mais cette fois, au lieu d’un adressage immédiat, nous avons
un ADRESSAGE DIRECT.
Syntaxe
Exemple
movlw 0x20 ; charger 0x20 dans w
movwf mavariable ; mettre w dans (mavariable) (0x20)
movlw 0x1F ; charger 0x1F dans w
subwf mavariable,w ; (mavariable) - (w) -> (w)
; 0x20 – 0x1F = 0x01
; résultat dans w, C=1, Z=0
movwf autrevariable ; sauver 0x01 dans une autre variable
Cette instruction effectue une opération « AND » bit à bit entre le contenu de W et la valeur
littérale qui suit.
Syntaxe
Exemple
movlw B’11001101’ ; charger w
andlw B’11110000’ ; effectuer un ‘and’ (&)
23
b7 b6 b5 b4 b3 b2 b1 b0
1 1 0 0 1 1 0 1
and 1 1 1 1 0 0 0 0
= 1 1 0 0 0 0 0 0
Rappelez-vous qu’on effectue un AND entre chaque bit de même rang . Seuls restent donc
positionnés à 1 les bits dont les opérandes valent 1. Donc , le fait d’effectuer un AND avec
La valeur B’ 11110000’ MASQUE les bits 0 à 3 , et ne laisse subsister que les bits 4 à7 .
Maintenant, vous devriez avoir bien compris. De nouveau la même opération, mais en
ADRESSAGE DIRECT.
Syntaxe
Exemple
movlw 0xC8 ; charger 0XC8 dans w
movwf mavariable ; sauver dans mavariable
movlw 0xF0 ; charger le masque
andwf mavariable,f ; (mavariable) = 0xC0 (on a éliminé le quartet faible).
Et oui, les mêmes instructions, mais pour le OU inclusif. Inclusif signifie simplement le contraire
d’exclusif, c’est à dire que le bit de résultat vaudra 1 si un des bits ou les deux bits opérandes =1.
Syntaxe
b7 b6 b5 b4 b3 b2 b1 b0
24
1 1 0 0 0 0 1 1
OR 0 0 0 0 1 1 1 1
= 1 1 0 0 1 1 1 1
Donc avec un OU Inclusif ( OR) , on peut FORCER n’importe quel bit à 1( pour rappel , avec
AND , on peut forcer n’importe quel bit à 0 ).
Syntaxe
Syntaxe
xorlw k ; (w) xor k -> (w)
Exemple
movlw B’11000101’ ; charger W
xorlw B’00001111’ ; xor avec la valeur de W
; résultat : B ‘11001010’
; les 4 bits de poids faibles ont été inversés
b7 b6 b5 b4 b3 b2 b1 b0
25
1 1 0 0 0 1 0 1
XOR 0 0 0 0 1 1 1 1
= 1 1 0 0 1 0 1 0
Remarquez que tous les bits de l’octet initial ont été inversés par chaque bit de la seconde
opérande qui étaient à 1.
Syntaxe
xorwf f,d ; (w) xor (f) -> (d)
Syntaxe
Exemples
Bsf STATUS , C ; positionne le bit C à 1 dans le registre STATUS
bsf mavariable , 2 ; positionne bit 2 de (mavariable) à 1
C’est une instruction qui permet tout simplement de forcer directement un bit d’un emplacement
mémoire à 0
Syntaxe
bcf f,b ; le bit n° b est mis à 0 dans la case mémoire (f)
; b est évidemment compris entre 0 et 7
Exemples
26
bcf STATUS , C ; positionne le bit C à 0 dans le registre STATUS
bcf mavariable , 2 ; positionne b2 de (mavariable) à 0
C b7 b6 b5 b4 b3 b2 b1 b0
f 1 0 0 0 1 0 1 1 1
rlf 0 0 0 1 0 1 1 1 1
Vous voyez que tous les bits ont été décalés vers la gauche ‘ C’ a été réintroduit dans bo . le
résultat reste sur 9 bits.
Exemple 2
bcf STATUS,C ; positionne le carry à 0
movlw b’00010111’ ; charge la valeur dans w
movwf mavariable ; initialise mavariable
rlf mavariable,f ; rotation vers la gauche
b7 b6 b5 b4 b3 b2 b1 b0 C
f 0 0 0 1 0 1 1 1 1
rrf 1 0 0 0 1 0 1 1 1
Vous voyez que tous les bits ont été décalés vers la droite ‘ C’ a été réintroduit dans b7 . le
résultat reste sur 9 bits.
Exemple 2
bcf STATUS,C ; positionne le carry à 0
movlw b’00010111’ ; charge la valeur dans w
movwf mavariable ; initialise mavariable
rrf mavariable,f ; rotation vers la droite
Si le carry est à 0 au départ et on effectue un simple décalage vers la droite. Que se passe t-il ?
Prenons B’0000100’ , soit 4 en décimal . Décalons –le , nous obtenons B’00000010’ , soit 2 en
décimal . Nous avons donc effectué une division par 2.
Traduit littéralement, cela donne : Teste le bit de l’emplacement mémoire et saute s’il vaut 0. Il
s’agit ici de votre premier saut conditionnel ou rupture séquence synchrone conditionnelle .
Il faut retenir pour tous ces types de saut , on ne saute que l’instruction suivante . En effet , la
syntaxe ne contient pas d’adresse de saut , comme nous allons le voir.
Syntaxe
Exemple 2
Traduit littéralement, cela donne : Teste le bit de l’emplacement mémoire et saute s’il vaut 1.
Toutes les remarques de l’instruction « BTFSC » restent valables.
Syntaxe
Exemple
Nous poursuivons les sauts conditionnels avec une instruction très utilisée pour créer des boucles.
Cette instruction décrémente un emplacement mémoire et saute l’instruction suivante si le
résultat de la décrémentation donne une valeur nulle.
Syntaxe
Exemple1
29
movlw 3 ; charger 3 dans w
movwf compteur ; initialiser compteur
movlw 0x05 ;charger 5 dans w
boucle ; étiquette
addwf mavariable , f ; ajouter 5 à ma variable
decfsz compteur , f ; décrémenter compteur et tester sa valeur
goto boucle ; si compteur pas 0, on boucle
movf mavariable , w ; on saute ici si compteur est 0
Je ne vais pas détailler cette instruction, car elle est strictement identique à la précédente, hormis
le fait qu’on incrémente la variable au lieu de la décrémenter.
Syntaxe
Nous pouvons traduire cette instruction par : «inverser les quartets dans F ». Cette opération
inverse simplement le quartet (demi-octet) de poids faible avec celui de poids fort.
Syntaxe
swapf f,d ; inversion des b0/b3 de (f) avec b4/b7 -> (d)
Exemple
movlw 0xC5 ; charger 0xC5 dans w
movwf mavariable ; placer dans mavariable
swapf mavariable , f ; (mavariable) = 0x5C
Cette opération effectue un saut inconditionnel vers un sous-programme. Voyons ce qu’ est un
sous programme . Et bien il s’agit tout simplement d’une partie de programme qui peut être
appelée depuis plusieurs endroits du programme dit « principal ».
Le point de départ est mémorisé automatiquement de sorte que qu’après l’exécution du sous-
programme , le programme continue depuis l’endroit ou il était arrivé. Voyez les exemples dans
la description de l’instruction « RETURN . »
30
Syntaxe
MECANISME
Lors de l’exécution de l’instruction, l’adresse de l’instruction suivante est sauvegardée sur le
sommet d’une pile ( exactement comme une pile d’assiettes ) . Lorsque la sous-routine est
terminée , l’adresse sauvegardée est retirée de la pile et placée dans le PC . Le programme
poursuit alors depuis l’endroit d’où il était parti .
Notez que si le sous-programme ( ou sous –routine) appelle lui-même un autre sous –
programme, l’adresse sera également sauvée au dessus de la pile . Attention , cette pile a une
taille limitée à 8 emplacements .Il existe aucun moyen de tester la pile , vous devez donc gérer
vos sous-programmes pour ne pas dépasser 8 emplacements , sinon votre programme se plantera.
Notez que lorsque vous sortez d’un sous –programme , l’emplacement est évidemment libéré .
La limite n’est donc pas dans le nombre de fois que vous appelez votre sous programme , mais
dans le nombre d’imbrications ( sous –programme qui en appelle un autre qui en appelle un
autre) etc.
Retour de sous-routine. Va toujours de pair avec une instruction call. Cette instruction indique la
fin de la portion de programme considérée comme sous-routine (SR). Rappelez-vous que pour
chaque instruction Call rencontrée ,votre programme devra rencontrer une instruction RETURN.
Syntaxe
Exemple
Retour de sous-routine avec valeur littérale dans W. C’est une instruction très simple : elle
équivaut à l’instruction return, mais permet de sortir d’une sous-routine avec une valeur spécifiée
dans W.
Syntaxe
Exemple
test ; étiquette de début de notre sous-programme
btfss mavariable,0 ; teste le bit 0 de mavariable
retlw 0 ; si vaut 0, fin de sous-programme avec (w)=0
retlw 1 ; sinon, on sort avec (w) = 1
Syntaxe
Syntaxe
clrf f ; (f) = 0
Exemple
Syntaxe
clrw ; (w) = 0
Syntaxe
33
Effectue le complément à 1 de l’emplacement mémoire spécifié. Donc, inverse tous les bits de
l’octet désigné .
Syntaxe
Exemple
movlw B’11001010’ ; charge valeur dans W
movwf mavariable ; initialise mavariable
comf mavariable,w ; charge l’inverse de mavariable dans W
; (W) = B’00110101’
Syntaxe
Comme vous devez être fatigués, et moi aussi, je vous présente l’instruction qui ne fait rien, qui
ne positionne rien, et qui ne modifie rien. On pourrait croire qu’elle ne sert à rien. En fait elle est
surtout utilisée pour perdre du temps.
Syntaxe
Ceci termine l’analyse des 35 instructions utilisées normalement dans les PICs.
34
Elles servent à indiquer à l’assembleur de quelle manière il doit travailler. Ce sont donc des
macro commandes destinées à l’assembleur lui-même. Ces directives sont :
ORG : définit l’adresse de l’instruction qui va suivre, utilisé pour le Reset et l’Interruption.
35
CP CP CP CP CP CP CP CP CP CP PWRTE WDT Fosc1 Fosc0
Ou
1 1 1 1 1 1 1 1 1 1 0 0 1 0
__CONFIG H’3FF2’
#DEFINE suivie par le nom que l’on désire utiliser, puis la chaîne à substituer.
36
5-7 Les macros
Une macro remplace un morceau de code souvent utilisé. Elle fonctionne comme un simple
traitement de textes. Elle se compose d’un nom écrit en première colonne, suivie par la directive
« MACRO ». Commence alors à la ligne suivante, la portion de code qui constitue la macro. La
fin de la macro est définie par la directive « ENDM » (END of Macro).
Exemple :
LIREIN MACRO
COMF PORTB , 0
ANDLW 1
ENDM
Dans cet exemple, chaque fois que la macro LIREIN sera rencontrée, elle sera remplacée au
moment de l’assemblage par ces deux lignes :
COMF PORTB , 0
ANDLW 1
La macro simplifie donc l’écriture, mais ne raccourci pas la taille du fichier à l’extension .hex
obtenu, puisse que ces deux lignes seront écrites dans le PIC.
On peut également utiliser des macros plus complexes avec des passages de paramètres.
5-9 LIST
il donne la liste des directives à l’attention du processeur.
6 -MISE EN ŒUVRE
L’utilisation et la mise en œuvre très simple des PICs les a rendus extrêmement populaire au
point que la société qui les fabrique( MICROCHIP) est en passe de devenir le leader mondial
dans le domaine des microcontrôleurs devant MOTOROLA et INTEL.Il suffit :
PIC16F84A 16 c1
QUARTZ avec C1=C2=22pF
15 C2
C3 = C4= 22pf
Figure8
C R
+VDD
PIC16F84A 16
Figure 9
38
OSCILLATEUR à circuit RC
Les valeurs recommandées par Microchip pour la résistance et le condensateur externes
sont :5kΩ ≤ Rext ≤ 100kΩ / Cext ≥ 20pF
Fréquence moyenne à 5 V et à 25°C
CEXT REXT
Fréquence Précision
5kΩ 4 ,61 MHz 25 %
20pF 10kΩ 2,66 MHz 24%
100kΩ 311 KHz 39%
5kΩ 1,34 MHz 21%
100pF 10kΩ 756 KHz 18%
100kΩ 82,8 KHz 28%
5kΩ 428 KHz 13%
300pF 10kΩ 243 KHz 13%
100kΩ 26,2 KHz 23%
+VDD
10kΩ PIC16F84A
Figure10
39