Vous êtes sur la page 1sur 108

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN SOMMAIRE 1)Architecture interne d’un système à microprocesseur 2)Le

SOMMAIRE

1)Architecture interne d’un système à microprocesseur 2)Le microcontrôleur16F84 3)Jeux d'instructions des PIC

4) Bits (ou "fusibles") de configuration

5)Les interruptions 6)Le mode SLEEP 7)Le timer WATCHDOG (chien de garde)

8)Accès à la mémoire EEPORM 9) Remarques et astuces de programmation en assembleur 10) Les étapes nécessaires pour programmer un pic :

11) Exemples en assembleur avec 16F84 12) Simulation d’un PIC sous Proteus 13) Circuits d’interfaces avec le microcontrôleur 14) Pic 16F877 :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 1. Architecture interne d’un système à microprocesseur

1. Architecture interne d’un système à microprocesseur

L'architecture interne d'un ordinateur se compose essentiellement de trois blocs: le microprocesseur, la mémoire et les entrées/sorties reliées entre elles par trois bus de communication; le bus de données, le bus d’adresses et le bus de commande.

Bus de données (8 lignes) Unité centrale de traitement microprocesseur Mémoire Entrées/Sorties Bus
Bus de données (8 lignes)
Unité centrale de
traitement
microprocesseur
Mémoire
Entrées/Sorties
Bus d'adresses
Bus de contrôle
Figure 1-1 Architecture interne d’un ordinateur

1.1.1 Le microprocesseur

Un microprocesseur est l'implantation en un seul boîtier, en technologie LSI ou VLSI, d'une unité centrale de traitement de données CPU et d’une unité arithmétique et logique ALU. Son principal travail est de fournir aux autres éléments, qui lui sont raccordés, la synchronisation nécessaire et fonctionnelle du traitement des informations qui lui sont acheminées.

1.1.2 La mémoire

C'est la partie où l'on retrouve les programmes exécutables et les données à traiter. Cette section est subdivisée en deux; d'une part, il y a la mémoire latente et d'autre part, la mémoire vive.

Mémoire morte

C'est la mémoire de lecture; elle contient le programme du système. L'avantage de la ROM (Read Only Memory), c’est d'être permanente; son contenu ne disparaît pas quand le système n'est plus alimenté. La ROM contient toujours un programme de chargement initial ou un moniteur pour permettre le fonctionnement du système dès la mise sous tension. Dans un contexte de contrôle de processus, presque tous les programmes résideront en ROM car ils seront rarement changés et devront être protégés des pannes d'alimentation.

Mémoire vive

C'est la mémoire de lecture et d’écriture du système ou RAM (Random Access Memory). Le contenu de ce type de mémoire est perdu lorsque l'on coupe l'alimentation. La mémoire vive (RAM) doit être chargée, avant utilisation, à partir du clavier ou à partir d’une mémoire de masse comme, par exemple, une unité à ruban magnétique ou une unité à disque.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 1.2 Les entrées/sorties Les entrées/sorties sont nécessaires pour

1.2 Les entrées/sorties

Les entrées/sorties sont nécessaires pour que le microprocesseur communique avec le monde extérieur et, évidemment, avec l'utilisateur. Il serait tout à fait inutile de réaliser un ordinateur sans qu'il y ait quelques entrées et quelques sorties afin de communiquer avec l'extérieur.

1.3 Les bus de communication

Évidemment, pour que le système fonctionne, il doit y avoir une communication entre le microprocesseur, la mémoire et les entrées/sorties. Cette communication est réalisée à l'aide de trois bus qui regroupent les signaux, selon leur fonction.

1.3.1 Le bus de données

C'est un bus bidirectionnel sur lequel transitent les données échangées par les éléments du système.

1.3.2 Le bus d’adresses

Il s'agit d'un bus unidirectionnel, émanant du microprocesseur et se propageant vers les dispositifs qu'il peut adresser. L'adresse qu'il porte permet d'atteindre une case mémoire ou un registre spécifique avec laquelle une opération est désirée.

1.3.3 Le bus de contrôle

C'est un groupe de lignes issues de ou allant vers le microprocesseur et reliant ce dernier à d'autres dispositifs. Son rôle est de véhiculer les signaux destinés à assurer la synchronisation et la commande de l'ensemble du système. Par exemple, la ligne Reset et R/W (lecture/écriture), les lignes d'interruptions et l'horloge appartiennent à ce bus.

2. Les microcontrôleurs :

2.1 Généralités :

Un microcontrôleur se présente comme étant une unité de traitement de l’information de type

microprocesseur contenant tous les composants d’un système informatique, à savoir, microprocesseur,

des mémoires et des périphériques (ports, timers, convertisseurs…). Chaque fabricant a sa ou ses familles

de microcontrôleurs.

Une famille se caractérise par un noyau commun (le microprocesseur, le jeu d’instruction…).

Ainsi les fabricants peuvent présenter un grand nombre de pins qui s’adaptent plus au moins à certaines

tâches. Mais un programmeur connaissant une famille n’a pas besoin d’apprendre à utiliser chaque

membre, il lui faut connaître juste ces différences par rapport au père de la famille. Ces différences sont

souvent, la taille des mémoires, la présence ou l’absence des périphériques et leurs nombres

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 2.2 Les avantages du microcontrôleur : L’utilisation des

2.2 Les avantages du microcontrôleur :

L’utilisation des microcontrôleurs pour les circuits programmables à plusieurs points forts et bien

réels. Il suffit pour s’en persuader, d’examiner la spectaculaire évolution de l’offre des fabricants de

circuits intégrés en ce domaine depuis quelques années.

Tout d’abord, un microcontrôleur intègre dans un seul et même boîtier ce qui, avant nécessitait une

dizaine d’éléments séparés. Il résulte donc une diminution évidente de l’encombrement de matériel et

de circuit imprimé.

Cette intégration a aussi comme conséquence immédiate de simplifier le tracé du circuit imprimé

puisqu’il n’est plus nécessaire de véhiculer des bus d’adresses et de donnée d’un composant à un

autre.

Le microcontrôleur contribue à réduire les coûts à plusieurs niveaux :

- Moins cher que les autres composants qu’il remplace.

- Diminuer les coûts de main d’œuvre.

Réalisation des applications non réalisables avec d’autres composants

2.3 Contenu d’un microcontrôleur :

Un circuit microcontrôleur doit contenir dans un seul boîtier tous Les éléments de bases, nous y

retrouvons bien évidemment l’unité centrale qui est plus simplifiée par rapport à celle du

microprocesseur. En contre partie, des instructions de manipulation de bits, très utiles pour faire des

entrées/sorties lui ont été ajoutées. Dans certains circuits, cette unité centrale se voit dotée d’un très grand

nombre de registres internes qui servent alors de mémoire vive.

2.4 Organisation de la mémoire

Architecture Von Neumann : une mémoire unique et pour le programme et pour les données.

Architecture Harvard : le programme et les données sont stockés dans des mémoires physiquement

séparés

2.5 Qu'est-ce qu'un PIC ?

Un PIC est un microcontrôleur de chez Microchip. Ses caractéristiques principales sont :

Séparation des mémoires de programme et de données (architecture Harvard) : On obtient ainsi une meilleure bande passante et des instructions et des données pas forcément codées sur le même nombre de bits. Communication avec l'extérieur seulement par des ports : il ne possède pas de bus d'adresses, de bus de

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN données et de bus de contrôle comme la plupart des
Programmation des Microcontroleurs (PIC) EL MORNAN données et de bus de contrôle comme la plupart des

données et de bus de contrôle comme la plupart des microprocesseurs.

