Vous êtes sur la page 1sur 37

2010

Pic 16f84

Bouajila Wajdi
Dpartement Technologies de lInformatique de DJERBA

Table des matires


I. II.
1. 2. 1. 2. a. b. c. 1. 2. 3. 4. 1. 2. 3. 1. 2. 1. 2. 3. 4. 5. 1. 2. 3. 1. 2. 3. 4. a. b. c. d. 5. 6. 1. 2. 3. 4. 1. 2. a. b.

QU'EST-CE QU'UN PIC ? .......................................................................................... 4 PIC 16F84 ................................................................................................................. 6


Brochage et fonction des pattes ...................................................................................................................... 6 Architecture gnrale ......................................................................................................................................... 7

III.

ORGANISATION DE LA MEMOIRE ........................................................................ 8


Mmoire de programme ................................................................................................................................... 8 Mmoire de donnes.......................................................................................................................................... 8 Registres gnraux ......................................................................................................................... 9 Registres spciaux SFRs .............................................................................................................. 9 Mmoire EEPROM ........................................................................................................................12

IV.

JEU D'INSTRUCTIONS .......................................................................................... 12

V.

Format gnral...................................................................................................................................................13 Exemple d'instruction le transfert ..............................................................................................................13 Liste des instructions ........................................................................................................................................15 Excution d'un progr amme notion de pipe-line ......................................................................................16

MODES D'ADRESSAGES ....................................................................................... 16

VI. VII.

Adressage immdiat .........................................................................................................................................17 Adressage direct ................................................................................................................................................17 Adressage indirect .............................................................................................................................................17

PORTS D'ENTREES/SORTIES ............................................................................. 18 COMPTEUR ............................................................................................................ 19

Port A ...................................................................................................................................................................18 Port B....................................................................................................................................................................19 Registre TMR0 ....................................................................................................................................................20 Choix de l'horloge ..............................................................................................................................................20 Pr-diviseur .........................................................................................................................................................20 Fin de comptage et interruption ....................................................................................................................21 Registres utiles la gestion de timer0 ..........................................................................................................21

VIII.

ACCES A LA MEMOIRE EEPORM ........................................................................ 22

IX.

Registres utiliss ................................................................................................................................................22 Lecture .................................................................................................................................................................23 Ecriture.................................................................................................................................................................23

INTERRUPTIONS .................................................................................................. 23

X.

Diffrentes sources d'interruption ................................................................................................................24 Validation des interruptions ...........................................................................................................................25 Squence de dtournement vers le sous-programme d'interruption ...................................................25 Sauvegarde et restitution du contexte .........................................................................................................26 O sauvegarder ces registres ?...................................................................................................26 Comment sauvegarder ces registres ?......................................................................................27 Comment restituer ces registres ?.............................................................................................27 Rsum ...........................................................................................................................................27 Reconnaissance de l'interruption active ......................................................................................................28 Retour au programme initial...........................................................................................................................28

CHIEN DE GARDE.................................................................................................. 28

XI.

Principe ................................................................................................................................................................28 Mise en service ..................................................................................................................................................29 Gestion.................................................................................................................................................................29 Choix de la dure ...............................................................................................................................................29

MODE SOMMEIL ................................................................................................... 29

Principe ................................................................................................................................................................29 Gestion.................................................................................................................................................................29 Mise en sommeil ...........................................................................................................................29 Rveil...............................................................................................................................................30

p. 2

XII.
1. 2. 3. 4. 5.

ASTUCES DE PROGRAMMATION ....................................................................... 30


Les comparaisons ..............................................................................................................................................30 Soustraire une valeur de w ........................................................................................................................30 Les multiplications ........................................................................................................................................31 Adressage indirect pointant sur 2 zones diffrentes .......................................................................33 Les tableaux en mmoire programme ...................................................................................................34

XIII.

BIBLIOGRAPHIE ................................................................................................... 37

p. 3

I. Qu'est-ce qu'un PIC ?


Un PIC est un microcontrleur de chez Microchip. Ses caractristiques principales sont : Sparation des mmoires de programme et de donnes (architecture Harvard) : On obtient ainsi une meilleure bande passante et des instructions et des donnes pas forcment codes sur le mme nombre de bits. Communication avec l'extrieur seulement par des ports : il ne possde pas de bus d'adresses, de bus de donnes et de bus de contrle comme la plupart des microprocesseurs. Utilisation d'un jeu d'instructions rduit, d'o le nom de son architecture : RISC (Reduced Instructions Set Construction). Les instructions sont ains i codes sur un nombre rduit de bits, ce qui acclre l'excution (1 cycle machine par instruction sauf pour les sauts qui requirent 2 cycles). En revanche, leur nombre limit oblige se restreindre des instructions basiques, contrairement aux systmes d'architecture CISC (Complex Instructions Set Construction) qui proposent plus d'instructions donc codes sur plus de bits mais ralisant des traitements plus complexes. Il existe trois familles de PIC : Base-Line : Les instructions sont codes sur 12 bits Mid-Line : Les instructions sont codes sur 14 bits High-End : Les instructions sont codes sur 16 bits Un PIC est identifi par un numro de la forme suivant : xx(L)XXyy zz - xx : Famille du composant (12, 14, 16, 17, 18) - L : Tolrance plus importante de la plage de tension - XX : Type de mmoire de programme C - EPROM ou EEPROM CR - PROM F - FLASH - yy : Identification - zz : Vitesse maximum du quartz Nous utiliserons un PIC 16F84 10, soit : - 16 : Mid-Line - F : FLASH - 84 : Type - 10 : Quartz 10MHz au maximum PIC10 et PIC12 Ce sont des composants rcents. Ils ont comme particularits d'tre extrmement petits (pour donner une ide, existe en botier SOT-23 6 broches de moins de 33 mm), simples et conomiques. PIC16 Composants de milieu de gamme (mid-range family). C'est la famille la plus fournie. La Famille 16F dispose dornavant de 2 sous- familles : - La sous-famille 16Fxxx (3 chiffres) est la famille la plus connue. Ses limitations au niveau du jeu d'instruction et de la pile en font un mauvais candidat l'utilisation du C, le langage d'assemblage restant le langage le

p. 4

