0% ont trouvé ce document utile (0 vote)
25 vues37 pages

Iptv

Iptv

Transféré par

kone1fatima2
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
25 vues37 pages

Iptv

Iptv

Transféré par

kone1fatima2
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

1- GENERALITES…………………………………………………………………………….

1-1 Du Microprocesseur au microcontrôleur

1-2 Qu’est -ce qu’un PIC ?

1-3 Les différentes familles des PICs

1-4 Identification d’un PIC

2- PRESENTATION GENERALE DU PIC 16F84A………………………………………………4

2-1 Brochage du PIC 16F84A

2-2 Architecture Interne

3-DESCRIPTION ET FONCTIONNEMENT DES PRINCIPALES PARTIES INTERNES…...6

3-1) La mémoire de programme

3-2) La mémoire EEPROM

3-3) La mémoire RAM

3-4) Les ports d’entrées / sorties

3-5) Le Watch dog

4 -ETUDE DU JEU D’INSTRUCTIONS EN ASSEMBLEUR……………………………………...13

5- LES DIRECTIVES D’ASSEMBLAGE………………………………………………….16

6- MISE EN ŒUVR E …………………………………………………………………..........16

7- APPLICATIONS……………………………………………………………………… 18-36

1
1-GENERALITES

1-1) Du microprocesseur au microcontrôleur

Le Processeur est l’élément central d’un système informatique : il interprète les


instructions et traite les données d’un programme. Il a besoin de certains éléments externes pour
fonctionner :

 Une horloge pour le cadencer (en général à quartz)


 Des mémoires (vive et morte) sont chargées de stocker le programme qui sera exécuté
ainsi que les données nécessaires et les résultats obtenus
 Des périphériques pour interagir avec le monde extérieur
Ces éléments sont reliés par 3 bus :
 Le bus d’adresses qui permet au microprocesseur de sélectionner la case mémoire
ou le périphérique auquel il veut accéder pour lire ou écrire une information
(instruction ou donnée).
 Le bus de données qui permet le transfert des informations entre différents éléments
 Le bus de contrôle qui indique si l’opération en cours est une lecture ou une
écriture, si un périphérique demande une interruption pour faire remonter une
information au processeur, etc (voir figure ci-dessous).

Bus d’adresses

ROM RAM Ports


Microprocesseur Programme Données d’E/S

Bus de données

bus de contrôle

Figure 1 : Structure d’un système à microprocesseur

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é. 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 microcontrôleurs peuvent avoir besoin de quelques composants externes
2
(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.

Il existe plusieurs fabricants de microcontrôleurs tel que INTEL, MOTOROLA, ATMEL,


PHILIPS, MICROCHIP, 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 ont un jeu
d’instructions est réduit et l’outil de développement(logiciels) est gratuit .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.

1-2 Qu’est-ce qu’une PIC ?

Une PIC n’est rien d’autre qu’un MICROCONTROLEUR, c’est à dire une unité de
traitement de l’information de type microprocesseur à laquelle on a ajouté des périphériques
internes permettant de réaliser des montages sans nécessiter l’ajout de composants externes.

La dénomination PIC est sous copyright de MICROCHIP, donc les autres fabricants sont
dans l’impossibilité d’utiliser ce terme pour leur propre microcontrôleur.

Les PICs sont des composants dits RISC (Reduce Instructions Construction Set), ou
encore composant à jeu d’instructions réduit. Pourquoi ? Et bien, sachez que plus on réduit le
nombre d’instructions, plus facile et plus rapide en est le décodage, et plus vite le composant
fonctionne.

Toutes les PICs Mid-Range ont un jeu de 35 instructions, stockent chaque instruction
dans un seul mot de programme, et exécutent chaque instruction (sauf les sauts) en 1 cycle. On
atteint donc des très grandes vitesses, et les instructions sont de plus très rapidement assimilées.

L’horloge fournie à la PIC est prédivisée par 4 au niveau de celle-ci. C’est cette base de
temps qui donne le temps d’un cycle.

Si on utilise par exemple un quartz de 4MHz, on obtient donc 1000000 de


cycles/seconde, or, comme la pic exécute pratiquement 1 instruction par cycle, hormis les sauts,
cela vous donne une puissance de l’ordre de 1 Million d’Instructions Par Seconde.

L’horloge des pics peuvent monter à 20MHz. C’est donc une vitesse de traitement plus
qu’honorable.

3
1-3 Les différentes familles des PICS

Les PICs sont subdivisés à l’heure actuelle en 3 grandes familles :


- La famille Base-Line qui utilise des mots d’instructions de 12 bits
- La famille Mid-Range qui utilise des mots d’instructions de 14 bits
- La famille High-Range qui utilise les mots d’instructions de 16 bits

1-4 Identification d’un PIC

Pour identifier un PIC, vous utiliserez simplement son numéro


Les deux premiers chiffres indiquent la famille du PIC
Vient ensuite parfois la lettre L : Celle–ci indique que le PIC peut fonctionner avec une plage de
tension beaucoup plus tolérante (2V à 5,5V).
Ensuite, vous trouvez :
-C indique que la mémoire programme est une EPROM ou plus rarement une EEPROM
-CR pour indiquer une mémoire de type ROM
ou F pour indiquer une mémoire de type FLASH
Notez à ce niveau que seule une mémoire FLASH ou EEPROM est susceptible d’être effacée,
donc n’espérez pas reprogrammer vos PICs de type CR. Pour les versions C, par exemple le
16C84 peut être reprogrammé, il s’agit d’une mémoire EEPROM.

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 d’utilisation du PIC.

EXEMPLE :
PIC 16 F 84 - 04
Fréquence maximale de fonctionnement = 4MHz

Identifie précisément le PIC

Type de mémoire programme (F = FLASH)

Famille de PIC : (16 ≡ Mid-Range)

Appellation contrôlée par Microchip.

4
2-PRESENTATION GENERALE DU PIC16F84A

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 possède huit cases pouvant contenir chacune un
bit.

2-1) Brochage du PIC16F84A