Utilisation d'un jeu d'instructions réduit, d'où le nom de son architecture : RISC (Reduced Instructions Set Construction). Les instructions sont ainsi codées sur un nombre réduit de bits, ce qui accélère l'exécution (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 systèmes d'architecture CISC (Complex Instructions Set Construction) qui proposent plus d'instructions donc codées sur plus de bits mais réalisant des traitements plus complexes.

Il existe trois familles de PIC :

- Base-Line : Les instructions sont codées sur 12 bits

- Mid-Line : Les instructions sont codées sur 14 bits

- High-End : Les instructions sont codées sur 16 bits

Un PIC est identifié par un numéro de la forme suivant : xx(L)XXyy –zz

- xx : Famille du composant (12, 14, 16, 17, 18)

- L : Tolérance plus importante de la plage de tension

- XX : Type de mémoire 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 .Il s'agit d'un microcontrôleur 8 bits à 18 pattes.

Principales caractéristiques :

- 35 instructions

- Instructions codées sur 14 bits

- Données 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 mémoire flash

Brochage et fonction des pattes

La Figure montre le brochage du circuit. Les fonctions des pattes sont les suivantes :- VSS, VDD :

- OSC1,2 :

- RA0-4 :

- RB0-7 :

- T0CKL :

- INT :

- MCLR :

les suivantes :- VSS, VDD : - OSC1,2 : - RA0-4 : - RB0-7 : -

Figure: Brochage du circuit

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 2.6 Architecture générale Figure : Architecture générale du PIC

2.6 Architecture générale

Microcontroleurs (PIC) EL MORNAN 2.6 Architecture générale Figure : Architecture générale du PIC 16F8X. La Figure

Figure : Architecture générale du PIC 16F8X.

La Figure présente l’architecture générale du circuit. Il est constitué des éléments suivants :

- un système d’initialisation à la mise sous tension (power-up timer, …)

- un système de génération d’horloge à partir du quartz externe (timing génération)

- une unité arithmétique et logique (ALU)

- une mémoire flash de programme de 1k « mots » de 14 bits

- un compteur de programme (program counter) et une pile (stack)

- un bus spécifique pour le programme (program bus)

- un registre contenant le code de l’instruction à exécuter

- un bus spécifique pour les données (data bus)

- une mémoire RAM contenant

- les SFR 68 octets de données-

- une mémoire EEPROM de 64 octets de données

- 2 ports d’entrées/sorties

- un compteur (timer)

- un chien de garde (watchdog)

Le circuit de mise en œuvre minimale :

Le circuit 16F84 est l’un des plus simples de la famille, mais il permet néanmoins de travailler avec 12 broches d’entrée/sortie !

La mise en œuvre est très simple. Il faut au minimum :

- Un circuit d’horloge ( un quartz, deux condensateurs ou bien seulement un condensateur et une résistance )

- Une alimentation +5V !

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 2.7 Circuit d’horloge : 2.7 Organisation de la mémoire Le
Programmation des Microcontroleurs (PIC) EL MORNAN 2.7 Circuit d’horloge : 2.7 Organisation de la mémoire Le
2.7 Circuit d’horloge : 2.7 Organisation de la mémoire
2.7
Circuit d’horloge :
2.7
Organisation de la mémoire

Le PIC contient de la mémoire de programme et de la mémoire de données. La structure Harvard des PICs fournit un accès séparé à chacune. Ainsi, un accès aux deux est possible pendant le même cycle machine.

2.8 Mémoire de programme

C’est elle qui contient le programme à exécuter. Ce dernier est téléchargé par liaison série La Figure montre l’organisation de cette mémoire. Elle contient 1k « mots » de 14 bits dans le cas du PIC 16F84, même si le compteur de programme (PC) de 13 bits peut en adresser 8k. 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 mémoire. Ce sont des zones réservées par le système.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN Figure : Organisation de la Mémoire de données. Page 8
Programmation des Microcontroleurs (PIC) EL MORNAN Figure : Organisation de la Mémoire de données. Page 8

Figure : Organisation de la Mémoire de données.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 2.9 Registre à fonction spéciale (Special Function Register : SFR)

2.9 Registre à fonction spéciale (Special Function Register : SFR) :

Les registres à fonction spéciales sont utilisés par le microprocesseur et les périphériques internes. Ils sont stockés dans la RAM statique , ce qui limite à 8 bits (et non 14 bits) ces registres. Les SFRs sont toujours stockés dans les 32 premiers octets de chaque page (bank). Registre W :

Le registre W est le registre de travail sur 8 bits pour réaliser des opérations arithmétiques ou logiques. Pointeur de pile S :

Le pointeur de pile S est un ensemble de registre sur 13 bits. Sur les PICs, il y a 8 mots de 13 bits, ce qui limite le nombre maximal d’interruption ou d’appel à des sous-programmes. Le pointeur de pile S mémorise une adresse, c’est à dire le contenu du compteur programme. Attention, elle n’est pas manipulable, exclusivement réservée au microprocesseur. Compteur programme ou PC :

Le compteur programme, PC, indique l’adresse du prochain code binaire à 14 bits à traiter. Le registre PC est constitué de deux registres , un registre PCL constitué de 8 bits et un registre PCLATH constitué de 5 bits. Le registre PC fait donc 13 bits qui correspondent à 8192 mots de 14 bits mais dans notre cas limité à 4096 mots de 14 bits (voir doc du pic16F648A). Registre d’état (Status Register) :

Le registre d’état est un registre sur 8 bits. Chaque bit à une signification particulière :

sur 8 bits. Chaque bit à une signification particulière : Le bit C (Carry) : C

Le bit C (Carry) : C est mis à 1 lorsqu’une opération arithmétique génère une retenue. Il est également utilisé comme indicateur d’erreur lors d’une multiplication ou d’une division, et sert lors de certaines opérations de décalage ou rotation qui peuvent passer par son intermédiaire ou non. Le bit Z (Zéro) : Z est mis à 1 lorsque le résultat de l’instruction exécuté est nul. Les bits RP1 et RP0 : Bits indiquants sur quelle page (bank), le microprocesseur travail en adressage direct (seul 7 bits d’adresses sont nécessaires). RP1 RP0 bank 0 (adresse 00h-7Fh) ou page 0 bank 1 (adresse 80h-FFh) ou page 1 bank 2 (adresse 100h-17Fh) ou page 2 bank 3 (adresse 180h-1FFh) ou page 3 Le bit IRP : Bit indiquant sur quelle page (bank), le microprocesseur travail en adressage indirect (8 bits d’adresses sont nécessaires).

0 : bank 0, 1 (adresse 00h-FFh) ou page 0 et 1

1 : bank 2,3 (adresse 100h-1FFh) ou page 2 et 3

E) Ports Port A :

RA0 à RA4 sont des entrées du port parallèle A. Ces lignes sont bidirectionnelles (sauf pour RA4 en entrée seulement). De plus elles sont partagées avec certains périphériques du pic (voir doc constructeur en fonction des besoins). Port B :

PB0 à PB7 sont des sorties du port parallèle B. Ces lignes sont bidirectionnelles. De plus elles sont partagées avec certains périphériques du pic (voir doc constructeurs en fonction des besoins). On remarque que l'écran se découpe en 4 champs :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN Champ étiquette Champ opérateur (code mnémonique) ou directive

Champ étiquette Champ opérateur (code mnémonique) ou directive d'assemblage Champ opérande Champ commentaire Pour passer d'un champ à un autre, il suffit de mettre un espace avec la touche espace ou TAB. Plusieurs espaces accolés correspondent à un seul et même espace. Attention on ne peut sauter des champs, c'est à dire passer du champ étiquette au champ opérande. Seul le champ commentaire est un peu particulier. Si un champ quelconque est rempli, on peut aller directement au champ commentaire. Il y a une exception, lorsqu'aucun champ n'est rempli, l'éditeur considère que toute la ligne est un champ commentaire, d'où la condition de mettre ; en début de ligne. On n'utilisera pas d'étiquette comportant plus de 8 caractères du code ASCII standard.

2.10 Directives d'assemblage :

END

Fin du fichier contenant le programme.

EQU

Permet de donner des équivalences (pour des valeurs).

Ex: FSR

EQU

H’04’.

Et dans le programme cela donnera :

MOVF FSR

; Ecriture de W dans FSR

#DEFINE

Ex: #DEFINE MONBIT

Et dans le programme cela donnera :

Permet de donner des équivalences (pour des chaînes de caractères).

PORTA,1.

BCF

MONBIT ; Met le bit 1 du port A à 0 (équivalent à BCF PORTA,1)

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN O R G Ex: ORG _CONFIG Détermine où le compilateur

ORG

Ex: ORG

_CONFIG

Détermine où le compilateur doit mettre les codes qui suivent cette commande.

0x00.

Détermine les fusibles qui fixeront le fonctionnement du PIC.

Ex: _CONFIG

_CP_OFF & _WDT_ON & _PWRTE_ON & _HS_ON.

_CP_OFF :

Aucune protection en lecture du pic (choix par défaut).

_WDT_ON :

WatchDog en service par défaut (le mettre à OFF sur nos Kits).

_PWRTE_ON :

Délai de démarrage du pic à la mise sous tension (OFF par défaut).

_HS_ON :

Oscillateur à quartz à grande vitesse (_XT_OSC sur nos kits : quartz lent)

_BODEN_ON :

(_RS_OSC par défaut). Reset du pic si chute de tension (choix par défaut).

_LVP_ON :

Utilisation de RB3 comme broche de programmation sous 5V(choix par

_CPD_OFF :

défaut). Non protection en écriture de la zone EEPROM (choix par défaut).

_DATA_CP_OFF : Non protection en écriture de la zone RAM (choix par défaut).

_WRT_ON :

_DEBUG_OFF :

Non protection de la mémoire FLASH (lié à _CP_) (choix par défaut). Non utilisation d’un débuggeur (avec RB6 et RB7) (choix par défaut).

#INCLUDE Détermine pour le compilateur toutes les équivalences liés à la structure du pic

(pour l’assembleur). Aussi utilisé en programmation en langage C. Cela permet

alors d’inclure des fonctions ou procédures en C déjà réalisées. Ex: #INCLUDE <pic16F648A>.

CBLOCK

ENDC Ex : CBLOCK

TEMP

TABLE

Détermine un bloc mémoire pour réserver des octets pour différentes variables. Fin de la déclaration pour le bloc mémoire.

0x20 ; Déclaration d’un bloc mémoire à l’adresse 0x20

: ; Réservation d’un octet à l’adresse 0x20

: ; Réservation de 8 octets à partir de l’adresse 0x21

Fin de la déclaration du bloc

1

8

ENDC ;

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 2.11 Registres d'usage général Le PIC 16F84A possède 68

2.11 Registres d'usage général

Le PIC 16F84A possède 68 registres d'usage général situés dans la mémoire des données (Data RAM).

Cela correspond donc à 68 octets (68 x 8 bits) de mémoire SRAM, que vous pouvez utiliser comme variables pour votre programme.

Les registres d'usage général sont indifféremment accessibles en banque 0 ou en banque 1.

Banque 0 (adresses 0x0C à 0x4F)

Banque 1 (adresses 0x8C à 0xCF)

Notez bien que le registre situé à l'adresse 0x0C (banque 0) est aussi le registre de l'adresse 0x8C (banque

1)

Les outils de programmation (MPLAB

Il est plus agréable de manipuler :

movwf compteur1

que :

movwf 0x0C

2.12 Registres spéciaux

) permettent d'attribuer un nom à un registre.

Le PIC 16F84A a 15 registres spéciaux situés dans la mémoire des données (Data RAM).

La mémoire des données est divisée en 2 banques :

Banque 0 (adresses 0x00 à 0x7F)

Banque 1 (adresses 0x80 à 0xFF)

-> Les registres spéciaux :

TIMR0

PORTA

PORTB

EEDATA

EEADR

sont situés en banque 0.

N.B. Pour passer en banque 0, il faut au préalable exécuter l'instruction :

bcf STATUS , RP0

-> Les registres spéciaux :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN  OPTION_REG  TRISA  TRISB  EECON1  EECON2

OPTION_REG

TRISA

TRISB

EECON1

EECON2

sont situés en banque 1.

N.B. Pour passer en banque 1, il faut au préalable exécuter l'instruction :

bsf STATUS , RP0

-> Les autres registres spéciaux :

STATUS

INTCON

FSR , INDF

PCL

PCLATH

sont indifféremment accessibles en banque 0 ou en banque 1 (donc peu importe la valeur du bit RP0 du registre STATUS).

3. Jeux d'instructions des PIC

Les PIC 16F84A, 16F876A et 16F877 ont le même jeu d'instructions, constitué de seulement 35 instructions (architecture RISC : Reduced Instruction-Set Computer).

Une instruction est codée par un mot de 14 bits.

La mémoire programme (de type Flash) a une taille de :

1792 octets (16F84A)

3584 octets (16F628A)

7168 octets (16F88)

ce qui permet de stocker un programme de :

1024 instructions (16F84A)

2048 instructions (16F628A)

4096 instructions (16F88)

Une instruction nécessite 1 cycle, ou bien 2 cycles dans le cas d'une instruction de branchement (GOTO,

CALL

).

Avec une horloge à quartz de 20 MHz, un cycle correspond à 4/(20.10 6 ) = 200 nanosecondes.

Le microcontrôleur peut donc exécuter jusqu'à 5 millions d'instructions par seconde !

Jeu d'instructions

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN W : régistre de travail (accumulateur), taille 8 bits k

W : régistre de travail (accumulateur), taille 8 bits