mieux adapt cette famille en terme d'efficacit. Microchip ne fournit du reste pas de compilateur C pour cette famille. - La sous- famille 16Fxxxx( 4 chiffres) : il s'agit d'une nouvelle famille cre spcifiquement pour permettre l'utilisation du C via principalement l'ajout d'une srie d'instructions destines faciliter et amliorer la compilation. Il s'agit probablement plus d'une solution marketing permettant de rendre les 16F accessibles aux amateurs de C en leur vitant d'aller regarder du ct de la concurrence que d'une vritable innovation. En ralit, un utilisateur de langage C a avantage utiliser des 18F, ou, mieux, des Pic 16 ou 32 bits. PIC17 Gamme intermdiaire entre PIC16 et PIC18. Cette gamme n'est plus enrichie par Microchip. Elle supporte la compilation en C. PIC 18 Cette famille a un jeu d'instruction plus complet puisqu'il comprend de l'ordre de 75 instructions. Cette palette d'instructions tendue lui permet de faire fonctionner du code C compil de manire nettement plus efficace que les familles prcdentes. Le format natif de cette famille restant en 8 bits, et l'utilisation de la pile restant limite, l'utilisation du C n'est cependant pas aussi optimale que sur les familles >= 16 bits. Pour Microchip, il s'agit de la premire famille o l'utilisation du C devient envisageable, bien que les documentations continuent de privilgier l'utilisation du langage d'assemblage. On peut les utiliser avec un quartz oscillant jusqu' 64 MHz. PIC24 Cette famille est sortie en 2004. L'utilisation du C y est plus efficace que sur les familles prcdentes, du fait de l'utilisation du format 16 bits, du jeu d'instruction prvu en consquence, et de la plus grande souplesse de la pile matrielle. Quelques caractristiques remarquer : programmable avec le compilateur MPLAB C30, driv de GCC 3.3 (toutes les familles de microcontrleurs 16 bits de chez Microchip peuvent tre programmes avec ce compilateur) ; dispose d'un port JTAG. PIC32 Sortis en novembre 2007, les PIC32 sont des microcontrleurs 32 bits. Ils sont bass sur le cur MIPS M4K. dsPIC30/dsPIC33 Le dsPIC (digital signal PICs) est le premier microcontrleur de la socit Microchip qui ait une architecture 16 bits (les autres tant 8 bits). Il est adapt aux applications de traitement du signal et peut donc remplacer un DSP.

p. 5

II. Pic 16F84