Le PIC16F84A est un circuit intégré de technologie CMOS (Complémentary Métal Oxyde
Semi-conducteur) composé de 18 broches ( figure 2)

RA2 1 18 RA1

RA3 2 17 RA0

RA4/TOCLK 3 16 OSC1/CLKIN
I
MCLR 4 15 OSC2/CLKOUT

VSS 5 PIC16F84A 14 VDD

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

5
2-2) Architecture interne simplifiée

Figure 3

6
Le PIC16F84A utilise l’architecture Harvard comme la plupart des PICS.
Elle consiste en la séparation du bus d’instructions du bus de données, ce qui permet aux
instructions d’être exécutées en un seul cycle, sauf les sauts qui en utilisent deux. Lorsqu’on
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.

3-DESCRIPTION ET FONCTIONNEMENT DES PRINCIPALES PARTIES INTERNES

3-1) La mémoire de programme


La mémoire de programme est constituée de 1K mots (1024 emplacements) de 14 bits chacun.
C’est dans cette zone que vous allez écrire votre programme. Elle est non volatile et elle est type
FLASH c’est-à-dire elle peut être programmée et effacée par l’utilisateur via un programmateur
et un PC. La technologie utilisée permet plus de 1000 cycles d’effacement et d’écriture.

 Déroulement d’un programme


A la mise sous tension, le processeur va chercher la 1ere instruction qui se trouve à l’adresse
0000 de la mémoire de programme, l’exécute puis va chercher la 2eme instruction à l’adresse
0001 ainsi de suite sauf cas de saut ou appel de sous-programme.(voir figure 4).

1FFFH

Figure 4

7
3-2) La mémoire EEPROM

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.
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 écriture 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

7FH NON INPLEMENTES FFH

Page 0 Page 1
Figure 5

Nous allons étudier les principaux registres :

 Adresse 03 et 83, STATUS registre d’état


Les cinq bits de poids faibles de ce registre sont des témoins (drapeaux ou flag en
Anglais) caractérisant le résultat de l’opération réalisée par l’UAL.
Le bit RP0 permet de sélectionner la page dans la mémoire RAM.

___ __
RP0 TO PD Z DC C

9
Si RP0 = 0 on accède à la page 0(Bank0) et si RP0 = 1 On accède à la page 1(Bank1)
__
TO ( Timer Out) : Ce bit passe à « 0 » lorsque le timer chien de garde (WDT)
atteint la fin de comptage .
__
PD ( Power Down ) : Ce bit passe à « 0 » lorsque le microcontrôleur rencontre
l’instruction particulière « Sleep »(mise en sommeil) qui détermine le mode de
mise en veille du PIC en bloquant les impulsions d’horloge nécessaires au
cadencement de tous les échanges. Le PIC attend un événement pour repartir
Z ( Zéro) : Ce bit passe à « 1 » lorsque le résultat d’une opération
arithmétique et logique est nul.
DC ( Digit Carry) : retenue sur un quartet ( 4 bits)
C ( Carry) : retenue sur un octet ( 8 bits).

 Adresse 05 , PORTA . Ce registre contient l’état des lignes du PORTA ( voir chapitre sur
les ports).
 Adresse 06 , PORTB . Ce registre contient l’état des lignes du PORTB ( voir chapitre sur
les ports).