k : valeur littérale, taille 8 bits bit du Mnémonique , registre nombre de Description
k : valeur littérale, taille 8 bits
bit du
Mnémonique ,
registre
nombre de
Description
opérande
STATUS
cycles
affecté
MOVLW k
k (8 bits) est chargé dans (W)
-
1
Additionne k (8 bits) et (W) et place le résultat
ADDLW k
C, DC , Z
1
dans (W)
Soustrait W de k (8 bits) et place le résultat
SUBLW k
C, DC , Z
1
dans (W)
k - (W) -> (W)
Réalise un ET logique entre k (8 bits) et (W),
ANDLW k
Z
1
et place le résultat dans (W)
Réalise un OU logique (inclusif) entre k (8 bits)
IORLW k
Z
1
et (W), et place le résultat dans (W)
Réalise un OU exclusif entre k (8 bits) et (W),
XORLW k
Z
1
et place le résultat dans (W)
L : label (étiquette) Mnémonique , Description opérande bit du registre STATUS affecté ombre de
L : label (étiquette)
Mnémonique ,
Description
opérande
bit du registre
STATUS affecté
ombre de
cycles
GOTO L
Branchement à l'adresse L
-
2
Appelle un sous-programme (subroutine)
CALL L
-
2
situé à l'adresse L
RETURN
Retour de sous-programme
-
2
Retour de sous-programme, avec chargement
RETLW k
- 2
de la valeur littérale k (8 bits) dans (W)

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN RETFIE Retour de sous-programme d'interruption - 2 CLRWDT
RETFIE Retour de sous-programme d'interruption - 2 CLRWDT Efface le Watchdog /TO, /PD 1 SLEEP
RETFIE
Retour de sous-programme d'interruption
-
2
CLRWDT
Efface le Watchdog
/TO, /PD
1
SLEEP
Place le microcontrôleur en mode sommeil
/TO, /PD
1