Il s'agit d'un microcontrleur 8 bits 18 pattes. Principales caractristiques : - 35 instructions - Instructions codes sur 14 bits - Donnes sur 8 bits - 1 cycle machine par instruction, sauf pour les sauts (2 cycles machine) - Vitesse maximum 10 MHz soit une instruction en 400 ns (1 cycle machine = 4 cycles d'horloge) - 4 sources d'interruption - 1000 cycles d'effacement/criture pour la mmoire flash, 10.000.000 pour la mmoire de donne EEPROM

1. Brochage et fonction des pattes


La Figure II.1 montre le brochage du circuit. Les fonctions des pattes sont les suivantes : - VSS, VDD : Alimentation - OSC1,2 : Horloge - RA0-4 : Port A - RB0-7 : Port B - T0CKL : Entre de comptage - INT : Entre d'interruption - MCLR : Reset : 0V Choix du mode programmation : 12V - 14V Excution : 4.5V - 5.5V

Figure II.1 : Brochage du circuit.

p. 6

2. Architecture gnrale
La Figure II.2 prsente l'architecture gnrale du circuit. Il est constitu des lments suivants un systme d'initialisation la mise sous tension (po wer- up timer, ) un systme de gnration d'horloge partir du quartz externe (timing gnration) une unit arithmtique et logique (ALU) une mmoire flash de programme de 1k "mots" de 14 bits (III.1 - XII) un compteur de programme (program counter) et une pile (stack) un bus spcifique pour le programme (program bus) un registre contenant le code de l'instruction excuter un bus spcifique pour les donnes (data bus) une mmoire RAM contenant les SFR (III.2.2) 68 octets de donnes(III.2.1) une mmoire EEPROM de 64 octets de donnes (VIII) 2 ports d'entres/sorties (VI) un compteur (timer) (VII) un chien de garde (watchdog) (X)

Figure II.2 : Architecture gnrale du PIC 16F8X.

p. 7

III. Organisation de la mmoire


Le PIC contient de la mmoire de programme et de la mmoire de donnes. La structure Harvard des PICs fournit un accs spar chacune. Ainsi, un accs aux deux est possible pendant le mme cycle machine.

1. Mmoire de programme
C'est elle qui contient le programme excuter. Ce dernier est tlcharg pa r liaison srie (voir XII). La Figure III.1 montre l'organisation de cette mmoire. Elle contient 1k "mots" de 14 bits dans le cas du PIC 16F84, mme si le compteur de programme (PC) de 13 bits peut en adresser 8k. Il faut se mfier des adresses images ! L'adresse 0000h contient le vecteur du reset, l'adresse 0004h l'unique vecteur d'interruption du PIC. La pile contient 8 valeurs. Comme le compteur de programme, elle n'a pas d'adresse dans la plage de mmoire. Ce sont des zones rserves par le systme.

Figure III.1 : Organisation de la mmoire de programme et de la pile.

2. Mmoire de donnes
Elle se dcompose en deux parties de RAM (Figure III.2) et une zone EEPROM. La premire contient les SFRs (Special Function Registers) qui permettent de contrler les oprations sur le circuit. La seconde contient des registres gnraux, libres pour l'utilisateur. La dernire contient 64 octets. Comme nous le verrons dans le paragraphe IV, les instructions orientes octets ou bits contiennent une adresse sur 7 bits pour dsigner l'octet avec lequel l'instruction doit travailler. D'aprs la Figure III.2, l'accs au registre TRISA d'adresse 85h, par exemple, est impossible avec une adresse sur 7 bits. C'est pourquoi le constructeur a dfini deux banques. Le bit RP0

p. 8

du registre d'tat (STATUS.5) permet de choisir entre les deux. Ainsi, une adresse sur 8 bits est compose de RP0 en poids fort et des 7 bits provenant de l'instruction excuter.

Figure III.2 : Organisation de la mmoire de donnes. a. Registres gnraux Ils sont accessibles soit directement soit indirectement travers les registres FSR et INDF. b. Registres spciaux SFRs Ils permettent la gestion du circuit. Certains ont une fonction gnrale, d'autres une fonction spcifique attache un priphrique donn. La Figure III.3 donne la fonction de chacun des bits de ces registres. Ils sont situs de l'adresse 00h l'adresse 0Bh dans la banque 0 et de l'adresse 80h l'adresse 8Bh dans la banque 1. Les registres 07h et 87h n'existent pas.

p. 9

Figure III.3 : Description des SFR.

p. 10

INDF (00h - 80h) : Utilise le contenu de FSR pour l'accs indirect la mmoire. TMR0 (01h) : Registre li au compteur. PCL (02h - 82h) : Contient les poids faibles du compteur de programmes (PC). Le registre .PCLATH (0Ah-8Ah) : contient les poids forts. STATUS (03h - 83h) : Il contient l'tat de l'unit arithmtique et logique ainsi que les bits de slection des banques.( Figure III.4) FSR (04h - 84h) : Permet l'adressage indirect. PORTA (05h) : Donne accs en lecture ou criture au port A, 5 bits. Les sorties sont drain ouvert. Le bit 4 peut tre utilis en entre de comptage. PORTB (06h) : Donne accs en lecture ou criture au port B. Les sorties sont drain ouvert. Le bit 0 peut tre utilis en entre d'interruption. EEDATA (08h) : Permet l'accs aux donnes dans la mmoire EEPROM. EEADR (09h) : Permet l'accs aux adresses de la mmoire EEPROM. PCLATCH (0Ah - 8Ah) : Donne accs en criture aux bits de poids forts du compteur de programme. INTCON (0Bh - 8Bh) : Masque d'interruptions. OPTION_REG (81h) : Contient des bits de configuration pour divers priphriques. TRISA (85h) : Indique la direction (entre ou sortie) du port A. TRISB (86h) : Indique la direction (entre ou sortie) du port B. EECON1 (88h) : Permet le contrle d'accs la mmoire EEPROM. EECON2 (89h) : Permet le contrle d'accs la mmoire EEPROM. Registre STATUS

p. 11

Figure III.4 : Registre d'tai du PIC - STATUS. c. Mmoire EEPROM Le PIC possde une zone EEPROM de 64 octets accessibles en lecture et en criture par le programme. On peut y sauvegarder des valeurs, qui seront conserves mme si l'alimentation est teinte, et les rcuprer lors de la mise sous tension. Leur accs est spcifique et requiert l'utilisation de registres ddis. La lecture et l'criture ne peut s'excuter que selon des squences particulires dcrite au paragraphe VIII.

IV. Jeu d'instructions


Les PICs sont conus selon une architecture RISC. Programmer avec un nombre d'instructions rduit permet de limiter la taille de leur codage et donc de la pla ce mmoire et du temps d'excution. Le format des instructions est prsent au paragraphe IV.1. La liste des instructions est ensuite donne (IV.3) avant l'tude d'un exemple de description d'une instruction (IV.2).

p. 12

1. Format gnral

Figure IV.1 : Format gnral d'une instruction. Toutes les instructions sont codes sur 14 bits. Elles sont regroupes en trois grands types (Figure IV.1) : - Instructions orientes octets - Instructions orientes bits - Instructions de contrle Le registre de travail W joue un rle particulier dans un grand nombre d'instructions.

2. Exemple d'instruction le transfert

p. 13

Trois instructions de transfert sont disponibles sur le PIC 16F84. La premire permet de transfrer le contenu du registre W dans un registre f. On peut noter la valeur du bit 7 1 et les bits 0 6 donnant le registre concern.

La seconde permet de transfrer une donne contenue dans un registre f vers le registre W ou le registre f. Dans ce second cas, l'intrt est de positionner le bit Z. On peut noter ici le bit 7 qui prend la valeur d fournie dans le code de l'instruction pour choisir la destination : W ou f.

La dernire instruction de transfert permet de charger une constante dans le registre W. Ici, la valeur charger est donne sur 8 bits, le bit 7 n'tant pas utile puisque le code de l'instruction dit que la valeur est charger dans le registre W.

p. 14

3. Liste des instructions

Figure IV.5 : Liste des instructions.

p. 15

4. Excution d'un programme notion de pipe-line


La Figure IV.6 montre l'enchanement des instructions tous les 4 cycles d'horloge. Pendant un premier cycle machine, l'instruction excuter est stocke en mmoire RAM. Le cycle suivant, elle est excut. Chaque instruction dure donc 2 cycles machine.

Figure IV.6 : Enchanement des instructions.

La notion de pipeline permet de rduire ce temps un seul cycle machine. L'ide est d'excuter l'instruction n-1 pendant que l'instruction n est charge en mmoire RAM. Ainsi, une fois le systme enclench, pendant chaque cycle machine une instruction est charge et un autre excute. On a donc l'quivalent d'une instruction par cycle machine. La Figure IV.7 montre un exemple d'excution d'un programme. Notons que l'instruction CALL dure 2 cycles machine comme toutes les instructions de branchement.

Figure IV.7 : Pipeline du PIC.

V. Modes d'adressages
On ne peut pas concevoir un programme qui ne manipule pas de donnes. Il existe trois grands types d'accs une donne ou modes d'adressage : - Adressage immdiat (V.1) : La donne est contenue dans l'instruction. - Adressage direct (V.2) : La donne est contenue dans un registre. - Adressage indirect (V.3) : L'adresse de la donne est contenue dans un pointeur.

p. 16

1. Adressage immdiat
La donne est contenue dans l'instruction. Exemple : movlw 0xC4 ; Transfert la valeur 0xC4 dans W

2. Adressage direct
La donne est contenue dans un registre. Ce dernier peut tre par un nom (par exemple W) ou une adresse mmoire. Exemple : movf 0x2B, 0 ; Transfert dans W la valeur contenue l'adresse 0x2B. L'adresse 0x2B peut correspondre 2 registres en fonction de la banque choisie (Figure V.1). Le bit RP0 permet ce choix, le bit RP1 tant rserv pour les futurs systmes 4 banques.

3. Adressage indirect
L'adresse de la donne est contenue dans un pointeur. Dans les PIC, un seul pointeur est disponible pour l'adressage indirect : FSR. Contenu l'adresse 04h dans les deux banques, il est donc accessible indpendamment du numro de banque. En utilisant l'adressage direct, on peut crire dans FSR l'adresse du registre atteindre. FSR contenant 8 bits, on peut atteindre les deux banques du PIC 16F84. Pour les PIC contenant quatre banques, il faut positionner le bit IRP du registre d'tat qui sert alors de 9me bit d'adresse (Figure V.1).

Figure V.1 : Adressages direct et indirect la mmoire de donnes.

p. 17

L'accs au registre d'adresse contenue dans FSR se fait en utilisant le registre INDF. Il se trouve l'adresse 0 dans les deux banques. Il ne s'agit pas d'un registre physique. On peut le voir comme un autre nom de FSR, utilis pour accder la donne elle- mme, FSR servant choisir l'adresse. Exemple : movlw 0x1A ; Charge 1Ah dans W movwf FSR ; Charge W, contenant 1Ah, dans FSR movf INDF, 0 ; Charge la valeur contenue l'adresse 1Ah dans W

VI. Ports d'entres/Sorties


Le PIC 16F84 est dot de deux ports d'entres/Sorties appels PortA et PortB.

1. Port A
Il comporte 5 pattes d'entre/sortie bi-directionnelles, notes RAx avec x={0,1,2,3,4} sur le brochage du circuit (Figure II.2). Le registre PORTA, d'adresse 05h dans la banque 0, permet d'y accder en lecture ou en criture. Le registre TRISA, d'adresse 85h dans la banque 1, permet de choisir le sens de chaque patte (entre ou sortie) : un bit 1 positionne le port en entre, un bit 0 positionne le port en sortie. La Figure VI.1 donne le cblage interne d'une patte du port A : "Data Latch" : Mmorisation de la valeur crite quand le port est en sortie. "TRIS Latch" : Mmorisation du sens (entre ou sortie) de la patte. "TTL input buffer" : Buffer de lecture de la valeur du port. La lecture est toujours ralise sur la patte, pas la sortie de la bascule d'criture. Tansistor N : En criture : Satur ou bloqu suivant la valeur crite. En lecture : Bloqu. Transistor P : Permet d'alimenter la sortie.

Figure VI.1 : Cblage interne d'une patte du port A.

p. 18

La patte RA4 peut aussi servir d'entre de comptage pour le timer0.

2. Port B
Il comporte 8 pattes d'entre/sortie bi-directionnelles, notes RBx avec x={0,1,2,3,4,5,6,7} sur le brochage du circuit (Figure II.2). Le registre PORTB, d'adresse 06h dans la banque 0, permet d'y accder en lecture ou en criture. Le registre TRISB, d'adresse 86h dans la banque 1, permet de choisir le sens de chaque patte (entre ou sortie) : un bit 1 positionne le port en entre, un bit 0 positionne le port en sortie. Le cblage interne d'une porte du port B ressemble beaucoup celui du port A (Figure VI.2). On peut noter la fonction particulire pilote par le bit RBPU (OPTION_REG.7) qui permet d'alimenter (RBPU=0) ou non (RBPU=1) les sorties. Les quatre bits de poids fort (RB7-RB4) peuvent tre utiliss pour dclencher une interruption sur changement d'tat (VII). RB0 peut aussi servir d'entre d'interruption externe.

Figure VI.2 : Cblage interne d'une patte du port B.

VII. Compteur
Le PIC 16F84 est dot d'un compteur 8 bits. La Figure VII.1 en donne l'organigramme.

p. 19

Figure VII.1 : Organigramme du Timer0.

1. Registre TMR0
C'est le registre de 8 bits qui donne la valeur du comptage ralis. Il est accessible en lecture et en criture l'adresse 01h dans la banque 0.

Figure VII.2 : Prise en compte de l'criture dans le registre TMR0. Lors d'une criture dans TMR0, le comptage est inhib pendant deux cycles machine (Figure VII.2). Si l'on veut dterminer un temps avec prcision, il faut tenir compte de ce retard au dmarrage.

2. Choix de l'horloge
Le timer0 peut fonctionner suivant deux modes en fonction du bit T0CS (OPTION_REG.5). En mode timer (T0CS=0), le registre TMR0 est incrment chaque cycle machine (si le prdiviseur n'est pas slectionn). En mode compteur (T0CS=1), le registre TMR0 est incrment sur chaque front montant ou chaque front descendant du signal reu sur la broche RA4/T0CKl en fonction du bit T0SE (OPTION_REG.4). Si T0SE=0, les fronts montants sont compts, T0SE=1, les fronts descendants sont compts.

3. Pr-diviseur
En plus des deux horloges, un pr-diviseur, partag avec le chien de garde, est disponible. La priode de l'horloge d'entre est divise par une valeur comprise entre 2 et 256 suivant les bits PS2, PS1 et PS0 (respectivement OPTION_REG.2, .1 et .0) (Figure VII.3). Le bit PSA (OPTION_REG.3) permet de choisir entre la pr-division de timer0 (PSA=0) ou du chien de garde (PSA=1).

p. 20

Figure VII.3 : Valeurs du pr-diviseur en fonction de PSA, PS2, PS2 et PS0.

4. Fin de comptage et interruption


Le bit T0IF (INTCON.2) est mis 1 chaque fois que le registre TMR0 passe de FFh 00h. On peut donc tester ce bit pour connatre la fin de comptage. Pour compter 50 vnements, il faut donc charger TMR0 avec la valeur 256-50=206 et attendre le passage de T0IF 1. Cette mthode est simple mais bloque le processeur dans une boucle d'attente. On peut aussi reprer la fin du comptage grce l'interruption que peut gnrer T0IF en passant 1 ( VII). Le processeur est ainsi libre de travailler en attendant cet vnement.

5. Registres utiles la gestion de timer0


Plusieurs registres ont t voqus dans ce paragraphe. Ils sont synthtiss dans la Figure VII.4.

Figure VII.4 : Registres utiles la gestion de timer0.

p. 21

VIII. Accs la mmoire EEPORM


Le PIC possde une zone EEPROM de 64 octets accessibles en lecture et en criture par le programme. On peut y sauvegarder des valeurs, qui seront conserves mme si l'alimentation est teinte, et les rcuprer lors de la mise sous tension. Leur accs est spcifique et requiert l'utilisation de registres ddis. La lecture et l'criture ne peut s'excuter que selon des squences particulires.

1. Registres utiliss
Quatre registres sont utiliss pour l'accs la mmoire eeprom du PIC : - EEDATA contient la donne. - EEADR contient l'adresse. - EECON1 (Figure VIII.1) est le registre de contrle de l'accs l'eeprom. Cinq bits permettent un cet accs : - RD et WR initient la lecture ou l'criture. Ils sont mis 1 par le programme pour initier l'accs et mis zro par le systme la fin de l'accs. - WREN autorise (1) ou non (0) l'accs en criture. - WRERR est mis 1 par le systme quand une opration d'criture est interrompue par MCLR, reset ou le chien de garde. - EEIF est un drapeau d'interruption signalant la fin de l'criture physique dans la mmoire eeprom. Il doit tre mis 0 par programme.

Figure VIII.1 : Registre EECON1. EECON2 joue un rle spcifique lors de l'criture.

p. 22

2. Lecture
Pour lire une donne dans la mmoire eeprom, il faut mettre l'adresse dans EEADR et positionner RD 1. La valeur lue est alors disponible dans EEDATA au cycle machine suivant. Le programme ci-dessous donne un exemple de lecture dans la mmoire eeprom. BCF STATUS,RP0 MOVLW CONFIG_ADDR MOVLW EEADR BSF STATUS, RP0 BSF EECON1, RD BCF STATUS, RP0 MOVF EEDATA, W ; Bank 0 ; ; Address to read ; Bank 1 ; EE Read ; Bank 0 ; W = EEDATA

3. Ecriture
Pour crire une donne dans la mmoire eeprom, il faut d'abord mettre l'adresse dans EEADR et la donne dans EEDATA. Un cycle bien spcifique doit ensuite tre respecter pour que l'criture ait lieu. L'exemple suivant donne le cycle : BSF STATUS, RP0 BCF INTCON,GIE BSF EECON1, WREN MOVLW 55H MOVWF EECON2 MOVLW AAH MOVWF EECON2 BSF EECON1, WR BSF INTCON, GIE ; Bank 1 ; Disable INTS ; Enable Write ; ; Write 55h ; Write AAh ; Set WR bit beguin Write ; Enable INTS

IX.

Interruptions

L'interruption est un mcanisme fondamental de tout processeur. Il permet de prendre en compte des vnements extrieurs au processeur et de leur associer un traitement spcifique. La Figure IX.1 donne le droulement du programme lors d'une interruption. Il faut noter que l'excution d'une instruction n'est jamais interrompue ; c'est la fin de l'instruction en cours lors de l'arrive de l'vnement que le sous-programme d'interruption est excut. La squence classique de fonctionnement d'une interruption est la suivante : 1- Dtection de l'vnement dclencheur - IX.3, IX.4 2- Fin de l'instruction en cours 3- Sauvegarde de l'adresse de retour - IX.5 4- Droutement vers la routine d'interruption - IX.5 5- Sauvegarde du contexte - IX.6 6- Identification de l'vnement survenu - IX.6 7- Traitement de l'interruption correspondante 8- Restauration du contexte - IX.6

p. 23

9- Retour au programme initial - IX.8

Figure IX.1 : Droulement d'un programme lors d'une interruption.

1. Diffrentes sources d'interruption


Dans le cas du PIC 16F84, il existe 4 sources d'interruption (Figure IX.2) : - INT : Interruption externe, broche RB0/INT - TMR0 : Fin de comptage - PORTB : Changement d'tat du port B (RB7-RB4) - EEPROM : Fin d'criture en EEPROM

Figure IX.2 : Logique des vnements associs aux interruptions.

p. 24

2. Validation des interruptions

Figure IX.3 : Registre de contrle d'interruption du PIC INTCON Chacune de ses sources peut tre valide indpendamment grce aux bits 3 6 du registre INTCON (Figure IX.3). Le bit GIE de ce mme registre permet une validation gnrale des interruptions. Ainsi, pour que le droutement du programme en cours soit dclench, il faut qu'un des vnements extrieurs soit dtect, que l'interruption correspondante soit valide et que la validation gnrale soit active.

3. Squence de dtournement vers le sous-programme d'interruption


Par construction, l'interruption survient n'importe quand pendant l'excution du programme. Avant l'excution du sous-programme d'interruption, il faut donc sauvegarder l'adresse de l'instruction suivant celle en cours pour l'excuter aprs le sous-programme d'interruption. L'adresse de retour est stocke dans la pile (Figure III.1). Cette opration est gre automatiquement par le processeur. Une fois l'adresse de retour sauvegarde, le compteur de programme peut tre charg avec l'adresse du sous-programme excuter, ici 0004h.

p. 25

Dans le cas du PIC, cause de la faible taille de la pile, une interruption n'est pas interruptible. Le bit GIE de validation gnrale est donc mis 0 au dbut du sous-programme d'interruption. Cette opration est gre automatiquement par le processeur. La Figure IX.4 montre l'enchanement des ces oprations. Cinq tapes sont alors utiles pour commencer l'interruption : Apparition d'un vnement, sans perturber le droulement normal des instructions Prise en compte de l'vnement, excution de l'instruction en cours (PC) Cycle d'attente, sauvegarde de l'adresse PC+1 dans la pile Chargement de l'adresse 0004h dans le PC Excution de l'instruction d'adresse 0004h et chargement de l'instruction suivante

Figure IX.4 : Droulement de l'appel un sous-programme d'interruption. Deux cycles machine sont donc perdu chaque interruption, sans compter la sauvegarde et la restitution du contexte (IX.6) et le retour au programme initial (IX.8).

4. Sauvegarde et restitution du contexte


C'est un point important pour tous les sous-programmes qui devient capital pour les sousprogrammes d'interruption. En effet, beaucoup d'instructions modifient le registre STATUS et/ou utilisent le registre W. Afin de les rendre dans le mme tat la fin du sous-programme d'interruption qu'au dbut, il faut les sauvegarder au dbut et les recopier la fin. Si d'autres registres sont utiliss dans le sous-programme d'interruption, il faut gnralement les sauvegarder aussi. a. O sauvegarder ces registres ? Classiquement dans la pile. Dans le cas des PICs, elle est trs petite et non accessible pour l'utilisateur. Il faut donc dfinir une zone de sauvegarde dans la RAM. Pour dfinir une variable, on peut utiliser les directives CBLOCK et ENDC :

p. 26

CBLOCK 0x0C ; dbut de la zone de stockage Sauve_W : 1 Sauve_Status :1 ENDC b. Comment sauvegarder ces registres ? Pour W, c'est simple : il suffit d'utiliser l'instruction : movwf Sauve_W ; Sauvegarde de W Pour STATUS, c'est plus compliqu. En effet, il n'existe pas d'instruction de transfert d'un registre vers un autre. Il faut donc passer par W. Premire difficult : il faut penser sauvegarder W avant de l'utiliser pour sauvegarder STATUS. On pourrait alors utiliser la squence suivante : movf STATUS, 0 movwf Sauve_STATUS ; Ecrit la valeur de STATUS dans W ;Sauvegarde de STATUS ; 1 octet rserv pour la sauvegarde de W ; 1 octet rserv pour la sauvegarde de STAUTS

Malheureusement, cette squence ne fonctionne pas. En effet, l'instruction movf modifie le bit Z du registre STATUS. L'astuce consiste utiliser l'instruction swapf qui intervertit les digits de poids fort et de poids faible d'un registre, sans modifier le registre STATUS. La squence suivante permet de sauvegarder STATUS "swap" : swapf STATUS, 0 ; movwf Sauve_STATUS Ecrit STATUS "swap" dans W ; Sauvegarde de STATUS "swap"

c. Comment restituer ces registres ? Il faut commencer par restituer STATUS sans le modifier. En effet, on doit pour cela utiliser W qu'il est donc inutile de restituer avant. Comme STATUS a t sauvegard "swap", la squence suivante convient : swapf Sauve_STATUS, 0 movwf STATUS movf Sauve_W, 0 ; Ecrit Sauve_Status "sawp" dans W ; Restitue STATUS, "swap" deux fois ; Ecrit Sauve_W dans W

Pour restituer W, on pourrait tout simplement utiliser la squence suivante : Malheureusement, l'instrction movf modifie le bit Z du registre STATUS, dj restitu. Il faut donc encore une fois passer par l'instruction swap, excuter deux fois : swapf Sauve_W, 1 swapf Sauve_W, 0 ; Ecrit Sauve_W "swap" dans lui- mme ; Restitue W, "swap" deux fois.

d. Rsum CBLOCK 0x0C ; dbut de la zone de stockage Sauve_W : 1 ; 1 octet rserv pour la sauvegarde de W Sauve_Status :1 ; 1 octet rserv pour la sauvegarde de STAUTS ENDC

p. 27

;---------------------------; Routine d'interruption ;---------------------------; Sauvegarde du contexte movwf Sauve_W ; Sauvegarde de W swapf STATUS, 0 ; Ecrit STATUS "swap" dans W movwf Sauve_STATUS ; Sauvegarde de STATUS "swap" ; Traitement de l'interruption ; ; Restitution du contexte swapf Sauve_STATUS, 0 ; Ecrit Sauve_Status "sawp" dans W movwf STATUS ; Restitue STATUS, "swap" deux fois swapf Sauve_W, 1 ; Ecrit Sauve_W "swap" dans lui- mme swapf Sauve_W, 0 ; Restitue W, "swap" deux fois.

5. Reconnaissance de l'interruption active


En revanche, il n'existe qu'une adresse d'interruption, 0004h, pour les diffrentes sources. Les bits 0 2 du registre INTCON (Figure IX.3) et le bit 4 du registre EECON1 (Figure VIII.1) permettent de savoir quel vnement extrieur a dclench une interruption. Ainsi, au dbut du programme d'interruption, si plusieurs sources ont t valides, il faut imprativement aller tester ces diffrents bits pour connatre la source active et drouler le programme correspondant. On utilise pour cela l'instruction btfsc qui excute l'instruction suivante si le bit test vaut 1, la saute sinon. On peut donc crire la squence suivante aprs la sauvegarde du contexte o Int_xxx correspond aux diffrents sous-programmes de gestion des divers vnements : btfsc INTCON, 0 ; Test du bit RBIF call Int_PB ; Appel sous-programme si RBIF=1 btfsc INTCON, 1 ; Test du bit INTF call Int_Ext ; Appel sous-programme si INTF=1 btfsc INTCON, 2 ; Test de bit T0IF call Int_Timer ; Appel sous-programme si T0IF=1 btfsc EECON1, 4 ; Test de bit EEIF call Int_Timer ; Appel sous-programme si EEIF=1

6. Retour au programme initial


Une fois le sous-programme d'interruption termin, aprs la restitution du contexte, il faut revenir au programme initial. C'est l'instruction retfie qui le permet. Elle commence par revalider les interruptions (GIE=1) puis elle revient au programme initial grce la valeur du compteur de programme empile.

X. Chien de garde
1. Principe
C'est un systme de protection contre un blocage du programme. Par exemple, si le programme attend le rsultat d'un systme extrieur (conversion analogique numrique par exemple) et qu'il n'y a pas de rponse, il peut rester bloquer. Pour en sortir on utilise un chien

p. 28

de garde. Il s'agit d'un compteur qui, lorsqu'il arrive en fin de comptage, permet de red marrer le programme. Il est lanc au dbut du programme. En fonctionnement normal, il est remis zro rgulirement dans une branche du programme qui s'excute rgulirement. Si le programme est bloqu, il ne passe plus dans la branche de remise zro et le comptage va jusqu'au bout, dclenche le chien de garde qui relance le programme.

2. Mise en service
Elle se dcide lors de la programmation physique du PIC. Elle ne peut pas tre suspendue pendant l'excution d'un programme. Elle est dfinitive jusqu' une nouvelle programmation de la puce. La directive de programmation _CONFIG permet de valider (option _WDT_ON ) ou non (option _WDT_OFF ). La mise en service peut aussi tre ralise directement par le programmateur. L'inconvnient de cette seconde solution est que le code du programme ne contient pas l'information ; la mise en service du chien de grade peut tre oublie lors du tlchargement et gnrer un fonctionnement incorrect du programme en cas de blocage.

3. Gestion
Une fois le chien de garde mis en service, il faut remettre le comptage zro rgulirement. Cette opration est ralise par l'instruction clrwdt . Tant que le programme se droule normalement, cette instruction est excute rgulirement et le chien de garde ne s'active pas. Si un blocage apparat, la remise zro n'a pas lieu et le chien de garde est activ. Le PIC redmarre alors l'adresse 0000h et le bit TO (STATUS.4) est mis 0. Le test de ce bit au dbut du programme permet de savoir si le systme vient d'tre mis sous tension (TO=1) ou si le chien de garde vient de s'activer (TO=0).

4. Choix de la dure
Le chien de garde possde sa propre horloge. Sa priode de base est de 18ms. Le pr-diviseur de frquence utilis par le compteur est partag avec le chien de garde (Figure VII.3). Si le bit PSA (OPTION_REG.3) est 1, le pr-diviseur est assign au chien de garde. 8 valeurs de 1 128 sont disponibles, ce qui permet d'aller jusqu' 128*18ms=2.3s avant le dclenchement du chien de garde.

XI. Mode sommeil


1. Principe
Lorsque le PIC n'a rien faire (par exemple lors de l'attente d'une mesure extrieure), ce mode est utilis pour limiter sa consommation : le PIC est mis en sommeil (le programme s'arrte) jusqu' son rveil (le programme repart). Ce mode est principalement utilis pour les systmes embarqus fonctionnant sur pile.

2. Gestion
a. Mise en sommeil La mise en sommeil est ralise grce l'instruction sleep. La squence suivante est excute - Le chien de garde est remis 0 (quivalent clrwdt )

p. 29

- Le bit TO (STATUS.4) est mis 1 - Le bit PD (STATUS.3) est mis 0 - L'oscillateur est arrt ; le PIC n'excute plus d'instruction b. Rveil Ce mode n'est intressant que si l'on peut en sortir pour relancer le programme. Trois vnements permettent de sortir le PIC du sommeil : Application d'un niveau 0 sur l'entre MCLR (broche numro 4). Le PIC effectue alors un reset et relance le programme partir de l'adresse 0000h. Les bits TO (STATUS.4) et PD (STATUS.3) permettent l'utilisateur de savoir quel vnement lancer le programme (mise sous tension, reset, chien de garde). Activation du chien de garde. Le programme reprend l'instruction suivant le sleep. Apparition d'une interruption (RB0/INT, RB ou EEPROM). Il faut pour cela que les bits de validation spcifique des interruptions concernes soient positionns. Si le bit de validation gnrale des interruptions (GIE) est 0 (pas de validation des interruptions), le programme reprend aprs l'instruction sleep comme pour le chien de garde. Si le bit de validation gnrale des interruptions ( GIE) est 1 (validation des interruptions), l'instruction suivant le sleep est excute et la fonction d'interruption lie l'vnement qui a rveill le PIC est excute.

XII.

Astuces de programmation

1. Les comparaisons
Quoi de plus simple que deffectuer une comparaison entre 2 nombres. Il suffit deffectuer une soustraction. Soit par exemple comparer mem1 avec mem2 : movf mem1 , w subwf mem2 , w ; charger mem1 ; soustraire mem2 mem1

Il vous suffit ensuite de tester les bits C et Z du registre STATUS pour co nnatre le rsultat : Si Z = 1 , les 2 emplacements mmoires contiennent la mme valeur Si Z = 0 et C = 1, le rsultat est positif, donc mem2 est suprieur mem1 Si Z = 0 et C = 0, le rsultat est ngatif, donc mem2 est infrieur mem1 Si vous dsirez s implement comparer lidentit entre 2 valeurs, sans modifier C, vous pouvez galement utiliser linstruction XOR movf mem1 , w xorwf mem2 , w ; charger mem1 ; Si galit, tous les bits sont 0 et Z est 1

2. Soustraire une valeur de w


Supposons que vous avez une valeur dans W et que vous dsirez soustraire 5 de cette valeur. Le premier rflexe est le suivant : sublw 5

p. 30

Cest une erreur classique, car vous avez en ralit effectu (5 -w) au lieu de (w-5). Il vous faudra donc effectuer le complment 2 de cette valeur pour obtenir le bon rsultat. Effectuez plutt ceci : addlw -5

3. Les multiplications
Tout dabord, nous allons crer une routine qui multiplie ensemble 2 nombres de 8 bits. Le rsultat ncessitera donc 16 bits, donc 2 octets. En effet, pour obtenir le nombre de digits maximal du rsultat dune multiplication, il suffit dadditionner le nombre de digits des diffrents oprandes. Ralisons donc une multiplication manuelle. Nous allons multiplier 12 par 13. Nous allons travailler avec 4 bits multiplis par 4 bits, avec rsultat sur 8 bits. Ceci afin de rduire notre explication. Excutons donc notre multiplication manuellement.

1 X 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0 1

1 1 1 0 0 0 1

0 0 0 0 0 0 0

0 1 0 0 0 0 0

12 13 12 0 48 96 156

Nous avons multipli 12 par chaque chiffre de 13 en commenant par la droite. Nous avons dcal dune range vers la gauche chaque rsultat intermdiaire avant sont addition finale. La particularit en binaire, cest quil ny a que 2 c hiffres : 0 et 1. Donc on multiplie soit par 0 (ce qui revient ne rien faire) soit par 1 (ce qui revient simplement recopier le chiffre). Si on ralise ce programme, il nous faut 4 variables supplmentaires pour stocker les rsultats intermdiaires. 8 dans le cas dune multiplication de 8 bits par 8 bits. On peut alors imaginer de se passer de ces rsultats intermdiaires en procdant laddition au fur et mesure du rsultat intermdiaire avec le rsultat final. On obtient alors lalgorithme suivant : On multiplie 1100 par 1. On place le rsultat dans rsultat final On multiplie 1100 par 0. On dcale une fois. On ajoute au rsultat final On multiplie 1100 par 1. On dcale 2 fois. On ajoute au rsultat final On multiplie 1100 par 1. On dcale 3 fois. On ajoute au rsultat final.

p. 31

Vous pouvez tenter dcrire ce programme. Ceci reste pratique pour des multiplications de 4 par 4 bits. Pour des multiplications de 8 bits par 8 bits, vous allez devoir raliser des tas dadditions de nombres de 16 bits avec des nombres de 16 bits. De plus vous devrez dcaler le multiplicateur, ce qui impliquera, soit de le modifier (ce qui nest peut -tre pas toujours souhaitable), soit de le sauvegarder, ce qui consomme 1 octet supplmentaire. En rflchissant un peu, on peut se dire que plutt que de dcaler le multiplicateur vers la gauche, nous pouvons dcaler le rsultat vers la droite. Ceci revient au mme, mais vous navez plus que des additions de 8 bits, toujours dans le poids fort du rsultat Voici comment cela fonctionne avec notre exemple, pour ne pas faire trop long : On multiplie 1100 par 1. On place le rsultat fond gauche du rsultat. Dans rsultat on a : 11000000 On dcale le rsultat vers la droite : rsultat = 01100000 On multiplie 1100 par 0 . On ajoute au rsultat : rsultat = 01100000 On dcale le rsultat vers la droite : rsultat = 00110000 On multiplie 1100 par 1. On ajoute au rsultat gauche : rsultat :11000000 + 00110000 = 11110000 On dcale le rsultat vers la droite : rsultat = 01111000 On multiplie 1100 par 1. On ajoute au rsultat gauche : rsultat : 11000000 + 01111000 = 100111000 (9 bits). Le bit8 (en vert) est dans le carry. On dcale le rsultat vers la droite : rsultat = 10011100 = D156

Notez quon ajoute toujours au quartet de poids fort (centrage gauche). Dans le cas dune multiplication de 8 bits par 8 bits, on ajoutera donc loctet de poids fort. Par moment, nous aurons dbordement de laddition sur 9 bits. Souvenez-vous que le report se trouve dans le carry. Or, dans un dcalage, le carry est amen dans le rsultat, donc on rcupre automatiquement notre 9me bit, qui deviendra le 8me aprs dcalage vers la droite. Dans le programme, nous utiliserons la variable multi comme multiplicateur, multan comme multiplicande, resulH comme rsultat poids fort et resulL comme poids faible. multemp est le multiplicateur temporaire qui sera modifi. cmpt est le compteur de boucles Voici donc le programme : clrf clrf movlw movwf movf movwf movf loop rrf btfsc addwf rrf rrf decfsz goto multemp , f STATUS , C resulH , f resulH , f resulL , f cmpt , f loop ; dcaler multiplicateur vers la droite ; tester si bit sorti = 1 ; oui, ajouter au rsultat poids fort ; dcaler rsultat poids fort ; dcaler rsultat poids faible ; dcrmenter compteur de boucles ; pas fini, bit suivant resulH resulL 0x08 cmpt multi , w multemp multan , w ; effacer rsultat poids fort ; idem poids faible ; pour 8 bits ; initialiser compteur de boucles ; charger multiplicateur ; sauver dans multemp ; multiplicande dans w

p. 32

Vous pouvez en faire une sous-routine ou une macro ajouter dans votre propre fichier include. Les 2 lignes en gris effectuent un dcalage du rsultat sur 16 bits. Le bit perdu dans resulH est rcupr dans le carry et remis comme bit7 dans resulL. Astuce de programmation : si laddition prcdente eu lieu (ligne bleue), le 9 me bit rsultant de laddition est dans le carry, et se retrouve donc comme b7 dans resulH. Par contre, sil ny a pas eu laddition, le carry est forcment 0 du fait du test (en vert). Vous voyez maintenant lintrt davoir test le bit faible du multiplicateur en se servant du carry.

4. Adressage indirect pointant sur 2 zones diffrentes


Voici encore une astuce. Imaginez que vous devez copier 15 variables dun emplacement mmoire vers un autre (ou encore comparer 2 zones mmoires diffrentes etc.). En fait vous allez rapidement vous heurter un problme. Vous ne disposez que dun seul pointeur FSR pour pointer sur vos variables. Ralisons donc ce programme : mem1 est ladresse de dpart de la premire zone, mem2 ladresse de dpart de la seconde zone movlw movwf movlw movwf loop movf movwf movlw addwf movf movwf movlw addwf decfsz goto mem1 FSR 15 cmpt INDF , w tampon mem2-mem1 FSR , f tampon , w INDF (mem1-mem2)+1 FSR , f cmpt , f loop ; on pointe sur la premire zone ; on initialise le pointeur sur la zone source ; 15 variables transfrer ; sauver dans compteur de boucles ; charger source ; on doit sauver dans un emplacement tampon ; cart dadresse entre les 2 emplacements ; pointer sur destination ; recharger valeur source ; sauver dans destination ; Ecart entre adresse de destination et adresse ; de la source suivante, do le +1 ; ajouter au pointeur ; dcrmenter compteur de boucles ; pas dernier emplacement, suivant

Ce programme est valable lorsque vous navez pas le choix des zones de dpart et de destination. Maintenant, qui vous empche de placer vos variables dans des endroits qui vous arrangent ? Plaons mem1 et mem2 dans la zone de variables : org 0x10 mem1 : 15 org 0x30 mem2 : 15 ; on choisit une zone mmoire dans la zone RAM ; 15 emplacements pour la source ; on choisit une zone RAM ; 15 emplacements destination.

Maintenant, la source va de B00010000 B00011111 Et la destination de B00110000 B00111111

p. 33

Il ny a donc que le bit 5 de FSR qui change entre source et destination. Pour modifier des bits, pas besoin de laccumulateur, donc pas besoin de sauver et recharger la valeur transfrer. Nous pouvons donc modifier notre programme de la manire suivante : movlw movwf movlw movwf loop movf bsf movwf bcf incf decfsz goto INDF , w FSR , 5 INDF FSR , 5 FSR , f cmpt , f loop ; charger source ; on pointe sur destination ; sauver dans destination ; on pointe sur source ; pointer sur suivant ; dcrmenter compteur de boucles ; pas dernier emplacement, suivant mem1 FSR 15 cmpt ; on pointe sur la premire zone ; on initialise le pointeur sur la zone source ; 15 variables transfrer ; sauver dans compteur de boucles

Remarque : Avec les PICs qui utilisent plusieurs banques, comme la 16F876, vous pouvez galement utiliser la mme adresse dans 2 banques diffrentes, et passer dune lautre en modifiant les bits RP du registre STATUS.

5. Les tableaux en mmoire programme


Supposons que nous avons besoin dun tableau de taille importante. Par exemple un tableau de 200 lments. O placer ce tableau ? Dans la RAM il ny a pas assez de place, dans leeprom non plus. Ne reste donc plus que la mmoire de programme. Le problme, cest que la 16F84, contrairement la 16F876, par exemple, ne dispose daucune mthode pour aller lire les donnes dans la mmoire programme. La seule mthode pour y avoir accs est dutiliser des instructions. Supposons un cas simple : nous voulons crer un tableau contenant le carr des nombres de 0 15. Nous pourrions utiliser un petit sous-programme de la forme suivante : On teste si le nombre pass en argument = 0. Si oui, on retourne 0 On teste si le nombre pass en argument = 1. Si oui, on retourne 1 On teste si le nombre pass en argument = 2. Si oui, on retourne 4 Et ainsi de suite

Vous voyez tout de suite quil faudra plusieurs instructions par valeur du tableau. En cas dun tableau de 200 lments, on naura pas assez de mmoire programme pour tout crire. Nous allons donc utiliser une autre astuce. Le cur de lastuce est dutiliser linstruction retlw qui permet de retourner une valeur passe en argument. Ecrivons donc notre tableau sous forme de retlw : cela donne : ;********************************************************************* ; TABLEAU DES CARRES * ;********************************************************************* ;-------------------------------------------------------------------------------------------------------; Ne pas oublier de valider le radix dcimal par dfaut dans le nud

p. 34

; principal du projet. N'oubliez pas que la directive "END" doit se ; trouver aprs la dernire ligne de votre programme. Ne laissez donc ; pas cette directive dans le programme principal. ;-------------------------------------------------------------------------------------------------------org 0x300 ; adresse du tableau carre addwf PCL , f ; ajouter w PCL retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw END 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 ; carr de 0 = 0 ; carr de 1 = 1 ; carr de 2 = 4 ; carr de 3 = 9 ; carr de 4 = 16 ; carr de 5 = 25 ; carr de 6 = 36 ; carr de 7 = 49 ; carr de 8 = 64 ; carr de 9 = 81 ; carr de 10 = 100 ; carr de 11 = 121 ; carr de 12 = 144 ; carr de 13 = 169 ; carr de 14 = 196 ; carr de 15 = 225 ; directive fin de programme

Donc, si on charge 4 dans w et quon effectue un appel call carre . Le programme se branche sur cette ligne, le PCL est incrment de 4 et le programme excute donc alors la ligne retlw 16 . En effet, le PC pointe toujours sur linstruction suivante, donc au moment de lexcution de addwf PCL , f , celui-ci pointait sur la ligne retlw 0 . A ce stade, vous devez vous rappeler que ladresse pour une opration sur le registre PCL est complte par le contenu de PCLATH. Vous devez donc initialiser correctement celui-ci avec le numro de la page de ladresse de votre tableau. Par exemple, si votre tableau est ladresse 0x200, vous devrez mettre 0x02 dans PCLATH. De plus, lopration sur PCL ne modifiera pas automatiquement PCLATH, donc votre tableau ne devra pas dpasser 256 lments, et, de plus, ne devra pas dborder sur la page suivante. Une page tant la plage adresse par les 256 valeurs possibles de PCL, sans toucher PCLATH. Il ne nous reste plus qu construire un petit programme principal qui fasse appel cette sous routine. ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x000 ; Adresse de dpart aprs reset ;*********************************************************************

p. 35

; PROGRAMME PRINCIPAL * ;********************************************************************* start clrf nombre ; effacer nombre loop movf nombre , w ; charger nombre call carre ; prendre le carr du nombre incf nombre , f ; incrmenter nombre btfss nombre , 4 ; tester si nombre >15 goto loop ; non, nombre suivant goto start ; oui, on recommence 0 Compilez votre programme puis passez- le au simulateur. Vous constaterez. Que cela ne fonctionne pas. Pourquoi ? Et bien, en ralit, toute opration dont le PC est la destination fait intervenir PCLATH. Or nous avons laiss PCLATH 0. Ladresse de calcul nest donc pas la bonne. Avant le saut sous aurions du ajouter : movlw movwf 03 PCLATH

Afin de permettre PCLATH de pointer sur la page 0x300 lors du calcul dincrmentation de PCL. Vous pouvez avantageusement remplacer la ligne org 0x300 par repere ORG (repere+31)& 0x3E0 ; adresse du tableau Dans ce cas, pas besoin de modifier PCLATH car on reste en page 00 Le but de cette manipulation est dobtenir automatiquement la premire adresse disponible pour laquelle il ny aura pas de dbordement de notre PCL. Pour un tableau de 256 lments, utilisez ORG (repere+255) & 0x300. Faites des essais la main sur un bout de papier pour vous en convaincre. Par exemple, on calcule la fin du tableau (repere+255). Org pointe alors sur la bonne page. On limine ensuite les bits correspondants (255 = 8 bits) de la taille mmoire totale du programme (0x3FF). Reste donc & 0x300.

p. 36

XIII.

Bibliographie

1. Bigonoff (bigocours@hotmail.com) : "La programmation des PICs" http://fribotte.free.fr/bdtech/cours/pic16f84/ ** : Figures prises dans ce document 2. Lyce Jacquard : "Le PIC 16FXX" http://ejacquard.free.fr/dossier_lycee/Pic/cours_pic.htm 3. Lyce Jacquard : "MPLAB" - http://ejacquard.free.fr/dossier_lycee/Pic/cours_pic.htm 4. Microchip : "PIC16F8X 18-pin Flash/EEPROM 8-bit micro-controllers" DS30430C, http://www.Microchip.com/1010/suppdoc/ * : Figures prises dans ce document 5. Microchip : "PIC16F8X EEPROM memory programming specification" DS30262E, http://www.Microchip.com/1010/suppdoc/

p. 37

Vous aimerez peut-être aussi