3-4) Les ports d’entrées / sorties


Le PIC16F84A est équipé de 13 lignes d’entrées/sorties réparties en deux ports :
 Le port A : RA0 à RA4
 Le port B : RB0 à RB7
Chaque ligne peut être configurée soit en entrée, soit en sortie, et ceci indépendamment l’une de
l’autre. Les registres TRISA et TRISB permettent de les configurer. Le bit de poids faible(b0) du
registre TRISA correspond à la ligne RA0 , le bit b1 de TRISA correspond à RA1 et ainsi de
suite. Il en est de même pour le PORT B et le registre TRISB ( bit bo de TRISB correspond à
RB0 b1 à RB1 ainsi de suite). Si l’on veut placer une ligne en sortie ,il suffit de mettre le bit
correspondant dans TRISA ou TRISB à 0 ( retenez 0 comme Output =sortie) . Si l’on veut placer
une ligne en entrée ,il suffit de mettre le bit correspondant dans TRISA ou TRISB à 1 ( retenez 1
comme Input= entrée ).
Les bits des deux ports PORTA et PORTB permettent soit de lire l’état d’une ligne si celle-ci est
en entrée , soit de définir le niveau logique d’une ligne si celle-ci est en sortie.

 Particularité du PORTA : les bits b7 à b5 des registre TRISA et PORTA ne


correspondent à rien car il n’y a que 5 lignes ( RA0 à RA4) . RA4 est une ligne à drain
ouvert , cela veut dire que configurée en sortie cette broche assure 0Volt à l’état bas ,mais
qu’a l’état haut , il est nécessaire de fixer la valeur de la tension grâce à une résistance de
rappel ( pull up en anglais).
 Particularité du PORTB : il est possible de connecter de façon interne sur chaque ligne
une résistance de tirage ( pull up) dont le rôle consiste à fixer la tension de la patte (
configurée en entrée) à un niveau haut lorsque qu’aucun signal n’est appliqué sur la
patte en question . Pour connecter ces résistances, il suffit de placer le bit RBPU/ du
registre OPTION à 0.
Courant sur les pattes : les pattes peuvent drainer les courants suivants :
- Courant maximal absorbé : 25mA par patte
- Courant maximal fourni : 20mA par patte

10
3-5) Le Watch dog
a) rôles du Watch dog
Le Watchdog est destiné à vérifier qu’un programme ne s’est pas égaré dans une zone non valide
du programme, ou s’il n’est pas bloqué dans une boucle sans fin (bug du programme). Il sert
également à réveiller un PIC placé en mode SLEEP.

b) Utilisation correcte du Watch dog


b-1) La première chose à faire est de paramétrer le registre CONFIG pour la mise en
service du Watch dog afin de profiter de cette protection intégrée.
Si on indique « WDT_ON » dans un programme qui ne gère pas le Watch dog,
celui-ci redémarrera sans arrêt, et donc ne fonctionnera pas, car il ne contiendra
aucune instruction CLRWDT.
b-2) Placer plusieurs instructions CLRWDT dans le programme en s’arrangeant pour
qu’une instruction CLRWDT soit reçue dans les délais requis par le PIC, en tenant
compte du temps minimum de 7ms.
b-3) Ce qu’il ne faut pas faire :
Il ne faut jamais placer l’instruction CLRWDT dans une routine d’interruption.

11
4- ETUDE DU JEU D’INSTRUCTION EN ASSEMBLEUR

Le PIC 16F84A appartient à la famille des circuits RISC (Reduced instruction Set Computer ou
Composant à jeu d’instructions réduits)

12
Déclaration des valeurs littérales en assembleur
Binaire b’01011000’
Décimal .23 ou d’23’
Hexadécimal 0xF2 ou h’F2’

Etude détaillée des instructions en assembleur

L’instruction « GOTO » (aller à)

Cette instruction effectue ce qu’on appelle un saut inconditionnel.

Exemple

Start
goto plusloin ; le programme saute à l’instruction qui suit l’étiquette plusloin
xxxxxxx ;
xxxxxxxx
plusloin
xxxxxxxx ; instruction exécutée après le saut : le programme se poursuit ici
Remarquez que vous pouvez sauter en avant ou en arrière.

L’instruction « INCF » (INCrement File)

Cette instruction provoque l’incrémentation de l’emplacement spécifié (encore appelé File).

Syntaxe

incf f,d

Comme pour toutes les instructions que nous verrons, f représente File, c’est à dire
l’emplacement mémoire concerné pour cette opération.
d représente la Destination. Sauf spécification contraire, d vaut toujours, au choix
- 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é.