f : registre (spécial ou d'usage général)

b : position du bit (0 à 7) Mnémonique , nombre de Description opérande bit
b : position du bit (0 à 7)
Mnémonique ,
nombre de
Description
opérande
bit du registre
STATUSaffecté
cycles
BCF f , b
Mise à 0 du b ème bit du registre f
-
1
BSF f , b
Mise à 1 du b ème bit du registre f
-
1
Si le b ème bit du registre f est égal à 0,
alors l'instruction suivante est ignorée,
BTFSC f , b
-
1
ou 2
et une instruction NOP est exécutée à
la place (soit 2 cycles)
Si le b ème bit du registre f est égal à 1
, alors l'instruction suivante est ignorée,
BTFSS f , b
-
1
ou 2
et une instruction NOP est exécutée à
la place (soit 2 cycles)

f : registre (spécial ou d'usage général)

d : registre de destination (on peut choisir entre le registre de travail W et
d : registre de destination (on peut choisir entre le registre de travail W et le registre f ).
bit du registre
nombre de
Mnémonique ,
Description
opérande
STATUS affecté
cycles
MOVWF f
(W) est chargé dans (f)
-
1
MOVF f , d
(f) (8 bits) est chargé dans (destination)
Z
1
Additionne le contenu du registre f (8 bits)
ADDWF f , d
C, DC , Z
1
et (W), et place le résultat dans (destination)

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN   Soustrait (W) de (f) (8 bits) et place le
 

Soustrait (W) de (f) (8 bits) et place le

   

SUBWF f , d

Résultat dans (destination).

C, DC , Z

1

(f) - (W) ->(destination)

ANDWF f , d

Réalise un ET logique entre (f) (8 bits) et (W), et place le résultat dans (destination)

Z

1

IORWF f , d

Réalise un OU logique (inclusif) entre (f) (8 bits)et (W), et place le résultat dans (destination)

Z

1

XORWF f , d

éalise un OU exclusif entre (f) (8 bits) et (W), et place le résultat dans (destination)

Z

1

COMF f , d

Réalise le complément logique de (f) (8 bits)et place le résultat dans (destination)

Z

1

 

Décrémente (f) et place le résultat dans

   

DECF f , d

(destination). (f) - 1 -> (destination)

Z

1

 

Décrémente (f) et place le résultat dans

   

(destination).Si le résultat est 0, alors

DECFSZ f , d

l'instruction suivante est ignorée, et une

-

1 ou 2

instruction NOP est exécutée à la place

(soit 2 cycles)

 

Incrémente (f) et place le résultat dans

   

INCF f , d

(destination). (f) + 1 -> (destination)

Z

1

 

Incrémente (f) et place le résultat dans

   

(destination).Si le résultat est 0, alors

INCFSZ f , d

l'instruction suivante est ignorée, et

-

1 ou 2

une instruction NOP est exécutée à la place

(soit 2 cycles)

Efface le contenu du registre (f). CLRF f Z 1 Remarque : le bit Z
Efface le contenu du registre (f).
CLRF f
Z
1
Remarque : le bit Z est donc mis à 1.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN Efface le contenu de l'accumulateur (W). CLRW Z 1 Remarque
Efface le contenu de l'accumulateur (W). CLRW Z 1 Remarque : le bit Z est
Efface le contenu de l'accumulateur (W).
CLRW
Z
1
Remarque : le bit Z est donc mis à 1.
Réalise une rotation circulaire à gauche :
RLF f , d
C
1
Le résultat est placé dans (destination).
Réalise une rotation circulaire à droite :
RRF f , d
C
1
Le résultat est placé dans (destination).
Les 4 bits de poids forts et les 4 bits de poids
SWAPF f , d
-
1
faible de (f) sont échangés.
Le résultat est placé dans (destination).
NOP
Cette instruction ne fait rien (durée 1 cycle).
-
1
3.1 Modes d'adressages

On ne peut pas concevoir un programme qui ne manipule pas de données. Il existe quatre grands types d'accès à une donnée ou modes d'adressage :

Adressage inhérent Adressage immédiat Adressage direct Adressage indirect

Adressage inhérent :

Ce mode n’est pas à proprement parler un mode d’adressage, mais tous les fabricants le décomptent comme tel

Les instructions agissent sur les registres internes du microprocesseur. Les instructions comportent donc un code opérateur seul sans opérande.

CLRW

Met le registre de travail W à 0 et met le bit Z à 1.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN Adressage immédiat La donnée est contenue dans l'instruction .La

Adressage immédiat La donnée est contenue dans l'instruction .La donnée est contenue dans un registre. L'adresse de la donnée est contenue dans un pointeur Exemple : movlw 0xC4; Transfert la valeur 0xC4 dans W

Adressage direct

La donnée est contenue dans un registre. Ce dernier peut être par un nom (par exemple W) ou une adresse mémoire.

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

Adressage indirect

3.2 Le compteur de programme (PC)

Le PC contient l'adresse de la prochaine instruction que doit exécuter le programme.

Le programme est stocké dans la mémoire de programme (de type Flash, reprogrammable jusqu'à 10000 fois) aux adresses 0x0000 à 0x3FF (soit 1024 adresses).

Le codage d'une instruction nécessite un seul emplacement mémoire : on peut donc stocker un programme de 1024 instructions au maximum (pour le PIC 16F84A).

Le PC est constitué des deux registres spéciaux :

PCL

PCLATH

Le registre spécial PCL est situé à l'adresse 0x02 (banque 0) de la mémoire des données (Data RAM).

Ce registre est également accessible en banque 1 (à l'adresse 0x82).

Le registre spécial PCLATH est situé à l'adresse 0x0A (banque 0) de la mémoire des données.

Ce registre est également accessible en banque 1 (à l'adresse 0x8A).

Le PC contient une adresse codée sur 13 bits :

Le registre PCL contient l'adresse de poids faible (8 bits) du PC

Le registre PCLATH contient l'adresse de poids fort (5 bits) du PC.

Par exemple :

(PCL) = B'10110011'

(PCLATH) =B'---00010' (les bits 5 à 7 ne sont pas utilisés par le PIC 16F84A)

(PC) = B'0001010110011' (adresse 0x2B3 en numération hexadécimale).

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN La prochaine instruction que va exécuter le PIC est donc

La prochaine instruction que va exécuter le PIC est donc située à l'adresse 0x2B3 de la mémoire de programme.

Vous pouvez manipuler le contenu des registres PCL et PCLATH.

Par exemple, les instructions :

movlw 0x02 ; W = 0x02

movwf PCLATH ; (PCLATH) = 0x02

movlw 0xB3 ; W = 0xB3

movwf PCL ; (PCL) = 0xB3

font sauter le programme à l'adresse 0x2B3 (après l'exécution de l'instruction movwf PCL).

On a ainsi fait un GOTO "programmé" (goto 0x2B3)

3.3 L'adressage relatif

L'instruction addwf PCL , f permet de faire ce que l'on appelle un adressage relatif.

Cette technique est largement utilisée pour la gestion des tableaux de données.

- Les sous-programmes (ou routines)

- La routine d'interruption

- La pile

1- Les sous-programmes (routines)

Prenons un exemple :

MOVLW B'10010001'

CALL routine1

CLRW

routine1 ; étiquette de début de la routine

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN instructions de la routine RETURN ; retour de routine Supposons

instructions de la routine

RETURN ; retour de routine

Supposons que le µC en soit à l'exécution de l'instruction MOVLW B'10010001'.

L'instruction suivante est l'instruction CALL : il s'agit d'une instruction d'appel à un sous-programme.

Le µC saute alors à la position définie par l'étiquette "routine1".

Puis, les instructions du sous-programme sont exécutées.

La fin du sous-programme est signalée par l'instruction RETURN (ou aussi RETLW).

Cette instruction indique qu'il faut revenir à l'instruction qui suit l'instruction CALL, c'est à dire dans cette exemple CLRW.

N.B. Les instructions CALL et RETURN (ou RETLW) s'utilisent toujours par paire.

3.4 La routine d'interruption

Il s'agit d'un sous-programme particulier : il est déclenché par une interruption (alors qu'un sous- programme "classique" est appelé par l'instruction CALL).

"classique" est appelé par l'instruction CALL). Le µC se branche alors à l'adresse H'0004'

Le µC se branche alors à l'adresse H'0004' de la mémoire de programme (les instructions de la routine d'interruption doivent donc commencer à cette adresse).

La fin de la routine d'interruption est signalée par l'instruction RETFIE.

L'instruction RETFIE provoque le retour dans le programme principal, à l'endroit où il avait été interrompu par l'apparition de l'interruption.

3.5 La pile

La pile est une zone mémoire particulière.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN Pour le PIC 16F84A, elle est constituée de 8 emplacements

Pour le PIC 16F84A, elle est constituée de 8 emplacements de 13 bits.

La pile intervient dans le mécanisme interne des instructions :

CALL

RETURN

RETLW

RETFIE

En effet, c'est dans la pile qu'est mémorisée l'adresse de retour d'une routine.

Quand intervient une instruction CALL ou une interruption, l'adresse de l'instruction suivante (qui se trouve dans le compteur de programme PC) est sauvegardée dans la pile.

Quand une instruction RETURN, RETLW ou RETFIE apparaît, le µC lit la dernière valeur sauvegardée dans la pile, libère l'emplacement et se branche à l'adresse indiquée.

Avec le mécanisme de la pile, un sous-programme peut appeler un sous-programme (ou plutôt un sous- sous-programme) : la pile réserve un autre emplacement

La taille de la pile est limitée à 8 niveaux (pour le PIC 16F84A).

S'il y a plus de 8 routines actives en même temps, le contenu de la pile est écrasé et le programme ne fonctionne plus correctement.

Cela se traduit par un plantage (le µC ne fait plus rien) ou bien par un comportement plus ou moins

incohérent (le µC fait des choses bizarres) plus complexes (Windows de Microsoft

Remarques :

).

problèmes que l'on retrouve exactement sur des programmes

- il ne peut y avoir qu'une seule routine d'interruption (car un seul vecteur d'interruption : H'0004')

- la routine d'interruption peut appeler un sous-programme (avec l'instruction CALL)

- un sous-programme ne doit pas s'appeler lui-même

3.6 Le compteur

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

lui-même 3.6 Le compteur Le PIC 16F84 est doté d'un compteur 8 bits. La Figure en

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN Figure: Organigramme du Timer0. 3.7 Registre TMR0 C'est le

Figure: Organigramme du Timer0.

3.7 Registre TMR0

C'est le registre de 8 bits qui donne la valeur du comptage réalisé. Il est accessible en lecture et en écriture à l'adresse 01h dans la banque 0 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 incrémenté à chaque cycle machine (si le pré-diviseur n'est pas sélectionné). En mode compteur (T0CS=1), le registre TMR0 est incrémenté sur chaque front montant ou chaque front descendant du signal reçu sur la broche RA4/T0CKl en fonction du bit T0SE (OPTION_REG.4). Si T0SE=0, les fronts montants sont comptés, T0SE=1, les fronts descendants sont comptés. Pré-diviseur En plus des deux horloges, un pré-diviseur, partagé avec le chien de garde, est disponible. La période de l'horloge d'entrée est divisée par une valeur comprise entre 2 et 256 suivant les bits PS2, PS1 et PS0 (respectivement OPTION_REG.2, .1 et .0) (Figure). Le bit PSA (OPTION_REG.3) permet de choisir entre la pré-division de timer0 (PSA=0) ou du chien de garde (PSA=1).

de timer0 (PSA=0) ou du chien de garde (PSA=1). Figure : Valeurs du pré-diviseur en fonction

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

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN Fin de comptage et interruption Le bit T0IF (INTCON.2) est

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 connaître la fin de comptage. Pour compter 50 événements, il faut donc charger TMR0 avec la valeur 256-50=206 et attendre le passage de T0IF à 1. Cette méthode est simple mais bloque le processeur dans une boucle d'attente. On peut aussi repérer la fin du comptage grâce à l'interruption que peut générer T0IF en passant à 1 Le processeur est ainsi libre de travailler en attendant cet événement. Registres utiles à la gestion de timer0 Plusieurs registres ont été évoqués dans ce paragraphe. Ils sont synthétisés dans la Figure

dans ce paragraphe. Ils sont synthétisés dans la Figure Figure: Registres utiles à la gestion de

Figure: Registres utiles à la gestion de timer0.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 4. Bits (ou "fusibles") de configuration On se place dans

4. Bits (ou "fusibles") de configuration

On se place dans le cadre de l'outil de développement MPLAB de Microchip.

La syntaxe utilisée est alors :

 

Valeurs

 

Nom

possibles

Signification

 

ON

Rend impossible la lecture de la mémoire de programme Flash

CP

et de l'EEPROM (à travers un programmateur)

Code Protection bit)

C'est une protection contre le piratage industriel.

OFF

Lecture possible

PWRTE

ON

A la mise sous tension du µC, lance une temporisation d'environ 72 ms durant laquelle est effectué un RESET interne.

Il est conseillé d'utiliser cette configuration.

(Power-up Timer Enable bit)

OFF

Temporisation désactivée

WDT

ON

Active le watchdog (chien de garde)

(Watchdog Timer Enable bit)

OFF

Désactive le watchdog

   

Oscillateur de type Résistance / Condensateur

RC

Remarques : économique, réservé aux applications où

la précision de la base de temps n'est pas critique.

OSC

HS

Oscillateur à quartz haute fréquence (4 MHz, 20 MHz

).

(Oscillator Selection bits)

XT

Oscillateur à quartz ou à résonateur céramique

LP

Oscillateur à quartz de faible puissance (32,768 kHz

)

Exemple de configuration

Dans le code source (fichier avec extension .asm), les fusibles de configuration sont indiqués au compilateur avec la directive suivante :

config

_CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN  Remarque Les bits de configuration ne sont pas modifiables.

Remarque

Les bits de configuration ne sont pas modifiables.

Dans l'exemple ci-dessus, pour activer le watchdog et utiliser un oscillateur de type RC, il faut modifier le code source, recompiler et reprogrammer le µC

config

_CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC

5. Les interruptions

Le PIC 16F84A dispose de 4 sources d'interruptions :

1. Interruption sur la broche RB0/INT

2. Interruption "RB" : sur changement du niveau logique d'au moins une de ces 4 broches : RB4, RB5, RB6 ou RB7 (port B)

3. Interruption de débordement du registre TMR0 (H'FF' -> H'00')

4. Interruption de fin d'écriture de l'EEPROM

4. Interruption de fin d'écriture de l'EEPROM 5.1 - Le mécanisme des interruptions Quand une interruption

5.1 - Le mécanisme des interruptions

Quand une interruption survient, le programme principal est interrompu :

Le µC finit l'exécution de l'instruction en cours puis il se branche vers le sous-programme d'interruption (la routine d'interruption).

Quand la routine d'interruption est achevée (instruction retfie), le µC retourne au programme principal, à l'endroit exact où il l'avait quitté.

5.2 - Cas d'une seule source d'interruption

Imaginons une application où l'on désire utiliser l'interruption sur la broche RB0/INT.

Il peut s'agir d'un bouton poussoir connecté sur la broche RB0/INT :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN  /RBPU = 0 : activation des résistances de pull-up
Programmation des Microcontroleurs (PIC) EL MORNAN  /RBPU = 0 : activation des résistances de pull-up

/RBPU = 0 : activation des résistances de pull-up du port B (bit 7 du registre OPTION_REG)

INTEDG = 0 : l'interruption de la broche RB0/INT est active sur un front descendant (bit 6 du registre OPTION_REG)

On veut donc provoquer une interruption quand on appuie sur le bouton poussoir.

Pour cela, il faut commencer par autoriser les interruptions de manière globale :

GIE = 1 (bit 7 du registre INTCON)

Puis, on autorise uniquement l'interruption qui nous intéresse :

INTE = 1 (bit 4 du registre INTCON) : autorise l'interruption sur la broche RB0/INT

RBIE = 0 (bit 3 du registre INTCON) : désactive l'interruption "RB"

T0IE = 0 (bit 5 du registre INTCON) : désactive l'interruption de débordement du registre TMR0

EEIE = 0 (bit 6 du registre INTCON) : désactive l'interruption de fin d'écriture de l'EEPROM

Enfin, on initialise le drapeau (flag) INTF à 0 (bit 1 du registre INTCON).

Tout cela se fait pendant la phase d'initialisation du programme principal par :

movlw B'10010000'

movwf INTCON

Maintenant, quand on appuie sur le bouton poussoir, le drapeau INTF est automatiquement mis à 1.

Le µC prend en compte cette interruption quand il a connaissance du niveau haut de drapeau INTF (3 ou 4 cycles de délai).

Le mécanisme des interruptions est lancé (voir plus haut).

Important :

Il faut remettre le drapeau INTF à 0 avant de quitter la routine d'interruption (bcf INTCON, INTF).

Sinon, le µC se rebranche indéfiniment sur la routine d'interruption (puisque INTF = 1) : le programme est planté !

Sauvegarde et restauration du contexte de travail

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN Il est important que le contexte de travail du programme

Il est important que le contexte de travail du programme principal soit le même avant et après l'exécution de la routine d'interruption.

Cela concerne le registre STATUS et l'accumulateur W qui doivent retrouver le même contenu (en effet, ces deux registres sont souvent utilisés et donc modifiés pendant la routine d'interruption).

Voici la procédure préconisée par Microchip :

La routine d'interruption commence par la sauvegarde du registre W puis du registre STATUS :

org H'0004' ; vecteur d'interruption (directive du compilateur MPLAB)

movwf W_TEMP

swapf STATUS, W

movwf STATUS_TEMP

La routine d'interruption finit par la restauration du registre STATUS puis du registre W :

swapf STATUS_TEMP, W

movwf STATUS

swapf W_TEMP, f

swapf W_TEMP, W

retfie ; retour d'interruption

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN Page 28

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 5.3 - Cas de plusieurs sources d'interruption On suppose que

5.3 - Cas de plusieurs sources d'interruption

On suppose que les 4 sources d'interruptions sont actives :

GIE = 1

INTE = 1

RBIE = 1

T0IE = 1

EEIE = 1

Dans la routine d'interruption (après avoir sauvegardé le registre W et le registre STATUS), se pose la question suivante : quelle est la source de l'interruption ?

La réponse se fait en testant, les uns après les autres, le niveau logique des drapeaux :

INTF (bit 1 du registre INTCON)

RBIF (bit 3 du registre INTCON)

T0IF (bit 2 du registre INTCON)

EEIF (bit 4 du registre EECON1)

Par exemple, supposons que l'interruption est due au débordement du registre TMR0 :

INTF = 0

RBIF = 0

T0IF = 1

EEIF = 0

Après le test, le µC se branche vers le bloc de traitement spécifique de l'interruption TMR0.

Il ne faut pas oublier d'effacer le drapeau T0IF.

On finit par la restauration du registre STATUS puis du registre W.

Il peut arriver qu'il y ait plusieurs sources d'interruptions en même temps :

INTF = 1

RBIF = 1

T0IF = 0

EEIF = 0

Dans ce cas, on se peut se contenter de traiter une seule source d'interruption à la fois.

Ce sera l'interruption RB0/INT s'il se trouve que le drapeau INTF est testé en premier.

Après retour dans le programme principal, on aura :

INTF = 0

RBIF = 1

T0IF = 0

EEIF = 0

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN L'interruption "RB" est alors traitée, etc On voit ici que

L'interruption "RB" est alors traitée, etc

On voit ici que l'on peut choisir des niveaux de priorités entre les différentes sources d'interruptions.

voit ici que l'on peut choisir des niveaux de priorités entre les différentes sources d'interruptions. Page

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 6. Le mode SLEEP 6.1 Préambule L'utilisation du mode SLEEP

6. Le mode SLEEP

6.1 Préambule

L'utilisation du mode SLEEP (Power-down mode) n'a d'intérêt que dans les applications alimentées par piles ou batteries.En effet, en mode SLEEP la consommation électrique du µC devient très faible.

6.2 Mise en mode Sommeil

Le µC est placé en mode SLEEP après une instruction SLEEP.

L'instruction SLEEP provoque :

La mise à 0 du bit /PD du registre STATUS

La mise à 1 du bit /TO du registre STATUS

L'inhibition de l'horloge (broches OSC1/CLKIN et OSC2/CLKOUT) ce qui a pour conséquence d'arrêter le programme (d'où une consommation d'énergie électrique réduite)

Le mise à 0 du timer du watchdog (chien de garde)

Attention : le timer du watchdog continue de fonctionner pendant le mode SLEEP (si le watchdog est actif).

6.3 Réveil (Power-up)

Le µC se réveille, et reprend une activité normale, quand :

Il y a un RESET externe (niveau bas sur la broche /MCLR) : le programme est réinitialisé (adresse H'0000' de la mémoire de programme).

(adresse H'0000' de la mémoire de programme).  La temporisation du watchdog est dépassée (si le

La temporisation du watchdog est dépassée (si le watchdog est actif) : le programme reprend à l'instruction qui suit l'instruction SLEEP.

Une interruption RB0/INT, RB ou EEPROM survient (si ces interruptions sont autorisées) même quand le bit GIE (du registre INTCON) est égal à 0 :

o

si GIE = 0 : le programme reprend à l'instruction qui suit l'instruction SLEEP

o

si GIE = 1 : l'instruction qui suit l'instruction SLEEP est exécutée puis le programme saute à la routine d'interruption (adresse H'0004' de la mémoire de programme)

Remarque : l'interruption TMR0 ne peut pas réveiller le µC.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 7. Le timer WATCHDOG (chien de garde) 7.1 Préambule Le

7. Le timer WATCHDOG (chien de garde)

7.1 Préambule

Le timer watchdog (le watchdog pour simplifier) est un dispositif qui permet au µC de reprendre la main en cas de plantage.

Nous entendons par plantage :

la conséquence d'un bug (dans ce cas, c'est une erreur humaine et il faut corriger le programme)

la conséquence d'une perturbation électrique qui fait sauter le programme à une adresse quelconque et inattendue

Le plantage se traduit généralement par un "blocage" : le µC ne fait plus rien ou bien des choses étranges.

Il faut alors faire un RESET externe (en supposant qu'un bouton poussoir sur la broche /MCLR a été prévu à cet effet) :

poussoir sur la broche /MCLR a été prévu à cet effet) : Autrement, il faut couper

Autrement, il faut couper l'alimentation, attendre quelques secondes que les condensateurs de filtrage se déchargent, et remettre en route. Nous allons voir que le watchdog, par logiciel, permet de faire un RESET interne.

7.2 Reset du watchdog

Pour utiliser le watchdog, il faut choisir de l'activer : cela se fait au niveau des bits de configuration.

Il faut ensuite placer (judicieusement) dans le programme l'instruction CLRWDT.

Cette instruction remet à 0 le timer du watchdog.

Si le timer watchdog dépasse une certaine durée, cela provoque un RESET interne : le programme est réinitialisé (adresse H'0000' de la mémoire de programme).

Cette durée dépend des bits PSA, PS2, PS1 et PS0 du registre OPTION_REG :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN     Taux de   Durée PSA PS2, PS1, PS0
   

Taux de

 

Durée

PSA

PS2, PS1, PS0

prédivision

indicative

du Watchdog

0

XXX

1

18

ms

1

000

1

18

ms

1

001

2

36

ms

1

010

4

72

ms

1

011

8

144

ms

1

100

16

288

ms

1

101

32

576

ms

1

110

64

1,15 s

1

111

128

2,3 s

X = 0 ou 1

En effaçant le watchdog à intervalles réguliers (avec CLRWDT), le timer ne doit normalement jamais "déborder".

En cas de plantage, le timer déborde ce qui génère un RESET, et le programme redémarre.

Remarques :

L'instruction CLRWDT :

met à 1 le bit /TO du registre STATUS

met à 1 le bit /PD du registre STATUS

En cas de débordement du watchdog :

le bit /TO est mis à 0

3- Cas particulier du mode SLEEP

En mode SLEEP, le µC se réveille si la temporisation du watchdog est dépassée (si le watchdog est actif).

Mais il n'y a pas RESET : le programme reprend à l'instruction qui suit l'instruction SLEEP.

le bit /TO est mis à 0

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN  le bit /PD est mis à 0 7.3 Reset

le bit /PD est mis à 0

7.3 Reset

Il y a plusieurs types de Reset :

Reset à la mise sous tension (POR : Power-on Reset)

Reset externe en mode de fonctionnement normal (niveau bas sur la broche /MCLR)

Reset externe pendant le mode SLEEP (niveau bas sur la broche /MCLR)

Reset dû au Watchdog (en mode de fonctionnement normal)

Réveil dû au Watchdog (en mode SLEEP)

7-3-1- Reset à la mise sous tension (POR : Power-on Reset)

Un Reset interne a lieu à la mise sous tension, ou après une coupure de courant.

Le programme est initialisé (adresse H'0000' de la mémoire de programme).

Le bit /TO (du registre STATUS) est mis à 1

Le bit /PD (du registre STATUS) est mis à 1

7-3-2- Reset externe (en mode de fonctionnement normal)

Quand on appuie sur le bouton poussoir, la broche /MCLR passe au niveau bas, ce qui génère un Reset "externe" :

au niveau bas, ce qui génère un Reset "externe" : Le programme est réinitialisé (adresse H'0000'

Le programme est réinitialisé (adresse H'0000' de la mémoire de programme).

Le bit /TO (du registre STATUS) est mis à 1

Le bit /PD (du registre STATUS) est mis à 1

7-3-3- Reset externe pendant le mode SLEEP

On se place dans le cas où le µC est placé en mode SLEEP (suite à l'instruction SLEEP).

Quand on appuie sur le bouton poussoir, la broche /MCLR passe au niveau bas, ce qui génère un Reset "externe" :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN Le µC se réveille, le programme est réinitialisé (adresse
Programmation des Microcontroleurs (PIC) EL MORNAN Le µC se réveille, le programme est réinitialisé (adresse

Le µC se réveille, le programme est réinitialisé (adresse H'0000' de la mémoire de programme).

Le bit /TO (du registre STATUS) est mis à 1

Le bit /PD (du registre STATUS) est mis à 0

7-3-4- Reset dû au Watchdog (en mode de fonctionnement normal)

Quand le timer Watchdog déborde, un Reset interne est réalisé :

Le programme est réinitialisé (adresse H'0000' de la mémoire de programme).

Le bit /TO (du registre STATUS) est mis à 0

Le bit /PD (du registre STATUS) est mis à 1

7-3-5- Réveil dû au Watchdog (en mode SLEEP)

En mode SLEEP, le µC se réveille si le timer watchdog déborde (si le watchdog est actif).

Mais il n'y a pas RESET : le programme reprend à l'instruction qui suit l'instruction SLEEP.

Le bit /TO (du registre STATUS) est mis à 0

Le bit /PD (du registre STATUS) est mis à 0

7-3-6 - Bits /TO et /PD du registre STATUS

Ces bits sont en lecture seule.

/TO

1

1

0

0

/TO 1 1 0 0 1 /PD 1 1 1 0 0 Condition Reset à la

1

/PD

1

1

1

0

/TO 1 1 0 0 1 /PD 1 1 1 0 0 Condition Reset à la

0

Condition

Reset à la mise sous tension (Power-on Reset POR)

Reset externe (en mode de fonctionnement normal)

Reset dû au Watchdog (en mode de fonctionnement normal)

Réveil dû au Watchdog (en mode SLEEP)

Reset externe pendant le mode SLEEP

Réveil dû à une interruption

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN En testant si /TO = 0, on peut savoir si

En testant si /TO = 0, on peut savoir si le Reset est dû à un plantage (débordement de Watchdog), et orienter la suite de programme en conséquence

8. Accès à la mémoire EEPORM

Le PIC possède une zone EEPROM de 64 octets accessibles en lecture et en écriture par le programme. On peut y sauvegarder des valeurs, qui seront conservées même si l'alimentation est éteinte, et les récupérer lors de la mise sous tension. Leur accès est spécifique et requiert l'utilisation de registres dédiés. La lecture et l'écriture ne peut s'exécuter que selon des séquences particulières.

8.1 . Registres utilisés

Quatre registres sont utilisés pour l'accès à la mémoire eeprom du PIC :

- EEDATA contient la donnée.

- EEADR contient l'adresse.

- EECON1 (Figure* VIII.1) est le registre de contrôle de l'accès à l'eeprom. Cinq bits permettent un cet accès :

- RD et WR initient la lecture ou l'écriture. Ils sont mis à 1 par le programme pour initier l'accès et mis à zéro par le système à la fin de l'accès.

- WREN autorise (1) ou non (0) l'accès en écriture.

- WRERR est mis à 1 par le système quand une opération 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 mémoire eeprom. Il doit être mis à 0 par programme.

l'écriture physique dans la mémoire eeprom. Il doit être mis à 0 par programme. Figure :

Figure : Registre EECON1.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN - EECON2 joue un rôle spécifique lors de l'écriture. 8.2

- EECON2 joue un rôle spécifique lors de l'écriture.

8.2 Lecture

Pour lire une donnée dans la mémoire 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 mémoire eeprom.

donne un exemple de lecture dans la mémoire eeprom. 8.3 Ecriture Pour écrire une donnée dans

8.3 Ecriture

Pour écrire une donnée dans la mémoire eeprom, il faut d'abord mettre l'adresse dans EEADR et la donnée dans EEDATA. Un cycle bien spécifique doit ensuite être respecter pour que l'écriture ait lieu. L'exemple suivant donne le cycle :

spécifique doit ensuite être respecter pour que l'écriture ait lieu. L'exemple suivant donne le cycle :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 9. Remarques et astuces de programmation en assembleur 9-1- Charger

9. Remarques et astuces de programmation en assembleur

9-1- Charger une valeur littérale dans un registre

movlw B'10001100' ; W = B'10001100'

movwf REGISTRE ; (REGISTRE) = B'10001100' = 0x8C = D'140'

9-2- Charger un registre avec le contenu d'un autre registre

movf REGISTRE1 , W ; W = (REGISTRE1)

movwf REGISTRE2 ; (REGISTRE2) = (REGISTRE1)

9-3- Echanger le contenu de deux registres : (REGISTRE1) < - > (REGISTRE2)

Il faut utiliser une variable intermédiaire :

REGISTRE_TEMP (registre d'usage général)

movf REGISTRE1 , W ; W = (REGISTRE1)

movwf REGISTRE_TEMP ; (REGISTRE_TEMP) = (REGISTRE1)

movf REGISTRE2, W ; W = (REGISTRE2)

movwf REGISTRE1 ; (REGISTRE1) = (REGISTRE2)

movf REGISTRE_TEMP, W ; W = (REGISTRE_TEMP)

movwf REGISTRE2 ; (REGISTRE2) = (REGISTRE_TEMP)

9-4 Tests de comparaison

9-4- Tests d'égalité

9-4-1- Le contenu du registre est-il nul ?

(REGISTRE) = 0x00 ?

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE , f ; (REGISTRE) = (REGISTRE) btfss STATUS
Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE , f ; (REGISTRE) = (REGISTRE) btfss STATUS

movf REGISTRE , f ; (REGISTRE) = (REGISTRE)

btfss STATUS , Z ; test du bit Z

goto non ; Z = 0 c'est-à-dire (REGISTRE) != 0x00

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-2- Le contenu du registre est-il différent de zéro ?

(REGISTRE) != 0x00 ?

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE , f ; (REGISTRE) = (REGISTRE) btfsc STATUS
Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE , f ; (REGISTRE) = (REGISTRE) btfsc STATUS

movf REGISTRE , f ; (REGISTRE) = (REGISTRE)

btfsc STATUS , Z ; test du bit Z

goto non ; Z = 1 c'est-à-dire (REGISTRE) = 0x00

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-3- Le contenu du registre est-il égal à une certaine valeur ?

(REGISTRE) = 0x3F ?

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movlw 0x3F ; W = 0x3F subwf REGISTRE, W ;
Programmation des Microcontroleurs (PIC) EL MORNAN movlw 0x3F ; W = 0x3F subwf REGISTRE, W ;

movlw 0x3F ; W = 0x3F

subwf REGISTRE, W ; W = (REGISTRE) - 0x3F

btfss STATUS, Z ; test du bit Z

goto non ; Z = 0 c'est-à-dire (REGISTRE) != 0x3F

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-4- Le contenu du registre est-il différent d'une certaine valeur ?

(REGISTRE) != 0x3F ?

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movlw 0x3F ; W = 0x3F subwf REGISTRE, W ;
Programmation des Microcontroleurs (PIC) EL MORNAN movlw 0x3F ; W = 0x3F subwf REGISTRE, W ;

movlw 0x3F ; W = 0x3F

subwf REGISTRE, W ; W = (REGISTRE) - 0x3F

btfsc STATUS, Z ; test du bit Z

goto non ; Z = 1 c'est-à-dire (REGISTRE) = 0x3F

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-5- Le contenu du registre est-il égal au contenu d'un autre registre ?

(REGISTRE1) = (REGISTRE2) ?

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE2 , W ; W = (REGISTRE2) subwf REGISTRE1,
Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE2 , W ; W = (REGISTRE2) subwf REGISTRE1,

movf REGISTRE2 , W ; W = (REGISTRE2)

subwf REGISTRE1, W ; W = (REGISTRE1) - (REGISTRE2)

btfss STATUS, Z ; test du bit Z

goto non ; Z = 0 c'est-à-dire (REGISTRE1) != (REGISTRE2)

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-6- Le contenu du registre est-il différent du contenu d'un autre registre ?

(REGISTRE1) != (REGISTRE2) ?

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE2 , W ; W = (REGISTRE2) subwf REGISTRE1,
Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE2 , W ; W = (REGISTRE2) subwf REGISTRE1,

movf REGISTRE2 , W ; W = (REGISTRE2)

subwf REGISTRE1, W ; W = (REGISTRE1) - (REGISTRE2)

btfsc STATUS, Z ; test du bit Z

goto non ; Z = 1 c'est-à-dire (REGISTRE1) = (REGISTRE2)

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-7 - Le contenu du registre est-il strictement supérieur à une certaine valeur ?

(REGISTRE) > 0x3F ?

Les valeurs sont supposées en binaire naturel.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE , W ; W = (REGISTRE) sublw 0x3F
Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE , W ; W = (REGISTRE) sublw 0x3F

movf REGISTRE , W ; W = (REGISTRE)

sublw 0x3F ; W = 0x3F - (REGISTRE)

btfsc STATUS, C ; test du bit C (Carry)

goto non ; C = 1 c'est-à-dire 0x3F >= (REGISTRE)

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-8 - Le contenu du registre est-il supérieur ou égal à une certaine valeur ?

(REGISTRE) >= 0x3F ?

Les valeurs sont supposées en binaire naturel.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movlw 0x3F ; W = 0x3F subwf REGISTRE, W ;
Programmation des Microcontroleurs (PIC) EL MORNAN movlw 0x3F ; W = 0x3F subwf REGISTRE, W ;

movlw 0x3F ; W = 0x3F

subwf REGISTRE, W ; W = (REGISTRE) - 0x3F

btfss STATUS, C ; test du bit C (Carry)

goto non ; C = 0 c'est-à-dire (REGISTRE) < 0x3F

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-9 - Le contenu du registre est-il strictement inférieur à une certaine valeur ?

(REGISTRE) < 0x3F ?

Les valeurs sont supposées en binaire naturel.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movlw 0x3F ; W = 0x3F subwf REGISTRE, W ;
Programmation des Microcontroleurs (PIC) EL MORNAN movlw 0x3F ; W = 0x3F subwf REGISTRE, W ;

movlw 0x3F ; W = 0x3F

subwf REGISTRE, W ; W = (REGISTRE) - 0x3F

btfsc STATUS, C ; test du bit C (Carry)

goto non ; C = 1 c'est-à-dire (REGISTRE) >= 0x3F

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-10 - Le contenu du registre est-il inférieur ou égal à une certaine valeur ?

(REGISTRE) <= 0x3F ?

Les valeurs sont supposées en binaire naturel.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE , W ; W = (REGISTRE) sublw 0x3F
Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE , W ; W = (REGISTRE) sublw 0x3F

movf REGISTRE , W ; W = (REGISTRE)

sublw 0x3F ; W = 0x3F - (REGISTRE)

btfss STATUS, C ; test du bit C (Carry)

goto non ; C = 0 c'est-à-dire 0x3F < (REGISTRE)

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-11 - Le contenu du registre est-il supérieur ou égal au contenu d'un autre registre ?

(REGISTRE1) >= (REGISTRE2) ?

Les valeurs sont supposées en binaire naturel.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE2 , W ; W = (REGISTRE2) subwf REGISTRE1,
Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE2 , W ; W = (REGISTRE2) subwf REGISTRE1,

movf REGISTRE2 , W ; W = (REGISTRE2)

subwf REGISTRE1, W ; W = (REGISTRE1) - (REGISTRE2)

btfss STATUS, C ; test du bit C (Carry)

goto non ; C = 0 c'est-à-dire (REGISTRE1) < (REGISTRE2)

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-4-12 - Le contenu du registre est-il strictement inférieur au contenu d'un autre registre ?

(REGISTRE1) < (REGISTRE2) ?

Les valeurs sont supposées en binaire naturel.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE2 , W ; W = (REGISTRE2) subwf REGISTRE1,
Programmation des Microcontroleurs (PIC) EL MORNAN movf REGISTRE2 , W ; W = (REGISTRE2) subwf REGISTRE1,

movf REGISTRE2 , W ; W = (REGISTRE2)

subwf REGISTRE1, W ; W = (REGISTRE1) - (REGISTRE2)

btfsc STATUS, C ; test du bit C (Carry)

goto non ; C = 1 c'est-à-dire (REGISTRE1) >= (REGISTRE2)

{ bloc d'instructions 1 }

goto suite

non

{ bloc d'instructions 2 }

suite

{ suite du programme }

9-5- Boucle Do While

Exemple :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN debut { bloc d'instructions } movf REGISTRE , f btfsc
Programmation des Microcontroleurs (PIC) EL MORNAN debut { bloc d'instructions } movf REGISTRE , f btfsc

debut

{ bloc d'instructions }

movf REGISTRE , f

btfsc STATUS , Z

goto debut

suite

{ suite du programme }

9-6- Boucle While

Exemple :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN debut movlw 0xE8 ; W = 0xE8 subwf REGISTRE, W
Programmation des Microcontroleurs (PIC) EL MORNAN debut movlw 0xE8 ; W = 0xE8 subwf REGISTRE, W

debut

movlw 0xE8 ; W = 0xE8

subwf REGISTRE, W ; W = (REGISTRE) - 0xE8

btfss STATUS , Z

goto suite

{ bloc d'instructions }

goto debut

suite

{ suite du programme }

9-7- Boucle FOR

Une variable (1 octet) sert de compteur.

Exemple :

Pour exécuter le bloc d'instructions 20 fois, la valeur initiale du compteur doit être 21 :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movlw D'21' ; W = D'21' movwf COMPTEUR ; (COMPTEUR)
Programmation des Microcontroleurs (PIC) EL MORNAN movlw D'21' ; W = D'21' movwf COMPTEUR ; (COMPTEUR)

movlw D'21' ; W = D'21'

movwf COMPTEUR ; (COMPTEUR) = D'21' pour 20 boucles

debut

decfsz COMPTEUR , f ; (COMPTEUR) = (COMPTEUR) - 1

goto boucle ; (COMPTEUR) != 0

goto suite ; (COMPTEUR) = 0

boucle

{ bloc d'instructions }

goto debut

suite

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN { suite du programme } N.B. Avec (COMPTEUR) = 0xFF

{ suite du programme }

N.B. Avec (COMPTEUR) = 0xFF en valeur initiale, on effectue 254 boucles.

Avec (COMPTEUR) = 0x00 en valeur initiale, on effectue 255 boucles.

Avec (COMPTEUR) = 0x01 en valeur initiale, on effectue 0 boucle.

9-8- Manipulation de bits. Les masques

9-8-1- Mettre à 0 certains bits d'un registre

Exemple : on veut mettre à 0 les bits 1, 2, 4 et 6, les autres bits étant inchangés :

B'u0u0u00u'

movlw B'10101001' ; W = B'10101001' (on appelle ça un masque)

andwf REGISTRE , f ; fonction ET logique

Valeur initiale : (REGISTRE) = B'11010101'

Valeur finale : (REGISTRE) = B'10000001'

N.B. S'il n'y a qu'un seul bit à mettre à 0, il faut simplement utiliser l'instruction bcf.

S'il faut mettre tous les bits à 0, il faut simplement utiliser l'instruction clrf REGISTRE

9-8-2- Mettre à 1 certains bits d'un registre

Exemple : on veut mettre à 1 les bits 1, 2, 4 et 6, les autres bits étant inchangés :

B'u1u1u11u'

movlw B'01010110' ; W = B'01010110' (masque)

iorwf REGISTRE , f ; fonction OU logique

Valeur initiale : (REGISTRE) = B'11010101'

Valeur finale : (REGISTRE) = B'11010111'

N.B. s'il n'y a qu'un seul bit à mettre à 1, il faut simplement utiliser l'instruction bcf

9-8-3- Inverser certains bits d'un registre

Exemple : on veut complémenter les bits 1, 2, 4 et 6, les autres bits étant inchangés.

movlw B'01010110' ; W = B'01010110' (masque)

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN xorwf REGISTRE , f ; fonction logique OU exclusif Valeur

xorwf REGISTRE , f ; fonction logique OU exclusif

Valeur initiale : (REGISTRE) = B'11010101'

Valeur finale : (REGISTRE) = B'10000011'

N.B. s'il faut inverser tous les bits, il faut simplement utiliser l'instruction

comf REGISTRE , f

9-9- Tables de données

On utilise la technique de l'adressage relatif.

Exemple :

On désire effectuer l'opération arithmétique : y = 10x +1

Ainsi, pour x =D'16' : y = D'161'

Cela peut se faire simplement avec un tableau de données.

On commence par créer la routine table.

Pour des raisons de simplicité, l'adresse de début de cette routine peut être (pour un microcontrôleur 16F84A) :

0x100

0x200

0x300

; xxxxxxxxxxx

; Routine table

; xxxxxxxxxxx

org 0x0300 ; adresse de début de la table

table

addwf PCL , f ; (PCL) = (PCL) + W

retlw D'1'

retlw D'11'

retlw D'21'

retlw D'31'

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN retlw D'41' retlw D'51' retlw D'61' retlw

retlw D'41'

retlw D'51'

retlw D'61'

retlw D'71'

retlw D'81'

retlw D'91'

retlw D'101'

retlw D'111'

retlw D'121'

retlw D'131'

retlw D'141'

retlw D'151'

retlw D'161'

retlw D'171'

retlw D'181'

retlw D'191'

retlw D'201'

retlw D'211'

retlw D'221'

retlw D'231'

retlw D'241'

retlw D'251'

; Fin de la routine table

; xxxxxxxxxxxxxxxxxx

Avec un début de routine à l'adresse 0x300, l'instruction retlw D'1' se trouve à l'adresse 0x301, retlw D'11' à l'adresse 0x302 etc

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN La table peut contenir jusqu'à 255 éléments (0x301 à 0x3FF).

La table peut contenir jusqu'à 255 éléments (0x301 à 0x3FF).

Ici, notre table possède 26 éléments donc pas de problème de taille.

Dans le programme principal, pour appeler la routine, il faut au préalable charger le registre spécial

PCLATH avec la valeur 0x03 (0x02 si l'adresse de début est 0x200 etc

) :

movlw 0x03 ; W = 0x03

movwf PCLATH ; (PCLATH) = 0x03

movlw D'16' ; W = D'16' : 16ème ligne de la table

call table

movwf resultat ; (resultat) = D'161'

10. les étapes nécessaires pour programmer un pic :

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 11. Exemples en assembleur avec 16F84 11.1 Calcul de la

11. Exemples en assembleur avec 16F84

11.1 Calcul de la temporisation

Temporisation précise : utilisation du timer

Temporisation non précise : utilisation des boucles

A chaque fois que l’on désire fabriquer une temporisation, il faut calculer le temps machine nécessaire pour exécuter cette temporisation afin de déterminer la valeur exacte de la temporisation.

Sachant que l’horloge interne divise par quatre la fréquence issue du quartz.

Prenons l’exemple d’une temporisation avec un quartz de 4Mhz : l’instruction GOTO TEMPO dure 2 cycles , et l’instruction DECFSZ 1cycle. Le compteur (retard) est initialisé à 255. Le PIC fera 255 fois la boucle de temporisation : la temporisation est donc 3*255=765µs(3cycles *255*1µs)

11.2 Exemple d’une temporisation de 0.2s

;------------

Définition des registres temporaires

---------------

retard1

EQU

0x0C

; le registre temporaire retard1 se trouve à l' adresse 0C

retard2

EQU

0x0F

; le registre temporaire retard2 se trouve à l' adresse 0F

;------------

Programme de temporisation ( 0.2 s )

---------------

MOVLW 0xFF

MOVWF retard1

; on met 255 dans le registre W

; on charge retard1 avec 255 ( FFh contenu du registre W )

MOVWF retard2

tempo

; on charge retard2 avec 255 ( FFh contenu du registre W )

DECFSZ retard1,F

; on décrémente retard1 et on saute la prochaine instruction si

GOTO tempo

; le registre retard1 = 0 sinon retour à tempo

MOVLW 0xFF

; on met 255 dans le registre W

MOVWF retard1

DECFSZ retard2,F

; on charge retard1 avec 255 ( FFh contenu du registre W )

; on décrémente retard1 et on saute la prochaine instruction si

GOTO tempo

; le registre retard1 = 0 sinon retour à tempo

RETURN

; retour au programme principal après l 'instruction CALL

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 11.3 Exemple de temporisateur interne utilisant le Timer ; Titre

11.3 Exemple de temporisateur interne utilisant le Timer

; Titre : TIMER du PIC

; PIC utilisé : PIC 16 F 84

; on utilise le timer pour avoir une temporisation multiple de la seconde

; si le registre OPTION =

;

04 --> 1 S

;

05 --> 4 S

;

07 --> 8 S

;

03 --> 0.5 S

;

02 --> 0.25 S

;

01 --> 0.0125 S

;

00 --> 0.00625 S

;

le timer fonctionne avec la fréquence interne Q = 4 MHz

;------------

Directive d' assemblage pour PLAB

---------------

list

p=16f84A

#include p16f84A.inc

config H'3FF9'

;------------

Définition des constantes

---------------

W

EQU

0x00

; variable W = 0

F

EQU

0x01

; variable F = 1

;------------

Définition des registres temporaires

---------------

retard1

EQU

0x0C

; le registre temporaire retard1 se trouve à l' adresse 0C

key

EQU

0x12

OPTION_REG

EQU

H'0081'

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN ;------------ Init des ports A et B --------------- ORG 0

;------------ Init des ports A et B

---------------

ORG 0

bsf STATUS,5

; on met à 1 le 5eme bit du registre status pour accéder

 

;

à la 2eme page mémoire ( pour trisa et trisb et OPTION )

MOVLW 0x00

; on met 00 dans le registre W

MOVWF TRISB

MOVLW 0x1F

MOVWF TRISA

; on met 00 dans le port B il est programmé en sortie

; on met 1F dans le registre W

; on met 1F dans le port A il est programmé en entrée

MOVLW 0x07

MOVWF OPTION_REG

; on met 07 dans le registre W

; on met 07 dans le registre OPTION ( 8 secondes )

; 1MHz / 256 = 3.906 kHz

bcf STATUS,5

clrf PORTB

; on remet à 0 le 5eme bit du registre status pour accéder

; à la 1eme page mémoire

clrf key

;-------------------- Programme principal

debut

----------------------

MOVLW 0x06

MOVWF TMR0

; on met 06 dans le registre W

; on met W dans le registre du TIMER 0

; le timer comptera jusqu' à 256 - 6 = 250

; 3.906 kHz / 250 = 15.624 Hz

MOVLW 0x7D

MOVWF retard1

; on met 7D ( 125 ) dans le registre W

; on met W dans le registre retard1

; 15.624 Hz / 125 = 0.124992 Hz et 1/0.12 = 8 S

call tempo

COMF key,f

; on complémente le registre key

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN   movf key,w movwf PORTB ; change l 'état des
 

movf key,w

movwf PORTB

; change l 'état des leds à chaque fois que la tempo est finie

goto debut

tempo

 

movf TMR0,w

btfss STATUS,2

;test du bit Z

goto tempo

MOVLW 0x06

; on met 06 dans le registre W

MOVWF TMR0

DECFSZ retard1,F

; on met W dans le registre du TIMER 0

; on décrémente retard1 et on saute la prochaine instruction si

GOTO tempo

; le registre retard1 = 0 sinon retour à tempo

return

END

11.4 Exemple d'application: Un compteur binaire

END 11.4 Exemple d'application: Un compteur binaire ; Titre : Compteur binaire ; PIC utilisé :

; Titre : Compteur binaire ; PIC utilisé : PIC 16 F 84

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN ; On réalise un compteur binaire sur les broches RB0

; On réalise un compteur binaire sur les broches RB0 à RB7 d' un PIC 16 F 84 le quartz utilisé ; est de 4 Mhz , on effectue une tempo environ égale à 0.2 seconde.

;------------ Directive d' assemblage pour MPLAB

---------------

list

#include p16f84A.inc

p=16f84A

config H'3FF9'

;------------

#define inter0 0

Définition des constantes

--------------- ; bouton marche

;------------

Définition des registres temporaires

retard1

EQU

0x0C

--------------- ; le registre temporaire retard1 se trouve à l' adresse 0C

retard2

EQU

0x0D

; le registre temporaire retard2 se trouve à l' adresse 0D

memo

EQU

0x0E

; le registre memo tampon se trouve à l' adresse 0E

;------------

Init des ports A et B

---------------

ORG 0

bsf STATUS,5

; on met à 1 le 5eme bit du registre status pour accéder

MOVLW B'00000000' MOVWF TRISB MOVLW 0x1F MOVWF TRISA bcf STATUS,5

; à la 2eme page mémoire ( pour trisa et trisb ) ; on met 00 dans le registre W ; on met 00 dans le port B il est programmé en sortie ; on met 1F dans le registre W ; on met 00 dans le port A il est programmé en entrée ; on remet à 0 le 5eme bit du registre status pour accéder ; à la 1ere page mémoire

;------------

Programme principal

---------------

Main

btfss PORTA,inter0

; interrupteur 0 ( marche ) appuyé ? si oui on continu sinon

goto Main

; on va à l' étiquette Main

MOVLW

0xFF

; on met 255 dans le registre W

MOVWF retard1

; on charge retard1 avec 255 ( FFh contenu du registre W )

MOVLW

0xFF

; on met 255 dans le registre W

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN MOVWF retard2 MOVF memo, W MOVWF PORTB CALL tempo MOVLW

MOVWF retard2 MOVF memo, W MOVWF PORTB CALL tempo

MOVLW 0x01 ADDWF memo, F GOTO Main

; on charge retard2 avec 255 ( FFh contenu du registre W ) ; on met memo dans W ; on met W sur le port B ( leds ) ; on appel la temporisation ; on met 1 dans le registre W ; on additionne memo + 1 ; retour au début du programme ---------------

;------------

tempo DECFSZ retard1,F GOTO tempo MOVLW 0xFF MOVWF retard1 DECFSZ retard2,F GOTO tempo RETURN END

Programme de temporisation ( 0.2 s )

; on décrémente retard1 et on saute la prochaine instruction si ; le registre retard1 = 0 sinon retour à tempo ; on met 255 dans le registre W ; on charge retard1 avec 255 ( FFh contenu du registre W ) ; on décrémente retard1 et on saute la prochaine instruction si ; le registre retard1 = 0 sinon retour à tempo ; retour au programme principal après l 'instruction CALL ; fin du programme

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN 11.5 Exemple d'application: Les feux tricolores ; Titre : Feux

11.5 Exemple d'application: Les feux tricolores

MORNAN 11.5 Exemple d'application: Les feux tricolores ; Titre : Feux tricolores PIC utilisé : PIC

; Titre : Feux tricolores

PIC utilisé : PIC 16 F 84

; On réalise des feux tricolores sur les broches RB0 à RB5 d' un PIC 16 C 84

; le quartz est de 4 Mhz , on effectue une tempo longue environ égale à 4 secondes et

; une tempo courte environ égale à 1.5 secondes.

; un bouton marche sur le port A permet de lancer l' application

; RB0=rouge1 RB1=orange1 RB2=vert1

; RB3=rouge2 RB4=orange2 RB5=vert2

;------------ Directive d' assemblage pour PLAB

---------------

list p=16f84A

#include p16f84A.inc

config

;------------

H'3FF9'

Définition des constantes

--------------- ; bouton marche ; bouton clignotement orange

#define inter0 0 #define inter1 1

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN ;------------ Définition des registres temporaires retard1

;------------

Définition des registres temporaires

retard1

EQU

0x0C

--------------- ; le registre temporaire retard1 se trouve à l' adresse 0C

retard2

EQU

0x0F

; le registre temporaire retard2 se trouve à l' adresse 0F

retard3

EQU

0x10

; le registre temporaire retard3 se trouve à l' adresse 10

;------------

Init des ports A et B

---------------

ORG 0

bsf STATUS,5

MOVLW 0x00 MOVWF TRISB MOVLW 0x1F MOVWF TRISA bcf STATUS,5

; on met à 1 le 5eme bit du registre status pour accéder ; à la 2eme page mémoire ( pour trisa et trisb ) ; on met 00 dans le registre W ; on met 00 dans le port B il est programmé en sortie

; on met 1F dans le registre W ; on met 1F dans le port A il est programmé en entrée ; on remet à 0 le 5eme bit du registre status pour accéder ; à la 1eme page mémoire

;------------ Init des feux ROUGE1 et ROUGE2 ---------------

MOVLW B'00001001'

MOVWF PORTB

; on met 0C dans le registre W ( Rouge1 et Rouge2 )

; on met W sur le port B ( led )

;-------------------- Programme principal

debut MOVLW B'00001001'

----------------------

; on met 0C dans le registre W ( Rouge1 et Rouge2 )

MOVWF PORTB

btfss PORTA,inter0 ; interrupteur 0 ( marche ) appuyé ? si oui on continu sinon

; on met

W sur le port B ( led )

;va à debut

goto debut ret_cli btfsc PORTA,inter1

; interrupteur 1 ( clignotant ) appuyé ? si oui on ;va à clignote

goto clignote

MOVLW B'00001001'

MOVWF PORTB

; on met 0C dans le registre W ( Rouge1 et Rouge2 ) ; on met W sur le port B ( led )

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN ;--------------- Chargement de la temporisation ---------------------

;--------------- Chargement de la temporisation ---------------------

CALL tempo

MOVLW B'00001100'

MOVWF PORTB

CALL tempo

MOVLW B'00001010'

MOVWF PORTB

CALL tempo2 MOVLW B'00001001'

MOVWF PORTB

; on appel la temporisation 1 ( longue ) ; on met 0C dans le registre W ( Vert1 et Rouge2 ) ; on met W sur le port B ( led ) ; on appel la temporisation 1 ( longue )

; on met 0A dans le registre W ( Orange1 et Rouge2 )

; on met

W sur le port B ( led )

; on appel la temporisation courte ; on met 0C dans le registre W ( Rouge1 et Rouge2 )

; on met

W sur le port B ( led )

CALL tempo2

; on appel la temporisation courte

MOVLW B'00100001'

; on met 24 dans le registre W ( Rouge1 et Vert2 )

MOVWF

PORTB

; on met W sur le port B ( led )

CALL tempo MOVLW B'00010001'

; on appel la temporisation longue ; on met 14 dans le registre W ( Rouge1 et Orange2 )

MOVWF

PORTB

; on met W sur le port B ( led )

CALL tempo2

; on appel la temporisation courte

GOTO debut

;------------

; retour au début du programme ---------------

Programme de temporisation longue

tempo MOVLW 0xFF MOVWF retard1 MOVWF retard2 MOVLW 0x12 MOVWF retard3 attente DECFSZ retard1,F GOTO attente

; on met ff dans le registre W ; on met W dans le registre retard1 ; on met W dans le registre retard2 ; on met 12 dans le registre W ; on met W dans le registre retard3

; on décrémente retard1 et on saute la prochaine instruction si ; le registre retard1 = 0 sinon retour à attente

movlw 0xFF

; on recharge retard1

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN movwf retard1 DECFSZ retard2,F GOTO attente movlw 0xFF movwf retard2

movwf retard1 DECFSZ retard2,F GOTO attente

movlw 0xFF

movwf retard2 DECFSZ retard3,F GOTO attente RETURN

; on décrémente retard2 et on saute la prochaine instruction si ; le registre retard2 = 0 sinon retour à attente

; on recharge retard2

; on décrémente retard3 et on saute la prochaine instruction si ; le registre retard3 = 0 sinon retour à attente ; retour au programme principal après l 'instruction CALL

;------------

Programme de temporisation courte

---------------

tempo2

MOVLW 0xFF MOVWF retard1 MOVWF retard2 MOVLW 0x07 MOVWF retard3

attente2

; on met ff dans le registre W ; on met W dans le registre retard1 ; on met W dans le registre retard2 ; on met 7 dans le registre W ; on met W dans le registre retard3

DECFSZ retard1,F GOTO attente2 movlw 0xFF movwf retard1 DECFSZ retard2,F GOTO attente2

movlw 0xFF

; on décrémente retard1 et on saute la prochaine instruction si ; le registre retard1 = 0 sinon retour à attente2 ; on recharge retard1

; on décrémente retard2 et on saute la prochaine instruction si ; le registre retard2 = 0 sinon retour à attente2

; on recharge retard2

movwf retard2 DECFSZ retard3,F GOTO attente2 RETURN clignote MOVLW B'00010010'

; on décrémente retard3 et on saute la prochaine instruction si ; le registre retard3 = 0 sinon retour à attente2

; on met 12 dans le registre W ( Orange1 et Orange2 )

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN MOVWF PORTB CALL tempo2 MOVLW B'00000000' MOVWF PORTB ; on

MOVWF PORTB

CALL tempo2

MOVLW B'00000000'

MOVWF PORTB

; on met W sur le port B ( led )

; on appel la temporisation courte

; on met 00 dans le registre W ( aucune led )

; on met W sur le port B ( led )

CALL tempo2

; on appel la temporisation courte

GOTO ret_cli

END

11.6 Exemple d'application: La perceuse

Cycle effectué par la perceuse

1) Dès l'appui sur le bouton départ cycle, la

perceuse se met en rotation puis descend.

Les leds "descente" et "rotation" sont

allumées.

2) Dès que le capteur de position bas est actionné, la perceuse remonte après une

Les leds "montée" et "rotation" sont

allumées.

temporisation de 3s.

3) Dès que le capteur de position haut est

temporisation de 3s la rotation s'arrête.

actionné, la remontée s'arrête. Après une

Fin de cycle.

Arrêt d'urgence

4) Si l'arrêt d'urgence est actionné, la

rotation s'arrête et la perceuse remonte

quel que soit l'endroit où

l'on se trouve

Tant que l'arrêt d'urgence est appuyé le

dans le cycle.

La led "défaut" est allumée et mémorise

cycle ne peut démarrer.

jusqu'au prochain départ cycle.

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN ; Titre : Perceuse ; PIC utilisé : PIC 16
Programmation des Microcontroleurs (PIC) EL MORNAN ; Titre : Perceuse ; PIC utilisé : PIC 16

; Titre : Perceuse

; PIC utilisé : PIC 16 F 84

; On réalise une simulation d’une perceuse en utilisant les broches RB0 à RB3

; pour le bouton marche, le coup de poing d' arrêt d'urgence et les deux fin de

; course haut et bas.

; Les broches RB4 à RB7 représentent la rotation, la montée et la descente.

; Entrées : RB0= Arrêt

; Sorties : RB1= Rotation RB2= Descente

; Cycle :

; 1) appui sur marche -> rotation + descente

; 2) capteur bas actionné -> temporisation et rotation + remontée

; 3) capteur haut actionné -> rotation + temporisation et arrêt rotation

; Arrêt d'urgence : La perceuse s'arrête de tourner et remonte, un voyant défaut mémorise

; l' action. Le voyant défaut s' efface au prochain cycle.

;------------ Directive d' assemblage pour PLAB

RA0= Marche

RA1= Capteur haut RB3= Montée

RA2= Capteur bas RB4= Défaut mémorisé

---------------

list p=16f84A #include p16f84A.inc

Programmation des Microcontroleurs (PIC)

EL MORNAN

Programmation des Microcontroleurs (PIC) EL MORNAN config H'3FF9' ;------------ Définition des

config

H'3FF9'

;------------

Définition des constantes