La formule est donc (f) + 1 -> (d) : Les parenthèses signifient « le contenu de »

Exemples

incf mavariable , f ; le contenu de ma variable est augmenté de 1


; le résultat est stocké dans mavariable.
incf mavariable , w ; Le contenu de mavariable est chargé dans W et
; augmenté de 1. W contient donc le contenu de
; mavariable + 1. mavariable n’est pas modifié

13
L’instruction « DECF » (DECRement File)

Décrémente l’emplacement spécifié. Le fonctionnement est strictement identique à


l’instruction précédente.

Syntaxe

Decf f , d ; (f) – 1 -> (d)

Exemples

decf mavariable , f ; décrémente mavariable, résultat dans mavariable


decf mavariable , w ; prends (mavariable) – 1 et place le résultat dans W

L’instruction « MOVLW » (MOVe Literal to W)

Cette instruction charge la valeur spécifiée (valeur littérale, ou encore valeur immédiate), dans le
registre de travail W.

Syntaxe

movlw k ; k représente une valeur de 0x00 à 0xFF.

Exemple

movlw 0x25 ; charge 0x25 dans le registre w

L’instruction « MOVF » (MOVe File)

Charge le contenu de l’emplacement spécifié dans la destination

Syntaxe

movf f , d ; (f) -> (d)

Exemple 1

movf mavariable,w ; charge le contenu de mavariable dans w.

ATTENTION

Il est impératif ici de bien faire la distinction entre movlw k et movf f,w.
Dans le premier cas, c’est la VALEUR qui est chargée dans w, dans le second c’est le
CONTENU de l’emplacement spécifié (f) qui est chargé dans w.

14
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é.

L’instruction « Movwf » (MOVe W to File)

Permet de sauvegarder le contenu du registre de travail W dans un emplacement mémoire.

Syntaxe

movwf f ; (W) -> (f)

Exemple

movlw 0x50 ; charge 0x50 dans W


movwf mavariable : mavariable contient maintenant 0x50.

L’instruction « ADDLW » (ADD Literal and W)

Cette opération permet d’ajouter une valeur littérale au contenu du registre de travail W.

Syntaxe

addlw k ; (W) + k -> (W)

Exemple

movlw .253 ; charger 253 en décimal dans W


addlw .4 ; Ajouter 4 en décimal au contenu du registre W
(4 + 253 W)

L’instruction « ADDWF » (ADD W and F)


Ne pas confondre avec l’instruction précédente. Le CONTENU du registre W est ajouté au
CONTENU du registre F
Syntaxe

addwf f , d ; (w) + (f) -> (d)

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).
15
L’instruction « SUBLW » (SUBtract W from Literal)

Attention, ici il y a un piège. L’instruction aurait du s’appeler SUBWL. En effet, on soustrait W


de la valeur littérale, et pas l’inverse.

Syntaxe

sublw k ; k – (W) -> (W)

Exemple 1

movlw 0x01 ; charger 0x01 dans W


sublw 0x02 ; soustraire W de 2
; résultat : 2 – (W) = 2-1 = 1
Exemple 2

movlw 0x02 ; charger 0x02 dans W


sublw 0x02 ; soustraire 2 – (w) = 2 –2 = 0

L’instruction « SUBWF » (SUBtract W from F)

Nous restons dans les soustractions, mais, cette fois, on soustrait le CONTENU W du
CONTENU de f et le résultat est conservé dans d.
Syntaxe

subwf f,d ; (f) – (W) -> (d)

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

L’instruction « ANDLW » (AND Literal with W)

Cette instruction effectue une opération « AND » bit à bit entre le contenu de W et la valeur
littérale qui suit.

Syntaxe

andlw k ; avec k = octet : (w) & k -> (w)

16
Exemple

movlw B’11001101’ ; charger w


andlw B’11110000’ ; effectuer un ‘and’ (&)

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

L’instruction « ANDWF » (AND W with F)


Cette instruction effectue une opération « AND » bit à bit entre le CONTENU de W et le
CONTENU du registre f et le résultat est conservé dans d.
Syntaxe

Andwf f,d ; (f) AND (w) -> (d)

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
; le résultat est conservé dans mavariable.

L’instruction « IORLW » (Inclusive OR Literal with W)

Cette instruction effectue une opération <<OU>>, c’est à dire que le bit de résultat vaudra 1 si un
des bits ou les deux bits opérandes =1.
Syntaxe

iorlw k ; (w) OU k -> (w)

Exemple

movlw 0xC3 ; charger 0xC3 dans W


iorlw 0x0F ; résultat ; (w) = 0xCF

b7 b6 b5 b4 b3 b2 b1 b0
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).

17
L’instruction « IORWF » (Inclusive OR W with File)

Cette instruction effectue un OU entre le CONTENU du registre W et le CONTENU du registre


spécifié. le résultat est conservé dans d.
Syntaxe

Iorwf f , d ; (w) OR (f) -> (d)

L’instruction « XORLW » (eXclusive OR Literal with W)

Cette instruction effectue une opération OU EXCLUSIF.


Syntaxe

xorlw k ; (w) xor k -> (w)

Exemple

movlw B’11000101’ ; charger W


xorlw B’00001111’ ; xor avec la valeur
; résultat : B ‘11001010’

b7 b6 b5 b4 b3 b2 b1 b0
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

L’instruction « XORWF » (eXclusive OR W with F)

C’est exactement la même opération que XORLW,


Syntaxe

xorwf f,d ; (w) xor (f) -> (d)


; le résultat est conservé dans d.

L’instruction « BSF » (Bit Set F)

C’est une instruction qui permet tout simplement de forcer directement un bit d’un emplacement
mémoire à 1.
Syntaxe

bsf f,b ; le bit n° b positionné dans la case mémoire (f) passe à 1


; b est évidemment compris entre 0 et 7
Exemples

bsf STATUS , RP0 ; positionne le bit RP0 à 1 dans le registre STATUS


bsf mavariable , 2 ; positionne bit 2 de (mavariable) à 1

18
L’instruction « BCF » (Bit Clear F)

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

bcf STATUS , RPO ; positionne le bit RP0 à 0 dans le registre STATUS


bcf mavariable , 2 ; positionne b2 de (mavariable) à 0

L’instruction « RLF » ( Rotate Left through Carry)

Rotation vers la gauche en utilisant le carry

Les opérations de décalage sont des opérations très souvent utilisées. Les PICs ont la particularité
de ne posséder que des opérations de ROTATION. Vous allez voir qu’avec ces opérations, on
peut très facilement réaliser des décalages.
L’opération de rotation effectue l’opération suivante : Le bit de carry C est mémorisé. Ensuite
chaque bit de l’octet est déplacé vers la gauche. L’ancien bit 7 sort de l’octet par la gauche, et
devient le nouveau carry. Le nouveau bit 0 devient l’ancien carry. Il s’agit donc d’une rotation
sur 9 bits.
Syntaxe

rlf f,d ; (f) rotation gauche avec carry-> (d)

Bit du registre STATUS affecté

Exemple1
Un petit exemple vaut mieux qu’un long discours.

bsf STATUS,C ; positionne le carry à 1


movlw B’00010111’ ; charge la valeur dans w
movwf mavariable ; initialise mavariable
rlf mavariable,f ; rotation vers la gauche

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 b0.
Le résultat reste sur 9 bits.

19
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

Si vous avez compris, le résultat sera B’00101110’, avec le carry à 0. Si le carry est à 0 au
départ, on effectue un simple décalage vers la gauche.
Prenons B’00010111 ‘, soit 23 en décimal. Décalons-le, nous obtenons B’00101110’, soit
46. Nous avons donc effectué UNE MULTIPLICATION PAR 2. Retenez ceci, cela vous sera très
utile par la suite.

L’instruction « RRF » ( Rotate Right through Carry)

Rotation vers la droite en utilisant le carry

L’opération de rotation vers la droite effectue l’opération suivante : Le bit de carry « C » est
mémorisé. Ensuite chaque bit de l’octet est déplacé vers la droite. L’ancien bit 0 sort de l’octet
par la droite, et devient le nouveau carry. L’ancien Carry devient le nouveau bit7. Il s’agit donc
également d’une rotation sur 9 bits.

Syntaxe

rrf f,d ; (f) rotation droite avec carry-> (d)

Bit du registre STATUS affecté

Exemple1

bsf STATUS,C ; positionne le carry à 1


movlw B’00010111’ ; charge la valeur dans w
movwf mavariable ; initialise mavariable
rrf mavariable,f ; rotation vers la droite

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
20
movwf mavariable ; initialise mavariable
rrf mavariable,f ; rotation vers la droite

Si vous avez compris, le résultat sera B’00001011’, avec le carry à 0.


Si le carry est à 0 au départ, on effectue un simple décalage vers la droite. Prenons B’00000100’,
soit 4 en décimal. Décalons-le vers la droite ; nous obtenons B’00000010’, soit 2 en décimal.
Nous avons donc effectué une DIVISION PAR 2.

L’instruction « BTFSC » (Bit Test F, Skip if Clear)

Traduit littéralement, cela donne : Teste le bit de l’emplacement mémoire et saute s’il vaut 0.
Il s’agit ici d’un SAUT CONDITIONNEL.

En effet, il n’y aura saut que si la condition est remplie. ON NE SAUTE QUE
l’INSTRUCTION SUIVANTE. La syntaxe ne contient pas d’adresse de saut, comme nous allons
le voir :

Syntaxe

btfsc f, b ; on teste le bit b de la mémoire (f).


; si ce bit vaut 0, on saute l’instruction suivante, sinon
; on exécute l’instruction suivante.

Exemple1

Voici un exemple dans lequel on doit exécuter une seule instruction supplémentaire si le
bit vaut 1.

btfsc STATUS,C ; tester si le bit C du registre STATUS vaut 0


bsf mavariable,2 ; non (C=1), alors bit 2 de mavariable mis à 1
xxxx ; la suite du programme est ici dans les 2 cas

Exemple 2

Que faire si les traitements diffèrent de plus d’une instruction ? Et bien, on combine les
sauts conditionnels avec les saut inconditionnels (par exemple goto).

movlw 0x12 ; charger 12 dans le registre de travail


subwf mavariable,f ; on soustrait 0x12 de mavariable
btfsc STATUS,C ; on teste si le résultat est négatif (C=0)
goto positif ; non(C=1), alors au saute au traitement des positifs
xxxx ; on poursuit ici si le résultat est vrai
L’instruction « BTFSS » (Bit Test F, Skip if Set)

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

21
btfss f, b ; on teste le bit b de la mémoire (f).
; si ce bit vaut 1, on saute l’instruction suivante, sinon
; on exécute l’instruction suivante.
xxxx ; si le bit vaut 1, ne sera pas exécutée (skip)
xxxx ; Le programme continue ici

Exemple

btfss STATUS,C ; tester si le bit C du registre STATUS vaut 1


bsf mavariable,2 ; non (C=0), alors bit 2 de mavariable mis à 1
xxxx ; si C=1 ,la suite du programme est ici

L’instruction « DECFSZ » (DECrement F, Skip if Z)

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

decfsz f, d ; (f) –1 -> (d). Saut si (d) = 0

Exemple1
movlw 3 ; charger 3 dans w
movwf compteur ; initialiser compteur
movlw 0x5 ; 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 charge la valeur obtenue dans w
L’instruction « INCFSZ » (INCrement F, Skip if Zero)

Cette instruction est strictement identique à la précédente, hormis le fait qu’on incrémente la
variable au lieu de la décrémenter.
Syntaxe

incfsz f,d ; (f) + 1 -> (d) : saut si (d) = 0

L’instruction « SWAPF » (SWAP nibbles in F)

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)

22
Exemple

movlw 0xC5 ; charger 0xC5 dans w


movwf mavariable ; placer dans mavariable
swapf mavariable , f ; (mavariable) = 0x5C

L’instruction « CALL » (CALL subroutine)


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é depuis plusieurs endroits du programme dit « principal ».
Le point de départ est mémorisé automatiquement, de sorte qu’après l’exécution du sous-
programme, le programme continue depuis l’endroit où il était arrivé. Cela paraît un peu ardu,
mais c’est simple.

Syntaxe

call étiquette : appel de la sous-routine à l’adresse étiquette.

L’instruction « RETURN » (RETURN from subroutine)

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

Return ; fin de sous-routine.


; le programme poursuit à l’adresse qui suit la ligne call.

L’instruction « RETLW » (RETurn with Literal in W)

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

retlw k ; (w) = k puis return


Exemple

test ; étiquette de début de notre sous-programme


btfss mavariable,0 ; teste le bit 0 de mavariable
retlw 0 ; si mavariable vaut 0, fin de sous-programme avec (w)=0
retlw 1 ; sinon, on sort avec (w) = 1

23
L’instruction « RETFIE » (RETurn From IntErrupt)

Cette instruction indique un retour d’interruption (nous verrons ultérieurement ce que sont les
interruptions). Cette instruction agit d’une manière identique à RETURN, excepté que les
interruptions sont remises automatiquement en service au moment du retour au programme
principal.
Syntaxe

retfie ; retour d’interruption

L’instruction « CLRF » (CLeaR F)

Cette instruction efface l’emplacement mémoire spécifié


Syntaxe

clrf f ; (f) = 0

Exemple

Clrf mavariable ; (mavariable) = 0

L’instruction « CLRW » (CLeaR W)

Cette instruction efface w.


Syntaxe

clrw ; (w) = 0

C’est une instruction qui n’est pas vraiment indispensable, car on pourrait utiliser l’instruction
« movlw 0 ».

L’instruction « CLRWDT » (CLeaR WatchDog)

Cette instruction remet à 0 le chien de garde de votre programme. Sachez cependant que c’est
un mécanisme très pratique qui permet de provoquer un reset automatique de votre PIC en cas
de plantage du programme.

Le mécanisme est simple à comprendre : il s’agit pour votre programme d’envoyer cette
instruction à intervalles réguliers. Si la commande n’est pas reçue dans le délai imparti, le PIC est
redémarré au début. C’est exactement le mécanisme utilisé par les conducteurs de train qui
doivent presser un bouton à intervalle régulier. Si le bouton n’est pas pressé, le train s’arrête. On
détecte ainsi si le conducteur est toujours correctement en train de travailler.

Syntaxe

clrwdt ; remet le timer du watchdog à 0

24
L’instruction « COMF » (COMplement F)

Effectue le complément à 1 de l’emplacement mémoire spécifié. Donc, inverse tous les bits de
l’octet désigné
Syntaxe

comf f,d ; NOT (f) -> (d)

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’

L’instruction « SLEEP » (Mise en sommeil)

Place la PIC en mode de sommeil.


Syntaxe

Sleep ; arrêt de la PIC

L’instruction « NOP » (No Operation)

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

nop ; tout simplement

5- Les directives d’assemblage


Elles servent à indiquer à l’assembleur, la méthode de travail. Ce sont donc des macros
commandes destinées à l’assembleur lui-même. Ces directives sont :

5-1 La directive ORG

ORG : définit l’adresse de l’instruction qui va suivre, utilisé pour le Reset et


l’Interruption.

Le Reset se situe à l’adresse 0x0000 et se déclare de la façon suivante :

ORG 0x0000 ; déclaration du Reset


GOTO Start

25
5-2 La directive EQU
La directive EQU permet de faire des assignations.
Les assignations se comportent comme une simple substitution. Au moment de
l’assemblage, chaque fois que l’assembleur trouve une assignation, il la remplace
automatiquement par sa valeur.
Un autre avantage est que si on remplace la valeur d’une assignation, le changement sera
effectif pour tout le programme.

Exemple : mavaleur EQU 0x0E ; mavaleur est affectée à la valeur 0x0E

La directive CBLOCK
Toute zone de variables définie par l’utilisateur commence avec la directive CBLOCK
suivie de l’adresse du début de la zone, pour placer les variables qui sont des
emplacements mémoires RAM auxquels on a donné un nom.
Dans la cartographie mémoire, on voit que la zone RAM librement utilisable commence à
l’adresse 0x0C.
La zone de variable commence avec la directive CBLOCK 0x0C, ensuite on peut utiliser
68 emplacements mémoires qui répondront à la syntaxe suivante :
Nom de la variable suivie du signe « : » suivie de la taille utilisée. Cette directive doit se
terminer avec la directive ENDC

Exemple : CBLOCK 0x00C ; début de la zone variables


w_temp :1 ; Zone de 1 octet
montableau : 8 ; zone de 8 octets

ENDC ; Fin de la zone

5-3 La directive END

Cette directive précise l’endroit où doit cesser l’assemblage de votre programme. Elle est
obligatoire dans tout programme, sous peine d’une erreur qui vous signalera que la fin de
fichier (End Of File : EOF) a été atteinte avant de rencontrer la directive END.
Toutes les instructions situées après la directive END seront tout simplement ignorées.

5-5 La directive # include


# include : signifie que le compilateur intégrera au programme le fichier qui suit.

Exemple : # include <P16F84A.inc> ; le fichier à intégrer est p16F84A.inc qui


est fourni par MPLAB. Celui-ci définit les
emplacements mémoires des registres
internes ainsi les valeurs des fusibles de
configuration etc

26
5-6 La directive CONFIG
Elle contient << les fusibles >> qui fixent le fonctionnement du PIC. C’est une directive
de configuration.

La syntaxe utilisée est alors :

Nom Valeurs Signification


possibles
CP OFF Lecture possible
(Code ON Rend impossible la lecture de la mémoire de programme FLASH et de
Protection l’EEPROM (à travers un programmateur). C’est une protection contre le
Bit) piratage industriel
PWRTE OFF Temporisation désactivée
(Power-up A la mise sous tension du microcontrôleur, lance une temporisation
Timer Enable ON d’environ 72ms durant laquelle est effectuée un RESET interne
Bit)
WDT ON Active le watchdog ( Chien de garde)
( Watchdog
Timer Enable
OFF Désactive le watchog
Bit)
RC Oscillateur de type Resistance /Condensateur
OSC Remarques : économique, réservé aux applications ou la précision de la
( Oscillator base de temps n’est pas exigée.
Selection
Bits) HS Oscillateur à Quartz haute fréquence( 10 Mhz à 20Mhz)
XT Oscillateur à Quartz moyenne fréquence( 4 Mhz à 10Mhz)
LP Oscillateur à Quartz faible fréquence < 4Mhz

Exemple : __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC

On peut configurer en utilisant la notation hexadécimale

CP CP CP CP CP CP CP CP CP CP PWRTE WDT Fosc1 Fosc0

Fosc1 Fosc0 WDT


0 0 LP oscillateur 0 : non activé (OFF)
0 1 XT oscillateur 1 : activé (NON) CP
1 0 HS oscillateur 0 : activé (ON)
1 1 RC oscillateur 1 : non activé (OFF)
PWRTE
0 : activé (ON)
1 : non activé (OFF)

27
Exemple : __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC

Ou

1 1 1 1 1 1 1 1 1 1 0 0 0 1

__ CONFIG_ H’3FF1’

5-7 LIST

Il indique le PIC utilisé.

Exemple : LIST P=16F84A ; le PIC utilisé est le 16F84A

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 :

- D’écrire le programme en langage de programmation de son choix sur un ordinateur soit avec le
logiciel MPLAB de MICROCHIP ou mickroC par exemple et le transféré dans le PIC grâce à un
logiciel tel que le WinPIC800 et un programmateur .

Enfin mettre le pic dans un montage ou il faut nécessairement :


- l’Alimenter par ses deux broches VDD(+5v) et VSS( la masse)
- fixer sa vitesse de fonctionnement à l’aide d’un quartz (voir figure 8 )ou un circuit RC( fig 9)
_____
- Mettre la broche 4 ( MCLR) à VDD mais dans ce cas pour réinitialiser , il faut couper
l’alimenter. ou élaborer un petit système pour permettre de réinitialiser le microcontrôleur sans
avoir à couper l’alimentation .( voir figure 10)

PIC16F84A 16 c1
QUARTZ avec C1=C2=22pF
15 C2

Figure8

28
C R
+VDD +VDD

PIC16F84A 16 10K PIC16F84A

FIGURE 10
Figure 9
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%

29
30
: : soit le circuit ci-dessous comprenant le microcontrôleur PIC
Application 1
16F84A.

1- Fonctionnement : si RA0=1( K ouvert) allumer leds RB3 et RB2 et éteindre RB1et RB0
Si RA0= 0( K fermé) éteindre leds RB3et RB2 et allumer RB1et RB0

Ecrire un programme en assembleur

2- Organigramme :
début

Initialisation
Configuration des ports

non oui
RA0=
1

éteindre leds RB3 et RB2 Allumer leds RB3 et RB2 et


et allumer leds RB1 et RB0 éteindre leds RB1 et RB0

31
: Soit le Schéma ci-dessous
APPLICATION 2

Ecrire un programme en assembleur qui permet de faire clignoter la LED raccordée sur RA1 à
une période de 1s à la mise sous tension du dispositif.

1- Organigramme :

DEBUT

Initialisation
( Configuration du portA)

Allumer la LED sur RA1

Temporisation 500ms

Eteindre la LED sur RA1

Temporisation 500ms

32
APPLICATION 3 : Soit le schéma ci-dessous

Ecrire un programme qui permet de faire clignoter la LED à chaque fois qu’on presse sur le
bouton poussoir raccordé sur RA3. On précise que à la mise sous tension, la LED est allumée.
Une fois qu’on presse sur le bouton poussoir, la led clignote à la période de 500ms aussi
longtemps que la pression reste maintenue.

1- Organigramme

33
APPLICATION 3 : Soit le schéma ci-dessous

Ecrire un programme qui permet d’allumer les led les unes à la suite des autres . On réalise
ainsi la fonction chenillard ( jeu de lumière). On pourra ainsi créer des animations différentes.

: Réalisation d’un compteur modulo 10 à l’aide du


APPLICATION : 4
microcontrôleur 16F84A

1- Schéma de câblage :

34
Ecrire un programme pour compter de 0 à 9 rythmé à 1s

APPLICATION 5 : Soit le schéma ci-dessous

Fonctionnement : clignotement alterné par lot de 4 leds sur le PORTB( RB0 à RB3 allumées
et RB4 à RB7 éteintes et vis-versa) avec une temporisation de 5mn. Ecrire le programme
décrivant ce fonctionnement.

35
APPLICATION 6 Soit le montage ci-dessous

Ecrire un programme qui permet de faire clignoter la led raccordée sur RB7 à une période
de 500ms en utilisant la routine d’interruption sur le débordement du Timer 0 (TMR0).

36
37

Vous aimerez peut-être aussi