Module Microcontroleurs [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

Informatique industrielle (microcontrôleurs)

EL MORNAN

Page 1

Informatique industrielle (microcontrôleurs)

EL MORNAN

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 d'adresses

Bus de contrôle

Figure 0-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. Page 2

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

Introduction Un PIC est un microcontrôleur, c’est une unité de traitement de l’information de type microprocesseur à laquelle on a ajouté des périphériques internes permettant de réaliser des montages sans nécessiter l’ajout de composants externes. Les PICs sont des composants dits RISC (Reduce Instructions Construction Set), ou encore composant à jeu d’instructions réduit. L'avantage est que plus on réduit le nombre d’instructions, plus facile et plus rapide en est le décodage, et plus vite le composant fonctionne. La famille des PICs est subdivisée en 3 grandes familles : La famille Base-Line, qui utilise des mots d’instructions (nous verrons ce que c’est) de 12 bits, la famille MidRange, qui utilise des mots de 14 bits (et dont font partie la 16F84 et 16F876), et la famille High-End, qui utilise des mots de 16 bits Nous nous limiterons dans ce document à la famille Mid-Range et particulièrement au PIC 16F84, sachant que si on a tout assimilé, on pourra facilement passer à une autre famille, et même à un autre microcontrôleur. Pour identifier un PIC, on utilise simplement son numéro :  Les 2 premiers chiffres indiquent la catégorie du PIC, 16 indique un PIC Mid-Range.  Vient ensuite parfois une lettre L, celle-ci indique que le PIC peut fonctionner avec une plage de tension beaucoup plus tolérante.  Vient en suite une ou deux lettres pour indiquer le type de mémoire programme :

-

C indique que la mémoire programme est une EPROM ou plus rarement une EEPROM CR pour indiquer une mémoire de type ROM F pour indiquer une mémoire de type FLASH.

 

On trouve ensuite un nombre qui constitue la référence du PIC. On trouve ensuite un tiret suivi de deux chiffres indiquant la fréquence d’horloge maximale que le PIC peut recevoir.

Donc, un 16F84-04 est un PIC Mid-Range donc la mémoire programme est de type FLASH de référence 84 et capable d’accepter une fréquence d’horloge de 4MHz. Notez que les PICs sont des composants STATIQUES, c’est à dire que la fréquence d’horloge peut être abaissée jusque l’arrêt complet sans perte de données et sans dysfonctionnement. Une version –10 peut donc toujours être employée sans problème en lieu et place d’une –04. Pas l’inverse, naturellement.

Pourquoi choisir un PIC ?      

Les performances sont identiques voir supérieurs à ses concurrents Les prix sont les plus bas du marché Les outils de développement sont gratuits et téléchargeables sur le WEB Le jeu d'instruction réduit est souple, puissant et facile à maîtriser Les versions avec mémoire flash présentent une souplesse d'utilisation et des avantages pratiques indéniables La communauté des utilisateurs des PICs est très présente sur le WEB. On trouve sur le net quasiment tout ce dont on a besoin, tutoriaux pour démarrer, documents plus approfondis, schémas de programmeurs avec les logiciels qui vont avec, librairies de routines, forums de discussion . . .

Le PIC 16F84 Les caractéristiques principales du 16F84 sont :  Une mémoire programme de type flash de 1K (1024) mots de 14 bits  Une mémoire RAM constituée des registres du microcontrôleur ainsi qu'une mémoire de données libre de 68 octets.  Une mémoire EEPROM de 64 octets  Deux ports d'entrée sortie, un de 8 bits et un de 5 bits  Un timer/Compteur  Un chien de garde / compteur  4 sources d'interruption  4 types d'oscillateurs sélectionnables  Protection de code  Fonctionnement en mode sleep pour réduction de la consommation  Programmation par mode ICSP (In Circuit Serial Programming)

Aspect externe du 16F84 RA2 RA3 RA4/T0CKI MCLR VSS RB0/INT RB1 RB2 RB3

1 18 2 17 3 16 4 PIC 15 5 16F8X 14 6 13 7 12 8 11 9 10

Fig. 0-1 : brochage du 16 F84

RA1 RA0 OSC1 OSC2 Vdd RB7 RB6 RB5 RB4

Les éléments essentiels du 16F84

EEPROM de configuration, 14 bits

PORTB

PORTA

Mémoire EEPROM RA4 Horloge système /4

RAM 16 registres systèmeMémoire (SFR) programme

TOSE

de type Flash 68 octets de RAM utilisateur

1

0

TOCS 0

Prescaler

1

TMR0

0 1

WDT

1

1024 mots de 14 bits

0

Horloge WDT

PSA

Fig. 0-2 : les éléments essentiels du 16F84

La mémoire programme (flash) Cette mémoire de 1024 mots stocke le programme. L'emplacement de celui-ci peut se trouver à n'importe quel endroit de la mémoire. Cependant il faut savoir que suite à un RESET ou lors de la mise sous tension, le PIC commence l'exécution à l'adresse 0000H. De plus, lorsqu'il y a une interruption, le PIC va à l'adresse 0004H. Il est donc conseillé de placer le début du programme après l'adresse 0004H et de mettre un branchement au début du programme à l'adresse 0000H et un branchement au début de la routine d'interruption s'il y en a une à l'adresse 0004H.

La mémoire RAM - Rrgistres La mémoire RAM est constituée de deux parties : 



Les registres SFR (Special Function Register), ce sont les registres de fonctionnement du PIC. L'ensemble de ces registres est souvent appelé fichier des registres. Nous reviendrons sur ces registre un peu plus loin dans ce document.

Les registres GPR (General Propose Register) sont des positions mémoire que l'utilisateur peut utiliser pour stocker ses variables et ces données. On remarquera donc que, indépendamment de leur nature, les position de la RAM sont toujours appelé registres La mémoire RAM est organisée en deux banks, pour accéder à un registre, il faut d'abord se placer dans le bank où il se trouve. Ceci est réalisé en positionnant le bit 0 appelés RP0 du registre STATUS.

bank 0

bank 1

00

INDF

INDF

80

01

TMR0

OPTION

81

02

PCL

PCL

82

03

STATUS

STATUS

83

04

FSR

FSR

84

05

PORTA

TRISA

85

06

PORTB

TRISB

86

07

87

08

EEDATA

EECON1

88

09

EEADR

EECON2

89

0A

PCLATH

PCLATH

8A

0B

INTCON

INTCON

8B

0C

8C

.

Mémoire

.

utilisateur

Maped in bank0

. .

.

.

2F

AF Tableau 0.1 : les registres et la RAM du 16F84

Pour la mémoire utilisateur, l'utilisation des pages (Bank ) n'est pas nécessaire puisque le Bank 1 est "mapped" avec le Bank0. Cela signifie qu'écrire une donnée à l'adresse 0CH ou à l'adresse 8CH revient au même.

LES PORTS D' E/S PORTA ET PORTB Le PORTA est un port de 5 bits (RA0 à RA4). Chaque E/S est compatible TTL. La configuration de direction pour chaque BIT du port est déterminée avec le registre TRISA. La broche RA4 est une sortie à drain ouvert. En entrée, elle est multiplexée avec l'entrée d'horloge du timer TMR0, elle est donc soit une entrée du port A, soit l'entrée horloge du Timer TMR0, le choix se fait à l'aide du bit T0CS du registre OPTION. Le choix du front d'incrémentation du timer se fait par le bit T0SE de ce même registre. Le PORTB est un port bidirectionnel de 8 bits. Toutes les broches sont compatibles TTL. La configuration de direction se fait à l'aide du registre TRISB.

Toutes les entrées du port B peuvent être pourvues de “ résistances ” de tirage (weak pull up) validées par le bit RBPU du registre OPTION. Le pull up est désactivé à la mise sous tension et quand le E/S sont programmées en sorties En entrée, la ligne RB0 appelée aussi INT peut déclencher l’interruption externe INT. En entrée, une quelconque des lignes RB4 à RB7 peut déclencher l'interruption RBI.

Le Timer TMR0 C’est un compteur libre de 8 bits incrémenté en permanence par l’horloge interne Fosc/4/Prescaler ou par la broche RA4 du port A, dans ce cas, le bit TOSE du registre OPTION sélectionne le front actif. Le Prescaler est géré par les bits PSA, PS0, PS1 et PS2 du registre OPTION. Toute écriture dans le registre TMR0 inhibe l’incrémentation du compteur TMR0 pendant deux cycles d’horloge. Le débordement de TMR0 (FF 00) peut déclencher l'interruption T0IE.

Le Timer Watchdog WDT (Chien de garde) C’est un compteur incrémenté en permanence (même si le µC est en mode sleep) par une horloge RC intégrée indépendante de l'horloge principale. Lorsqu’il ce compteur, arrive déborde, (WDT TimeOut), deux situations sont possibles : 

Si le µC est en fonctionnement normal, le WDT time-out provoque un RESET. Ceci permet d’éviter de rester planté en cas de blocage du microcontrôleur par un processus indésirable non contrôlé. Pour éviter un WDT time-out lors de l'exécution d'un programme, on a deux possibilités : - Inhiber le WDT d'une façon permanente en mettant à 0 le bit WDTE du mot de configuration - Remettre le WDT à 0 périodiquement dans le programme à l'aide de l'instruction CLRWDT pour éviter qu'il ne déborde 

Si le µC est en mode SLEEP, il est alors "réveillé" par WDT time-out et l'exécution du programme continue normalement. Cette situation est souvent exploitée pour réaliser des temporisations

Durée du time-out Le Time Out vaut en principe 18 ms. Il est cependant réglable au moyen d’un pré diviseur (Prescaler) programmable entre 1 et 128 à l'aide des bits PSA, PS0, PS1 et PS2 du registre OPTION..

L'Horloge

L'horloge peut être soit interne soit externe. L'horloge interne est constituée d'un oscillateur à quartz ou d'un oscillateur RC.

Avec l'oscillateur à Quartz, on peut avoir des fréquences allant jusqu'à 4, 10 ou 20 MHz selon le type de µC. Le filtre passe bas RS, C2 limite les harmoniques dus à l’écrêtage et Réduit l’amplitude de l’oscillation. (il n'est pas obligatoire)

Avec un relaxateur RC, Lorsque la tension aux bornes de Cext atteint le seuil haut du trigger de Schmitt, la sortie de celui-ci passe au niveau haut, le transistor MOS devient fortement conducteur et décharge Cext. Quand la tension au point OSC1 atteint le seuil bas, le transistor MOS se bloque et Cext se (re)charge de nouveau avec la constante de temps RC. Dans certains cas, une horloge externe au microcontrôleur peut être utilisée pour synchroniser le PIC sur un processus particulier. La broche OSC2 est alors inutilisée.

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. 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. 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 :

· 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 indiquant sur quelle page (bank), le microprocesseur travail en adressage direct (seul 7 bits d’adresses sont nécessaires). · Le bit IRP : Bit indiquant sur quelle page (bank), le microprocesseur travail en adressage indirect (8 bits d’adresses sont nécessaires).

Les directives les plus utilisées 



LIST : permet de définir le type de PIC utilisé, le format du fichier hex à produire ainsi que d'autres paramètres. Exemple : LIST p=16f84 INCLUDE : permet d'insérer un fichier source INCLUDE "p16f84.inc" INCLUDE

Page 10



CONFIG : permet de définir les fusibles de configuration (protection de code, type d'oscillateur, chien de garde et temporisation du départ)

Page 11

CONFIG

H'3FF9'

CONFIG B'11111111111001' si le fichier p16f84.inc a été inséré, on peut utiliser les constantes prédéfinies : CONFIG _CP_OFF & _XT_OSC & _PWRTE_OFF & _WDT_OFF

Bits (ou "fusibles") de configuration On se place dans le cadre de l'outil de développement MPLAB de Microchip. La synthaxe utilisée est alors : Nom

Valeurs possible s

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

CP

ON

programmateur) C'est une protection

Code Protection bit)

PWRTE

et de l'EEPROM (à travers un

OFF

contre le piratage industriel. Lecture possible

ON

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

(Power-up Timer Enable bit)

OFF

Temporisation désactivée

WDT

ON

Active le watchdog (chien de garde)

(Watchdog Timer Enable bit)

OFF

Il est conseillé d'utiliser cette configuration.

Oscillateur de type Résistance / Condensateur RC

OSC (Oscillator Selection bits)

Désactive le watchdog

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

HS XT LP

Oscillateur à quartz haute fréquence (4 MHz, 20 MHz ...). Oscillateur à quartz ou à résonateur céramique 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 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 

EQU : permet de définir une constante ou une variable : XX EQU 0x20 XX peut être soit une constante soit une variable, l'assembleur fait la correspondance correcte selon le contexte. Chaque fois que le compilateur rencontrera XX, il la remplacera soit par la constante 0x20 s'il s'agit d'un adressage immédiat, soit par le contenu de la mémoire 0x20 s'il s'agit d'un adressage directe  #DEFINE : définit un texte de substitution #DEFINE pos(x,y,z) (y-2z+x) chaque fois que le compilateur rencontrera le texte pos(x,y,z), il le remplacera par (y2z+x) 

ORG : définit la position dans la mémoire programme à partir de laquelle seront inscrites les instructions suivantes.



CBLOCK/ENDC : définit un bloc de constantes

CBLOCK 0X0C var1,var 2 k ENDC

; var1=0x0C, var2=0x0D, k=0x0D

DE : pour déclarer des donnés qui seront stockée dans l'EEPROM de donnée ORG DE

proc



0x2100 "Programmer un PIC, rien de plus simple", .70, 'Z'

DT : pour déclarer un tableau RETLW addwf

PCL,f

; saut à la position : (position suivante + W)

DT "Programmer un PIC",23,0x47 ; L'assembleur remplacera cette ligne par la suite d'instructions :

RTLW 'P' RTLW 'r'

RTLW 'o' . . . RTLW 'C' RTLW 23 RTLW 0x47



END : indique la fin du programme

Format des nombres L'assembleur reconnaît les nombres en décimal, hexadécimal, binaire ou octal. Pour préciser la base il faut utiliser les préfixes précisés dans le tableau ci-dessous : On peut à l'aide de la directive LIST ou RADIX définir un Base format par défaut. Si par exemple on place une des instructions suivantes au début du programme, tous les Décimal nombres sans préfix seront interprétés en décimal : LIST r = dec RADIX dec

Préfixe Exemple (36) D'nnn' D'36' .nnn

.36

H'nn

H'2

'

4'

0xn

0x2

Binaire

n B'….'

4 B'00100100'

Octal

O'nnn' O'44'

Hexadécim al

(les radix valables sont dec, hex ou oct)

Structure d'un programme écrit en assembleur Un programme écrit en assembleur doit respecter une certaine syntaxe et un certain nombre de règles afin qu'il soit facile à lire et à débuguer : 

Tout ce qui commence à la première colonne est considéré comme une étiquette (label) permettant de faire des renvois et aussi des assignations de constantes et de variables.



tout ce qui suit un point virgule est considéré comme un commentaire non interprété par le compilateur



Un programme apparaît donc comme un texte écrit sur 3 colonnes : - la colonne de gauche contient les étiquettes - la colonne du milieu contient les instructions - la colonne de droite contient des commentaires



Il existe différentes façons indiquant comment doit être organisé un programme. Voici un exemple d'organisation :

1) Quelques lignes de commentaire précisant la fonction du programme, 2) Configuration, exemple : LIST

p=16f84;f=inhx16m

INCLUDE

"p16f84.inc"

CONFIG H'3FF9' 3) Définition des constantes et des variables, exemple : led equ 0 x equ 0x0C cblock 0x0D y,z u,v,w endc 4) mettre à l'adresse 0000 (adresse du RESET) une instruction de branchement au début du programme principal : org 0 goto debut 5) mettre à l'adresse 0004 (adresse d'interruption) une instruction de branchement au début de la routine d'interruption : org call

4 interruption

Si le programme est configuré pour interdire les interruptions, on peut se passer de cette étape et même de la précédente et commencer le programme principal à l'adresse 0000 sans même l'utilisation de la directive ORG. 6) Ecrire les sous programmes et les sous programmes d'interruption 7) Ecrire le programme principal 8) terminer avec la directive END

LES INSTRUCTIONS DU 16F84 Tous les PICs Mid-Range ont un jeu de 35 instructions. Chaque instruction est codée sur un mot de 14 bits qui contient le code opération (OC) ainsi que l'opérande. A part les instructions de saut, toutes les instructions sont exécutées en un cycle d'horloge. Sachant que l’horloge fournie au PIC est pré divisée par 4 au niveau de celle-ci, si on utilise par exemple un quartz de 4MHz, on obtient donc 1000000 cycles/seconde, cela nous donne une puissance de l’ordre de 1MIPS (1 Million d’ Instructions Par Seconde). Avec une horloge de 20MHz, on obtient une vitesse de traitement plus qu’honorable.

1.3.4 Classement des instructions par nature

ADDWF

INSTRUCTIONS OPERANT SUR REGISTRE (direct) F,d W+F {W,F ? d}

Status

ANDWF

F,d

W and F {W,F ? d}

Z

1

CLRF

F

Clear F

Z

1

CLRW

Clear W

Z

1

CLRWDT

Clear Watchdog timer

C,DC,Z

TO', PD'

Cycles 1

1

COMF

F,d

Complémente F {W,F ? d}

Z

1

DECF

F,d

décrémente F {W,F ? d}

Z

1

DECFSZ

F,d

décrémente F {W,F ? d} skip if 0

INCF

F,d

incrémente F {W,F ? d}

INCFSZ

F,d

incrémente F {W,F ? d} skip if 0

IORWF

F,d

W or F {W,F ? d}

Z

1

MOVF

F,d

F {W,F ? d}

Z

1

MOVWF

F

W F

RLF

F,d

rotation à gauche de F a travers C {W,F ? d}

RRF

F,d

rotation à droite de F a travers C {W,F ? d}

SUBWF

F,d

F – W {W,F ? d}

SWAPF

F,d

permute les 2 quartets de F {W,F ? d}

XORWF

F,d

W xor F {W,F ? d}

1(2) Z

1 1(2)

1 C

1 1

C,DC,Z

1 1

Z

1

INSTRUCTIONS OPERANT SUR BIT BCF

F,b

RAZ du bit b du registre F

1

BSF

F,b

RAU du bit b du registre F

1

BTFSC

F,b

teste le bit b de F, si 0 saute une instruction

1(2)

BTFSS

F,b

teste le bit b de F, si 1 saute une instruction

1(2)

INSTRUCTIONS OPERANT SUR DONNEE (Immediat) ADDLW

K

W + K W

ANDLW

K

W and K W

Z

1

IORLW

K

W or K W

Z

1

MOVLW

K

K W

SUBLW

K

K – W W

XORLW

K

W xor K W

C,DC,Z

1

1 C,DC,Z Z

1 1

INSTRUCTIONS GENERALES CALL

L

Branchement à un sous programme de label L

2

GOTO

L

branchement à la ligne de label L

2

NOP

No operation

1

RETURN

retourne d'un sous programme

2

RETFIE

Retour d'interruption

2

retourne d'un sous programme avec K dans W

2

RETLW SLEEP

K

se met en mode standby

TO', PD'

1

Informatique industrielle (microcontrôleurs)

EL MORNAN

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. Exemple bcd7seg addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw

PCL,1 0x40 0x79 0x24 0x30 0x19 0x12 0x02 0x78 0x00 0x10

; ; ; ; ; ; ; ; ; ;

0 1 2 3 4 5 6 7 8 9

LA PILE La pile est une zone mémoire particulière. 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).

Informatique industrielle (microcontrôleurs)

EL MORNAN

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) ... problèmes que l'on retrouve exactement sur des programmes plus complexes (Windows de Microsoft ...).

LES OUTILS DE DÉVELOPPEMENT Les étapes nécessaires permettant de voir un programme s'exécuter sur un PIC sont :    

Ecrire un programme en langage assembleur dans un fichier texte et le sauvegarder avec l'extension .asm Compiler ce programme avec l'assembleur MPASM fourni par Microchip. Le résultat est un fichier avec l'extension .hex contenant une suite d'instruction compréhensible par le pic. Copier le fichier .hex dans la mémoire programme du PIC (mémoire flash) à l'aide d'un programmateur adéquat. On peut utiliser les programmateurs de Microchip ou tout autre programmateur acheté ou réalisé par soit même. Mettre le PIC dans son montage final, mettre sous tension et admirer le travail.

Microchip propose gratuitement l'outil de développement MPLAB qui regroupe l'éditeur de texte, le compilateur MPASM, un outil de simulation et le logiciel de programmation. Le programmateur lui-même, n'est malheureusement pas gratuit. Pour ce qui nous concerne, nous utiliseront MPLAB pour écrire, compiler et éventuellement simuler nos programmes, ensuite nous utiliserons un programmateur pour copier les programme dans la mémoire flash du PIC.

Les interruptions Une interruption provoque l’arrêt du programme en cours pour aller exécuter une procédure d'interruption. A la fin de cette procédure, le microcontrôleur reprend le programme à l’endroit où il s’était arrêté. Comme une interruption est un événement asynchrone, il faut alors sauvegarder (empiler) le contexte dans lequel se trouvait le microcontrôleur avant l’interruption, afin qu’il puisse reprendre correctement la continuité du programme. Le PIC16F84 possède 4 sources d'interruption. A chaque interruption sont associés deux bits. Un bit de validation et un drapeau. Le premier permet d'autoriser ou non l'interruption, le second permet au programmeur de savoir de quelle interruption il s'agit. Tous ces bits sont dans le registre INTCON à part le drapeau EEIF de l'interruption EEI qui se trouve dans le registre EECON1.

Page 18

Informatique industrielle (microcontrôleurs)

EL MORNAN

Déroulement d'une interruption Lorsque l'événement déclencheur d'une interruption intervient, alors son drapeau est positionné à un. Comme au début de chaque instruction le processeur vérifie les drapeaux, il verra le drapeau levé et vérifie alors si l'interruption en question a été validée. Si c'est le cas, l'interruption est déclenchée : le programme arrête ce qu'il est en train de faire et va exécuter la procédure d'interruption qui se trouve à l'adresse 4 :  l'adresse contenue dans le PC (Program Counter) est sauvegardée dans la pile, puis remplacée par la valeur 0004 (adresse de la routine d'interruption).  Le bit GIE est placé "0" pour inhiber toutes les interruptions (afin qu'on ne soit pas dérangés pendant l'exécution de la procédure d'interruption).  A la fin de la routine d'interruption (instruction RETFIE), le bit GIE est replacé à l'état haut (autorisant ainsi un autre événement)  le contenu du PC est rechargé à partir de la pile et le programme est repris là où on l'a laissé. Deux remarques importantes sont à faire :

Le drapeau reste à l’état haut même après le traitement de l’interruption. Par conséquen

Seul le PC est empilé. Si cela est nécessaire, les registres W et STATUS doivent alors être sauvegardés en RAM puis restaurés à la fin de la routine pour que le microcontrôleur puisse reprendre normalement le cours du programme.

L'interruption INT (Entrée RBO DU PORTB) Cette interruption est provoquée par un changement d'état sur l'entrée RB0 du port B quand elle est programmée en entrée. Elle est gérée par les bits : - INTE : bit de validation (1=oui, 0=non) - INTF : drapeau - INTEDG : front de déclenchement 1=montant, 0=descendant (registre OPTION)

L'interruption RBI (RB4 A RB7 DU PORTB) Cette interruption est provoquée par un changement d'état sur l'une des entrées RB4 à RB7 du port B, Le front n'a pas d'importance. Les bits associés sont RBIE (bit de validation) et RBIF (drapeau)

L'interruption TOI : Débordement du Timer TMR0 Cette interruption est provoquée par le débordement du timer TMR0. Les bits associés sont TOIE (bit de validation) et TOIF (drapeau)

L'interruption EEI : Fin d'écriture dans l'EEPROM Cette interruption est déclenchée à la fin d'une écriture réussie dans l'EEPROM. Les bits associés sont EEIE (validation) et EEIF (drapeau). Page 19

Sauvegarde et restauration du contexte de travail 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

Page 20

Page 21

L'Initialisation : RESET Le RESET peut avoir plusieurs causes : - Mise sous tension - Etat 0 sur broche MCLR - Débordement du timer du chien de garde. Lorsque le RESET intervient, le µC peut être : - En fonctionnement normal - En mode SLEEP. L'état des registres à la mise sous tension est donné par le tableau ci-dessous : Registre

- MCLR

Power-on RESET

- WDT on normal operation

Réveil d'un SLEEP

Pour le registre STATUS, voir tableau ci-dessous, Cause du RESET Mise sous tension

Etat avant Normal Sleep Normal Sleep

0 sur MCLR Chien de garde

TO 1 NA NA 0 0

PD 1 NA 0 1 0

Les registres de contrôle du 16F84 Le registre OPTION ou OPTION_REG (81H) Le registre d'OPTION contient les bits de contrôles du PRESCALER, de l'interruption externe INT, de l'horloge du timer TMR0 et du "tirage au plus" du PORT B. bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

r/w

r/w

r/w

r/w

r/w

r/w

r/w

r/w

RBPU

INTEDG

T0CS

T0SE

PSA

PS2

PS1

PS0

 BIT 0,1 et 2: Sélectionnent le ratio du PRESCALER. Ces trois bits déterminent le ratio du prescaler. Les timers TMR0 et WDT s'incrémente au rythme de l'horloge divisée par le prescaler

PS2

PS1

PS0

0

0

0

rati

rati

o

o

0

TMR 2

WD 1

0

1

4

2

0

1

0

8

4

0

1

1

16

8

1

0

0

32

16

1

0

1

64

32

1

1

0

128

64

1

1

1

256

128

Tableau : ratios du prescaler

 BIT 3: PSA ( PreScaler Assignment). Si PSA=1 alors le prescaler est associé avec le WDT. Si PSA=0 alors le prescaler est associé avec le TIMER.  BIT 4: T0SE ( TMR0 Source Edge). Ce bit détermine sur quel front l'entrée RA4 incrémentera le registre TMR0 T0SE=1 Front descendant. T0SE=0 Front montant.  BIT 5: T0CS ( TMR0 Clock Source) Ce bit permet de sélectionner l'horloge de TMR0. T0CS=1 sélection de l'horloge externe RA4 (PORTA). T0CS=0 sélection de l'horloge interne.  BIT 6: INTEDG ( INTerrupt EDGe) Si INTEDG=1 alors la broche RBO/INT génère une interruption sur un front montant. Si INTEDG=0 alors la broche RBO/INT génère une interruption sur un front descendant.  BIT 7: RBPU ( PORT B Pull-Up). RBPU=1 Le "tirage au plus" interne du PORT B est désactivé. RBPU=0 Le "tirage au plus" interne du PORT B est activé.

Le pull-up est désactivé à la mise sous tension et quand le port est configuré en sortie

Le registre INTCON (0B,8BH) Le registre INTCON contient tous les bits de validation et les drapeaux des différentes interruptions. bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

r/w

r/w

r/w

r/w

r/w

r/w

r/w

r/w

EEIE

TOIE

INTE

RBIE

TOIF

INTF

RBIF

GIE

Figure : registre INTCON



BIT 0: RBIF Drapeau de l'interruption RBI qui provient d'un changement d'état d'un des bits RB4 à RB7. RBIF= 1 : drapeau levé. RBIF= 0 : drapeau baissé.



BIT 1: INTF (INT interrupt Flag). Drapeau d'interruption INT qui provient d'un changement d'état de l'entrée RB0. RBIF=1 drapeau levé. RBIF=0 drapeau baissé.



BIT 2: TOIF ( TMRO Overflow Interrupt Flag). Drapeau de l'interruption TOI qui intervient au débordement du timer TMR0 TOIF=1 drapeau levé. TOIF=0 drapeau baissé.



BIT 3: RBIE (RB Interrupt Enable). Bit de validation de l'interruption RBI qui provient d'un changement d'état sur l'une des entrée RB4 à RB7 du port B. RBIE=1 : Autorise l'interruption. RBIE=0 : interdit l'interruption



BIT 4: INTE ( INT interrupt Enable). Bit de validation de l'interruption INT qui provient d'un changement d'état sur l'entrée RB0 du port B. INTE=1 : Valide l'interruption INT. INTE=0 : Interdit l'interruption INT.



BIT 5: TOIE (TMRO Overflow Interrupt Enable). Bit de validation de l'interruption TOI qui intervient au débordement du timer TMR0 TOIE = 1 : Valide l'interruption. TOIE= 0 : Interdit l'interruption.



BIT 6 : EEIE (EE write Interrupt Enable). Bit de validation de l'interruption EEI qui intervient à la fin d'une écriture dans l'EEPROM EEIE=1 : Valide l'interruption.

EEIE=0 : Interdit l'interruption Remarque : le drapeau de cette interruption se trouve dans le registre EECON1



BIT 7: GIE (Global Interrupt Enable). Bit de validation globale de toutes les interruptions. GIE=1 : chaque interruption dépendent de son propre bit de validation. GIE=0 : Toutes les interruption sont interdite.

Le registre STATUS (03,83H) Divisé en plusieurs blocks, il contient:

  

Les indicateur sur le résultat d'un calcul représenté par les bits d'état C, DC, et Z. Le status d'un RESET par l'intermédiaire des bits PD et TO. L'accès aux différents bancs de la mémoire par les bits IRP, RP1 et RP0

bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

r/w

r/w

r

r

r/w

r/w

r/w

r/w

IRP

RP1

RP0

TO

PD

Z

DC

C



BIT0: C (Carry). Il passe à "1" lorsque le résultat d'une opération dépasse la valeur FF ou d'un résultat négatif.



BIT1: DC (Digital Carry). il se positionne à "1" lorsque une retenue s'est produite entre les bit 3 et 4.



BIT2: Z (Zero). Quand il est à "1", il indique que le résultat de l'opération est nul.



BIT3: PD (Power-Down). PD=1 après un Power-up ou suite à l'instruction CLRWDT. PD=0 lorsque l'instruction SLEEP est exécutée.



BIT4: TO (Time-Out). Il passe à "1" après les instructions SLEEP et CLRWDT. Lorsque le WDT (chien de garde) déborde, ce bit passe à "0".



BIT5 et 6: RP0 et RP1 (bits de sélection de bancs). Avec ces 2 bits, on accède aux différents bancs de la mémoire.



RP1

RP0

BANC

ADRESSE

0

0

0

00 à 7F

0

1

1

80 à FF

1

0

2

100 à 17F

1

1

3

180 à 1FF

BIT7: IRP. Ce bit n'est pas utilisé avec le PIC16F84 et doit rester à "0".

Le registre TMR0 (01H) C’est le registre d'accès au TIMER/COMPTEUR TMT0.

Les registres FSR et INDF (04,84H et 00,80H). Les registres FSR et INDF permettent l'adressage INDIRECTE. Dans le registre FSR, on inscrit l'adresse de la case mémoire à laquelle on veut accéder. Le registre INDF devient alors une image de cette case mémoire. En résumé, toute lecture/écriture dans le registre INDF se fait dans la case mémoire pointée FSR (INDF = [FSR]).

Les registre EEADR(09H) et EEDATA (08H). Ces registres permettent d'accéder à la mémoire EEPROM avec un adressage indirect (exactement de la même façon que FSR et INDF). Une lecture/écriture dans de registre EEDATA se fait dans la position mémoire pointée par EEADR

Le registre EECON1 (88H) C'est un registre de contrôle de la mémoire EEPROM. Seuls les 5 bits de poids faible sont utilisés. bit 7



bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

r/w

r/w

r/w

w

w

EEIF

WRERR

WREN

WR

RD

Bit 0: RD (ReaD EEPROM). Lorsque ce bit est mis à "1", il indique au microcontrôleur que l'on souhaite une lecture de l'EEPROM. Apres le cycle de lecture, il est mis automatiquement à 0.



BIT 1: WR (WRite EEPROM). Lorsque ce bit est mis à "1", il indique au microcontrôleur que l'on souhaite une écriture dans l'EEPROM. Apres le cycle d'écriture, il est mis automatiquement à 0.



Bit 2: WREN (EEPROM WRite ENABLE). C'est un bit de confirmation d'écriture dans l'EEPROM. En effet, il ne suffit pas de définir un cycle d'écriture uniquement avec le bit WR. Il faut impérativement valider le bit WREN (WREN=1) pour autoriser une écriture.



Bit 3: WRERR (EEPROM WRite ERROR flag). Ce drapeau indique qu'une erreur c'est produite lors d'un cycle d'écriture dans l'EEPROM. WRERR=1 : une opération d'écriture a échoué. WRERR=0 : le cycle d'écriture c'est déroulé normalement.



Bit 4: EEIF ( EEPROM Interrupt Flag). Drapeau de l'interruption EEI qui intervient à la fin d'un cycle d'écriture réussi dans l'EEPROM. EEIF=1 : drapeau levé. EEIF= 0 : drapeau baissé.

Le registre EECON2 (89H). Ce registre de 8 bits est exclusivement utilisé pour les séquences d'écritures dans l'EEPROM. Il n'a pas d'adresse physique et la lecture de ce registre retourne une valeur nulle. C'est un registre de sécurité d’écriture en EEProm de données. Une donnée ne peut être écrite qu’après avoir écrit successivement 0x55 et 0xAA dans ce registre.

Le registre TRISA (85H). Le registre TRISA permet de configurer les E/S du PORTA en entrée ou en sortie. Si le bit associé est à "1", alors l'E/S est configurée en ENTREE. Si le bit est à "0", elle est configurée en SORTIE. Apres un RESET, toutes les E/S sont configurées en ENTREE. Comme le port A ne comporte que 5 bits, alors les bits 5, 6 et 7 ne sont pas significatifs

Le registre PORTA (05H). C'est le registre d'accès au port PORTA.

Le registre TRISB (86H) Le registre TRISB configure chaque E/S du PORTB en ENTREE ou en SORTIE Si le bit associé à la porte est à "1", alors elle sera configurée en ENTREE. Si le bit est à "0", elle sera en SORTIE. Apres un RESET, toutes les E/S sont configurées en ENTREE.

Le registre PORTB (06H). C'est le registre d'accès du port B

Les registres PCL et PCLATH (02,82H et OA,8AH). Le PC est un registre de 13 bits : PC H

 



PCL

PCL (8 bits) est la partie basse de PC, il est accessible en lecture écriture PCH (5 bits) est la partie haute de PC, il n'est pas accessible directement. On peut toutefois le modifier indirectement à l'aide du registre PCLATH qui est une registre SFR accessible en lecture écriture et où seuls 5 bits sont utilisés. Chaque fois qu'on écrit dans PCL, PCLATH est recopié automatiquement dans PCH PC H

PC AT L H

PCL

Ecriture dans PCL

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). La prochaine instruction que va exécuter le PIC est donc située à l'adresse 0x2B3 de la mémoire de programme.

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

      

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. VII.3. 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).

L'utilisation du mode SLEEP 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. 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). 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).

La temporisation du watchdog est dépassée (si le watchdog est actif) : le programme reprend à l'instruction qui suit l'instruction SLEEP. o Une interruption RB0/INT, RB ou EEPROM survient (si ces interruptions sont autorisées) 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. Le timer WATCHDOG (chien de garde) 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) :

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. - 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 :

PSAPS2, PS1, PS0 0

XXX

1

Taux de prédivisio n du

Duré e indicativ e

1

18 ms

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

La mémoire EEPROM de données La mémoire EEPROM (Electrical Erasable Programmable Read Only Memory), est constituée de 64 octets commençant à l'adresse 0x2100 que l'on peut lire et écrire depuis un programme. Ces octets sont conservés après une coupure de courant et sont très utiles pour conserver des paramètres semi permanents. On y accède à l'aide des registres EEADR et EEDATA : toute lecture écriture dans le registre EEDATA se fait dans la position mémoire pointée par EEADR. Deux registres de contrôle (EECON1 et EECON2) sont associés à la mémoire EEMROM.

Page 30

La durée d’écriture d’un octet étant de l’ordre de 10 ms, la fin de chaque écriture réussie est annoncé par le déclenchement de l'interruption EEI.

Procédure de lecture dans l'EEPROM de données   

Placer l’adresse de la donnée à lire dans EEADR Mettre le bit RD de EECON1 à 1 Lire le contenu du registre EEDATA

Procédure d'écriture dans l'EEPROM de données    

 

Placer l’adresse de la donnée à écrire dans EEADR Placer la donnée à écrire dans EEDATA Placer 0x55 dans EECON2 (processus de sécurité pour éviter une écriture accidentelle) Placer 0xAA dans EECON2 (processus de sécurité pour éviter une écriture accidentelle) Mettre le bit WR de EECON1 à 1 Attendre le drapeau EEIF avant de continuer

Les étapes nécessaires pour programmer un pic :

Exemples en assembleur avec 16F84 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)

Exemple d’une temporisation de 0.2s ;------------

Définition des registres temporaires

retard1

EQU

retard2 ;------------

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

0x0C

; le registre temporaire retard1 se trouve à l' adresse 0C 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

; on charge retard2 avec 255 ( FFh

contenu du registre W ) tempo DECFSZ retard1,F si

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

GOTO tempo

; le registre retard1 = 0 sinon retour à tempo

MOVLW 0xFF MOVWF retard1

; on met 255 dans le registre W ; on charge retard1 avec 255 ( FFh contenu du registre

W ) DECFSZ retard2,F

; 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

Exemple de temporisateur interne utilisant le Timer 1.1

CLIGNOTER UNE LED, TEMPO AVEC TMR0 ;************************** programme led_tmr.asm *************************** ; Clignotement d'une LED reliée à n'importe quelle sortie du port B ; la temporisation est réalisée à l'aide de l'interruption provoquée ; par le débordement du timer TMR0. Ce dernier est cadencé par l'horloge ; interne pré divisée par 256 ce qui donne une période d'interruption ; de 255 x 255 = 65536 µs. à l'aide du compteur TIME, on fait changer ; l'état du port B tous les 8 cycles de TMR0 ce qui donne une temporisation ; de l'ordre de 524288 µs soit un peu plus d'une demi seconde ;*************************************************************************** list p=16f84,f=inhx8m config _PWRTE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC #include "p16f84.inc" TIME equ 0x10 ; ************************************ démarrage sur REST org 0 goto start ; ************************************ vecteur d'interruption org 4 bcf INTCON,T0IF ; baisser le drapeau levé par l'interruption decfsz TIME,f retfie comf PORTB movlw d’8’ ; initialiser TIME movwf TIME retfie start

bsf STATUS,RP0 clrf TRISB sortie movlw horloge interne movwf OPTION_REG 255 bcf STATUS,RP0 movlw B'10100000' movwf INTCON movlw d’8’ passage movwf movlw B'00001111' PORB movwf

Loo p

goto

Loop

interruption end

; select bank1 ; programme tous les bits du bort B en B'00000111' ; timer cadencé par ; prescaler associé à TMR0, ratio ; select bank0 ; autorisation globale des interruptions ; autorisation de l'interruption par TMR0 ; initialise TIME pour le premier TIME ; met n'importe quelle valeur dans PORTB

; le PIC reste planté ici et n'en sort que pour aller exécuter une

Exemple d'application: Un compteur binaire

; Titre : Compteur binaire ; PIC utilisé : PIC 16 F 84 ; 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. ;-----------list

Directive d' assemblage pour MPLAB

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

p=16f84A

#include p16f84A.inc config H'3FF9' ;------------ Définition des constantes --------------#define inter0 0

; bouton marche

;------------ Définition des registres temporaires --------------retard1 EQU 0C retard2

0x0C EQU

adresse 0D memo

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

; le registre temporaire retard2 se trouve à l' 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

; à la 2eme page mémoire ( pour trisa et trisb ) MOVLW B'00000000'

; on met 00 dans le registre W

MOVWF TRISB

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

MOVLW 0x1F

; on met 1F dans le registre W

MOVWF TRISA

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

bcf STATUS,5

; on remet à 0 le 5eme bit du registre status pour accéder ; à la 1ere page mémoire

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

Programme principal

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

Main btfss PORTA,inter0 goto Main

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

; on va à l' étiquette Main

MOVLW 0xFF

; on met 255 dans le registre W

MOVWF retard1 MOVLW 0xFF

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

MOVWF retard2

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

MOVF memo, W

; on met memo dans W

MOVWF PORTB

; on met W sur le port B (

leds ) CALL tempo ; on appel la temporisation MOVLW 0x01

; on met 1 dans le registre

W ADDWF memo, F

; on additionne

memo + 1 GOTO Main ;------------

; retour au début du programme

Programme de temporisation ( 0.2 s )

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

tempo DECFSZ retard1,F si

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

GOTO tempo

; le registre retard1 = 0 sinon retour à tempo

MOVLW 0xFF MOVWF retard1

; on met 255 dans le registre W ; on charge retard1 avec 255 ( FFh contenu du registre

W ) DECFSZ retard2,F

; 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

END

; fin du programme

Exemple d'application: Les feux tricolores

; 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 ;-----------list

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

p=16f84A

#include p16f84A.inc config H'3FF9'

;------------ Définition des constantes --------------#define inter0 0

; bouton marche

#define inter1 1

; bouton clignotement orange

;------------ Définition des registres temporaires --------------retard1

EQU 0x0C

0C retard2

EQU

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

adresse 0F retard3

; le registre temporaire retard2 se trouve à l'

EQU

0x10

; le registre temporaire retard3 se

trouve à l' adresse 10 ;------------

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 )

MOVLW 0x00

; on met 00 dans le registre W

MOVWF TRISB

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

MOVLW 0x1F

; on met 1F dans le registre W

MOVWF TRISA

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

bcf STATUS,5

; 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' MOVWF PORTB

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

btfss PORTA,inter0

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

;va à debut goto debut ret_cli btfsc PORTA,inter1

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

;va à clignote goto clignote MOVLW B'00001001'

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

MOVWF PORTB

; on met W sur le port B ( led )

;--------------- Chargement de la temporisation --------------------CALL tempo

; on appel la temporisation 1 ( longue )

MOVLW B'00001100'

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

MOVWF PORTB

; on met W sur le port B ( led )

CALL tempo

; on appel la temporisation 1 ( longue )

MOVLW B'00001010'

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

MOVWF PORTB

; on met W sur le port B ( led )

CALL tempo2

; on appel la temporisation courte

MOVLW B'00001001'

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

MOVWF PORTB

; 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

; on appel la temporisation longue

MOVLW B'00010001'

; 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

; on met ff dans le registre W ; on met W dans le registre

retard1 MOVWF retard2

; on met W dans le

registre retard2 MOVLW 0x12

; on met 12 dans

le registre W MOVWF retard3 dans le registre retard3

; on met W

attente DECFSZ retard1,F

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

GOTO attente

; le registre retard1 = 0 sinon retour à attente

movlw 0xFF

; on recharge retard1

movwf retard1 DECFSZ retard2,F

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

GOTO attente

; le registre retard2 = 0 sinon retour à attente

movlw 0xFF

; on recharge retard2

movwf retard2 DECFSZ retard3,F

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

GOTO attente

; le registre retard3 = 0 sinon retour à attente

RETURN

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

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

Programme de temporisation courte

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

tempo2 MOVLW 0xFF MOVWF retard1

; on met ff dans le registre W ; on met W dans le registre

retard1 MOVWF retard2

; on met W dans le

registre retard2 MOVLW 0x07

; on met 7 dans le

registre W MOVWF retard3; on met W dans le registre retard3 attente2 DECFSZ retard1,F

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

GOTO attente2

; le registre retard1 = 0 sinon retour à

attente2 movlw 0xFF ; on recharge retard1 movwf retard1 DECFSZ retard2,F

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

GOTO attente2

; le registre retard2 = 0 sinon retour à attente2

movlw 0xFF

; on recharge retard2

movwf retard2 DECFSZ retard3,F

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

GOTO attente2

; le registre retard3 = 0 sinon retour à attente2

RETURN clignote MOVLW B'00010010'

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

MOVWF PORTB

; on met W sur le port B ( led )

CALL tempo2

; on appel la temporisation courte

MOVLW B'00000000'

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

MOVWF PORTB

; on met W sur le port B ( led

) CALL tempo2

; on appel la temporisation

courte GOTO ret_cli END

UTILISATION DE L’INTERRUPTION RB0 ;-----

Application avec un PIC : Gestion d'une interruption sur RB0 ------

; Titre : Interruption sur RB0 ; PIC utilisé : PIC 16 F 84 ; Ce montage d'initiation à base de PIC 16F84 permet de tester le déroulement d 'une ; interruption. Lorsque la broche RB0 passe de 0 à 1 ( front montant ) alors on génère ; une IT , on allume une led ( RB7 ) et après une temporisation on éteint celle-ci. ; Une prochaine action sur RB0 redéclenche l ' IT

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

Directive d' assemblage pour PLAB --- - list p=16f84A

#include p16f84A.inc config H'3FF9'

Page 40

;**** Le programme pricipal commence à l ' étiquette init ****** ORG 0

Page 41

goto init ;**** Le programme d' interruption se déclenche lorsque l' entrée RB0 passe de 0 à 1 *** ORG 4 ;*********** Programme d 'interruption ********************** bsf PORTB,7

; on allume la led connectée

sur rb7 ;------------ temporisation --------------tempo2 MOVLW 0xFF

; on met ff dans le registre W

MOVWF retard1

; on met W dans le registre

retard1 MOVWF retard2

; on met W dans le

registre retard2 MOVLW d'52'

; on met 7 dans

le registre W MOVWF retard3

; on met W dans

le registre retard3 attente2 DECFSZ retard1,F

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

instruction si GOTO attente2

; le registre retard1 = 0 sinon retour à

tempo movlw 0xFF

; on recharge

retard1 movwf retard1 DECFSZ retard2,F

; on décrémente retard2 et on saute la prochaine

instruction si GOTO attente2 tempo movlw 0xFF

; on recharge

retard2 movwf retard2

; le registre retard2 = 0 sinon retour à

DECFSZ retard3,F

; on décrémente retard3 et on saute la prochaine

instruction si GOTO attente2 tempo

; le registre retard3 = 0 sinon retour à

bcf PORTB,7

; on éteint la led connectée sur rb7

bcf INTCON,INTF ; on remet à 0 le bit du registre d' IT qui est passé à 1 RETFIE

; retour d 'interruption

;************* Programme d' INIT ************************** init retard1

EQU

0x0C

; le registre temporaire retard1 se trouve à l'

adresse 0C retard2EQU

0x0F

; le registre temporaire retard2 se trouve

à l' adresse 0F retard3

EQU

0x0E ; le registre temporaire retard3 se

trouve à l' adresse 0F bsf STATUS,5

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

; à la 2eme page mémoire ( pour configurer trisa et trisb ; -> broches en entrée ou en sortie ) MOVLW B'00000001'

; rb0, en entrée ( rb0 sera la broche utilisée

; pour l ' interruption ) MOVWF TRISB bsf OPTION_REG,INTEDG ; Le passage de 0 à 1 sur RB0 provoque une IT; sur un front montant ( choix du front sur RB0 ) bcf STATUS,5 accéder

; on remet à 0 le 5eme bit du registre status pour ; à la 1ere page mémoire

bsf INTCON,INTE

; autorise l ' IT sur RB0

bsf INTCON,GIE

; autorise les

Interruptions clrf PORTB ;************ Programme principal en rebouclage ********************* debu t RB0

sleep

; mise en sommeil du PIC conso : 3.2 mA, attente

impulsion sur GOTO debut

;*********** Fin du programme *********** end

COMMANDE D'UN AFFICHEUR 7 SEGMENT PAR LE PORT B ;*********************************** programme 7seg_bcl.asm ****************** ; Afficher un compteur 4 bits sur un afficheur 7 segment Anode Commune ; connecté au port B. Le tableau de décodage 7 segments est situé dans ; la mémoire programme. ; La temporisation d'affichage est réalisée par boucle ;*************************************************************************************

list p=16f84,f=inhx8m include config _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC C1 T1 T2 T3

equ equ equ equ

0x0C 0x0D 0x0E 0x0F

; compteur en position 0x0C de la ;RAM T1,T2,T3 = compteurs temporisateur

; ************************************ démarrage sur REST org 0x00 goto main ; ************************************ vecteur d'interruption org 0x04 ; normalement on ne devrait jamais passer clrf INTCON ;par-là aucune interruption autorisée retfie ; *************************** Codes 7 segments anode commune bcd7seg addwf PCL,1 retlw 0x40 ;0 retlw 0x79 ;1 retlw 0x24 ;2 retlw 0x30 ;3 retlw 0x19 ;4 retlw 0x12 ;5 retlw 0x02 ;6 retlw 0x78 ;7 retlw 0x00 ;8 retlw 0x10 ;9 retlw 0x08 ;A retlw 0x03 ;B retlw 0x46 ;C retlw 0x21 ;D retlw 0x06 ;E retlw 0x0E ;F ; ******************************** Routine de temporisation tempo movwf T3 bcltmp decfsz T1,f

goto

bcltm p

decfsz goto decfsz goto return

T2,f bcltmp T3,f bcltmp

; *************************************** Programme principal main bsf STATUS,RP0 ; passage en bank 1 des registres clrf TRISB ; port B en sortie bcf STATUS,RP0 ; passage en bank 0 loop movf C1,w andlw 0x0F call movwf movlw s call incf goto

bcd7seg PORTB 4 tempo C1,1

; affichage ; 0.59

loop end 5V

a fb g ec dp a b c d e f g PIC16f84

Rb0 RB1 RB2 RB3 RB4 RB5 RB6 RB7

P 

La compilation se fait a l’aide du logiciel MPLAB de Microchip

Simulation d’un PIC sous Proteus Pour faire cela il est nécessaire d’avoir : -> Proteus qui contient le module de simulation des pic (Module VSM) -> Un schéma dont tout les composants sont simulables (ou ceux qui le sont pas : exclus de la simulation : exemple les borniers ) -> Un fichier exécutable (code machine) FICHIER.HEX, OU MIEUX un code machine + informations de Débugage :FICHIER.COF 1. Présence Module VSM Le module VSM effectue la simulation du microprocesseur à partir de votre code source. Vérifier la présence du module VSM adapté au microprocesseur à simuler sous Proteus. -> Lancer Licence Manager :

VSL pour PIC 16 XXXX dans l’exemple. 2. Fichier à simuler Editer les propriétés du Microprocesseur puis sélectionner le fichier source, on peut utiliser : VERSION 1 : Soit le fichier_source.HEX

VERSION 2 : Soit le fichier_source.COF (contenant le fichier source et les directives de désassemblage) Il est préférable d’utiliser plutôt ce fichier. Ce qui permet des mises au point plus efficace (mode pas à pas)

Pour lancer la simulation il suffit de cliquer sur l’icone « PLAY verte » en bas de page

Pour lancer la simulation en mode pas à pas (et débogage) :

* En exécutant la simulation en mode pas à pas , vous pouvez ensuite exécuter le programme par pas, mettre des points d’arrêt dans le programme, voir l’état des registres, etc...

Circuits d’interfaces avec le microcontrôleur 1 Utilisation des leds

2-AFFICHEUR LCD 2.1 Présentation : L’afficheur LCD, autrement appelé un afficheur à cristaux liquide. Il consomme relativement de 1 à5 mA et constitué de deux lames de verre, distante de 20 µm environ, sur lesquelles sont dessinées les mers nantisses formant les caractères. L’application entre les deux faces d’une tension alternative basse fréquence de quelques volts (3à5V) le rend absorbant .Un afficheur à cristaux liquide ne peut être utilisé qu’avec un bon éclairage ambiant .Son lisibilité augmente avec l’éclairage 2.2 Principe de fonctionnement : on utilise le mode 4 bits de l’afficheur LCD. Dans ce mode, seul les 4 bits de poids fort (D4à D7) de l’afficheur sont utilisés pour transmettre les données et les lires. Les 4bits de poids faible (D0à D3) sont alors connectés à la masse, on a donc besoin hors alimentation de sept fils pour commander l’afficheur. Les données sont écrites séquentiellement les quatre bits de poids fort suivi des quatre bits de poids faible. Une impulsion positive d’au moins 450ns doit être envoyée

sur la ligne E pour valider chaque demi -octet. On peut après chaque action sur l’afficheur vérifier que celui-ci est en mesure de traiter l’information suivante .Pour cela, il faut demander une lecture en mode commande et tester le flag Busy BT. Lorsque BF=0, l’afficheur est près à recevoir une nouvelle commande ou donnée. 2.3 Présentation d’un écran LCD : Qu’il soit à une ou deux lignes, un afficheur LCD se présente sous la forme suivante :

Au-dessus de l’écran à cristaux liquides proprement dit, on trouve une série de 14 broches aux rôles Suivantes : Broche   

1 : masse ; Broche 2 : Vcc ; Broche 3 : luminosité ; Broche 5, R/W : sélection du mode lecture ou écriture :

0

écritur e 1 lectur e  Broche 6, E : Commande des opérations d’écriture ou de lecture ; Broche 7à 14 : utilisées pour le transfert des données ou des instructions. Le transfert peut se faire sur 8 bits, toutes les broches sont alors utilisées, ou sur 4 bits, dans ce cas, seules les broches 11 à 14 sont utilisées.

Page 50

U1

PIC16F877 VDD=VCC VSS=GND

8 7D2 D3 D4 D5 D6 D7 D0 D1

RS RW E 4

1

VSS VDD VEE

LM032L

RS RW E

RD0/PSP019 RD1/PSP120 RD2/PSP221 RD3/PSP322 RD4/PSP427 RD5/PSP528 RD6/PSP629 RD7/PSP730

LCD

GND VCC VEE

33 RB0/INT RW 34 RB1 RB2 RB3/PGM 35 RB4 RB5 RB6/PGC RB7/PGD 36 RS E 2 37 RA0/AN0 3 RA1/AN1 RA2/AN2/VREF- RA3/AN3/VREF+ RA4/T0CKI 38 4 39 5 40 6 15 7 RA5/AN4/SS RC0/T1OSO/T1CKI 16 8 RC1/T1OSI/CCP2 17 RE0/AN5/RD RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT 18 RE1/AN6/WR 23 RE2/AN7/CS 24 25 26 OSC1/CLKIN OSC2/CLKOUT 1MCLR/Vpp/THV

Montages de l’afficheur LCD avec le PIC

3- Le clavier 3.1 Présentatio n: Le clavier est le périphérique le plus commode pour saisir du texte, mais dans notre carte on va utiliser un clavier alphanumérique à 16 touches matricées pour saisir des numéros et un peut d’alphabets, pour connecter le clavier au microcontrôleur on est besoin d’un codeur de clavier 74LS922 pour préserver les ressources du microcontrôleur.

3.2 Principe de fonctionnement :

Le clavier se compose de 16 touches reparties sur une matrice de 4 lignes (chaque ligne contient 4 touches) 4 pistes sont disposées horizontalement (elles correspondant aux 4 lignes de touches) et 4 autres pistes sont disposées verticalement (elles correspondant aux 4 colonnes de touches). Chaque touche agit comme un bouton poussoir qui établit le contact entre une des 4 pistes horizontales et une des 4 pistes verticales. Chaque touche est un interrupteur, normalement en position ouverte .Lorsqu’une touche est appuyée un signal électrique est envoyé vers le codeur, circuit électronique très simple qui associe à chaque signal un code (par exemple le code ascii de la touche). Ce signal peut être utilisé pour envoyer une interruption au processeur à fin qu’il traite l’information. Les codeurs réellement utilisés assurent de fonctions supplémentaires comme le décodage automatique des touches appuyées longtemps.

4 Circuit ULN2003 L’ULN est un composant qui à pour rôle de commander les relais. Il comporte deux transistors, deux diodes et deux résistances. Le fait qu’il renferme tous les composants lui permet d’avoir une longue durée de vie et de minimiser les pertes de courant. L’ULN est capable d'écouler un courant max de 500mA par transistor et supporte une tension max de 50V. Ainsi vous pouvez connecter directement la majorité des relais sans problème

Figure : Structure interne de l’ULN2003

Circuit ULN2803 L'ULN2803 est décrit comme "un conducteur à 8 lignes". Cela signifie qu'il contient le circuit pour contrôler huit lignes de productions individuelles, chaque acte indépendamment des autres.

5-Les moteurs 5-1. Moteur pas à pas :

Moteur pas à pas 5.2 Présentation : Le moteur pas à pas est un moteur qui tourne en fonction des impulsions électriques reçu dans ses bobinages. L’angle minimal entre deux modifications des impulsions électrique s’appelle un pas .On caractérise un moteur par le nombre de pas par tour. 5.3 Principe de fonctionnement : Pour identifier le brochage du moteur ,un simple ohmmètre(calibre 100 ou 200ohms)permet de déterminer d’une part les trois fils appartenant chaque bobinage [P1-com1-P1\]et[P2-com2- P2\] ,d’autre part le point milieu d’un bobinage donnée(si la résistance entre le commun et une phase vaut alors que celle entre les deux phase vaut2R) .les deux les deux bobinages sont interchangeable, ainsi que les deux phases extrêmes d’un même bobinage (P1etP1\) ; signalons que cette dernière manipulation entraîne un changement du sens de rotation. Un cycle étant réalisé en quatre étapes successives, la séquence ment est donc effectué par un compteur binaire à quatre sorties, lesquelles présenteront donc cinq combinaisons différentes (0000, 0001, 0010, 0100, 1000).Les étapes défilent au rythme de l’horloge intégrée au compteur. 5.4 Connexion du moteur pas à pas sur la carte :

Le moteur pas à pas+ULN2003A sont connectés aux lignes RD0 à RD3 du microcontrôleur. 5.5 Moteur à courant continue : Le moteur à courant continue est une machine électrique tournante constitué de deux parties principales : le stator (la partie fixe) et le rotor (la partie mobile).

Moteur à courant continue 5.6 Connexion du moteur

Dans ce figu re on à utiliser deux relaies pour changer le rotation du moteur à courant continue. Les sens dedeux pins MCC1 et MCC2 relier avec les pins RE0 etRE1 du microcontrôleur.

Lorsqu'on veut commander le sens de rotation d’un moteur (à courant continu ou pas à pas) on est souvent obligé d'inverser la polarité. De plus il est généralement préférable de pouvoir faire varier la vitesse du moteur. La solution est d’utiliser le pont en H.

Figure : Principe du pont en H En regardant les schémas, on voit le sens de rotation du moteur : sur le schéma a ; le moteur est à l'arrêt (on devrait même dire qu'il est freiné : en effet court-circuiter les deux pôles d'un moteur revient à le freiner).

Sur le schéma b ; il tourne dans le sens inverse du schéma c, et enfin sur le schéma d ; il est freiné. Et bien voici la base du pont en H, toute l'idée réside dans ce schéma. Bien sûr, pour l'implémenter, il va nous falloir remplacer les interrupteurs par des transistors.

IN1

IN2

TAT MOTEUR

0

0

0

1

1

0

1

1

ARRE T SENS 1 SENS 2 ARRE T

Figure : Tableau des différentes séquences

Lorsqu'on arrête le moteur, et qu'il continue à tourner avec l'inertie, il se comporte comme une génératrice. Pour éviter d'avoir des courants dans les transistors on monte des diodes de roues libres.

Figure: Schéma d’un pont en H Commande de 2moteurs DC avec L293D

6-Les relais Les relais sont pilotés via un transistor de commande, une diode de roue libre est montée aux bornes du relais pour la protection du transistor

Montage du relais

7 Isolation à l’aide d’un opto- triac Exemple de commande d’une lampe.

8 Isolation galvanique à l’aide d’un opto_transistor

Page 60

9 Affichage 7ségments multiplexé

10-Les touches de commande Si on dispose de trois boutons poussoirs (SW0, SW1 et SW2)qui sont reliés à trois entrées numériques du microcontrôleur en les reliant respectivement aux résistances (R10 ,R9 et R8) de rappel à la source Vcc de moyenne valeurs (2.2 KΩ) pour ne pas consommer plus de l’énergie .

SW O

RE0 RE1 RE2

12

SW 1 12

SW 2 12

R10 R9R8 2.2k2.2k2.2k

VCC

Montage des boutons poussoirs

11-Communication série avec RS232 Le circuit adaptateur de niveau de tension TTL :RS232 permet alors de relier un interface (exemple le téléphone au port série d’un PC) .

Présentation : Les liaisons séries permettant la communication entre deux systèmes numériques en limitant le nombre de Fils de transmission..  DCD (Data Carrier Detecte ) : Cette ligne est une entrée active à l’état haute. Elle signal à l’ordinateur qu’une liaison a été établie avec un correspondant.  RX( Reciver Data) : Cette ligne est une entrée.C’est ici que transitent les informations du correspondant vers l’ordinateur.  TX (Transmit Data ) : cette ligne est une sortie. Elle permet la véhicule des données de l’ordinateur vers le correspondant.  DTR (Data Terminal Ready ) :Cette ligne est une sortie active à l’état haut Elle permet à l’ordinateur de signaler au correspondant que le port série à été libéré et qu’il peut être utilisé s’il le souhaite.  GND (GrouND) : c’est la masse.  DSR (Data Set Read) : Cette ligne est une entrée active à l’état haut. Elle permet au correspondant de signaler qu’une donnée est prête.  RTS (Request To Send ) : cette ligne est une sortie active à l’état haut. Elle indique au correspondant que l’ordinateur veut lui transmettre des données..  CTS (Clear To Send ) : Cette ligne est une entrée active à l’état haut.Elle indique à l’ordinateur que le correspondant est prêt à recevoir des donnés.

 RI( RING Indicator) :Cette ligne est une entrée active à l’état haut.Elle permet à l’ordinateur de savoir si un correspondant veut initier une communication avec lui.

Fonctionnement : Pour pouvoir dialoguer avec le PC, le microcontrôleur utilise son module USART signifie (Universal Synchronous Asynchronous Reciever Transmitter ). C’est donc un module qui permet d’envoyer et de recevoir des données en mode série, soit de façon synchrone, soit asynchrone. Le module USART de notre PIC gère uniquement deux pins,à savoir RC6/TX/CK et RC7/RX/DT. Une liaison série synchrone nécessite une connexion dédiée à l’horloge, donc il reste une seule ligne pour transmettre les données. Alors qu’en mode asynchrone on n’a pas besoin d’une

ligne d’horloge, il nous restera alors deux lignes pour

communiquer, chacune étant dédiée à un sens de transfert. Nous pourrons donc envoyer et recevoir des données en même temps. Les

liaisons

RS

232

sont

des

liaisons

asynchrones

très

utilisées

en

informatique. Elle nécessite que l’émetteur et le récepteur soit informé de la vitesse choisie de transfert. Puisque le récepteur connaît la vitesse du transfert il peut se passer de signal de synchronisation. Trois lignes sont nécessaires à cette liaison. TX : transmission de donnés. RX:récepteur de donné. GND :masse Grâce à cette liaison la carte peut servir d’interface entre un PC et un montage extérieure afin d’adapter les signaux TTL du microcontrôleur au standard RS232 Un MAX232 est montée de faucon classique, les lignes RX, TX et la masse sont disponibles sur un connecteur DB9 mâle qui permet ainsi de relier la carte au PC avec un simple câble série.

11-2 MAX 232 Le circuit intégré MAX232 qui câble avec ces condensateurs au tantale de 1µF , permet d’adapter les niveaux de tension entre le PC et le téléphone comme certains PC ne disposent pas d’une puissance suffisante sur leur port série, c’est le cas notamment des portable , il est possible de connecter une alimentation externe délivrant une tension de 12V

12 BUS I2C Le bus I2C (inter integrated circuit ce qui donne IIC et par contraction I2C), a été propos initialement par Philips mais adopté de nos jours par des très fabricants. C’est bus de communication de type série.

1. Présentation : Le bus I2C qui n’utilise que deux lignes de signal (et les masses correspondantes bien sûr) permet à un certain nombre d’appareils d’échange des informations sous forme série avec un débit pouvant atteindre 100 Kbits par seconde ou 400 kbits par seconde pour les versions les plus récentes. Même si ces débits peuvent sembler relativement faibles, les premières applications du bus I2C sont des applications audio ou vidéo pour lesquelles la simplicité de mise en œuvre est nettement plus importante qu’un débit élevé. Les points forts du bus I2C sont : Premièrement c’est un bus série bifilaire utilisant une ligne de données appelée SDA (Serial Data) et une ligne d’horloge appelée SCL (Serial Clock). Les données peuvent être échangées dans les deux sens sans restriction. Le bus est multi-maître : chaque abonné dispose d’une adresse codée sur 7 bits, on peut donc connecter simultanément 128 abonnés d’adresses différentes sur le même bus. Un acquittement est généré pour chaque octet de donnée transféré. Le bus peut travailler à une vitesse maximum de 100 K bits par seconde (ou 400 Kbits par seconde) étant entendu que son protocole permet de ralentir automatiquement l’équipement le plus rapide pour s’adapter à la vitesse de l’élément le plus lent, lors d’un transfert. Le nombre maximum d’abonnés n’est limité que par la charge capacitive maximale du bus qui peut être de 400pF. Les données envoyées par paquets de huit bits indépendants(le bit de poids fort est envoyé le premier) sur la ligne SDA, chaque octet est suivie par un bit d’acquittement .La ligne SCL fonctionne comme une horloge sérielle d’un registre à décalage, tant que cette ligne est à l’état haut les données de la ligne SDA doivent être stables. Certaines combinaisons particulières de niveaux et de fronts des deux lignes déterminant la condition de départ ou d’arrêt de la transmission des données. Condition de départ : Un front descendant sur SDA quand SCL est à l’état haut. Condition d’arrêt : Un front montant sur SDA quand SCL est à l’état haut. 13 Module horloge temps réel : PCF8583 : Le PCF8583 fonctionne en véritable horloge calendrier c'est-à-dire en mode de 24 heures et sur une période de vingt quatre ans. Il possède une sortie d’interruption et de la RAM qui possède 232 octets disponibles en plus de ceux de sa propre fonction.

Figure : Schéma de brochage Caractéristiques électriques : - consommation faible de courant. - garantie de la fonction d’horloge et de rétention de mémoire sous 1v (et 2µA) ce qui permet de le secourir facilement par une batterie. Figure : architecture interne du PCF8583 2. Connexion de PCF8583:

L’horloge temps réel PCF8583 à accès I2C est raccordée à la ligne RC3 du Pic pour l’horloge (SCL) et à RC4 pour les données (SDA), la liaison aux lignes RC3 et RC4 s’effectue en changeant l’état

du SW9. Les résistances R48 et R49 maintiennent positivement ces signaux au repos. Le montage contient aussi une pile rechargeable pour alimenter le PCF8583 en cas où la carte n’est pas alimentée. Le bus I2C appartient à la catégorie des bus série par opposition aux bus parallèle ou les données sont transmises par bloc, les données sont ici envoyées bit par bit par groupe d’octet sur la ligne SDA.La ligne SCL fonctionne comme une horloge sérielle d’un registre à décalage. Tant que la ligne SCL est à l’état haut les données de la ligne SDA doivent être stables. Lorsque la ligne SCL est à l’état bas, le circuit qui émet les données peut modifier l’état.

Figure: condition de validité des données sur le bus I2C Certaines combinaisons particulières de niveaux et de fronts des deux lignes déterminant la condition de départ ou d’arrêt de la transmission des données.  

Condition de départ : Un front descendant sur SDA quand SCL est à l’état haut. Condition d’arrêt : Un front montant sur SDA quand SCL est à l’état haut.

Pic 16F877 : Le pic 16F877 est un circuit intègre contenu dans un boîtier nommer « DIL 40 », il présente 40 broches, 20 de chaque coté. Les broches sont virtuellement numérotées ere de 1 à 40. La 1 broche est placé dans le coin situé à gauche de l’encoche de repérage.

Figure : Les pins du 16F877 1. Les PINS de 16F877 :  MCLR Cette broche sert à initialiser le microcontrôleur. Le microcontrôleur dispose de plusieurs sources de RESET : • POR. • EXTERNAL RESET • WDT • BOR • POR: (POWER ON RESET) Mise sous tension. Un front montant sur MCLR déclenche l'initialisation du microcontrôleur. Le temps nécessaire est au minimum de 72ms et au maximum de 72ms+1024*Tosc. Le microcontrôleur dispos en interne d’un circuit de détection de niveau, quand la tension VDD est comprise entre 1.2V et 1.7V, il démarre une procédure d’initialisation. Cette broche peut être simplement reliée à VDD si on n’a pas besoin de RESET externe. Par contre si on souhaite implanter un bouton de remise à zéro, on pourra câbler un simple réseau RC sur la broche MCLR.

Remarque importante : On peut se passer de circuit RC à la seule condition que le temps de monté de VDD soit suffisamment rapide (au minimum 50mV/ms). Si le temps de montée est inférieur à 50mV/ms, il faut rajouter un réseau RC. • EXTERNAL RESET (Mise à l’état bas de MCLR). Remise à zéro extérieure. Il faut appliquer un niveau bas sur l'entrée RESET pendant au moins 2μS pour que l'Initialisation soit prise en compte. • WDT: Chien de garde. Si le WDT arrive à la fin du temps de garde sans avoir été rafraîchi il y aura alors une initialisation du microcontrôleur. • BOR: Baisse de l’alimentation. Si la tension VDD chute en dessous de 4V pendant 100μS au moins, le microcontrôleur peut générer un RESET.  Oscillateur : OSC1 et OSC2 ou CLKIN et CLOUT. Ces broches permettent de faire fonctionner l’oscillateur interne du PIC. On peut utiliser 3 types d’oscillateurs : - Un quartz ou résonateur céramique - Un oscillateur externe - Un réseau RC Remarque : Les instructions standards durent 1 cycle machine (sauf les instructions de sauts 2 cycles). Le microcontrôleur utilise 4 coups d’horloge pour réaliser un cycle machine. Si la fréquence du QUARTZ est de 20MHz (T=50nS), une instruction sera exécutée toutes les 200nS, Dans ce cas là, le microcontrôleur a une puissance de calcul de 5MIPS (5 Millions d’instructions par secondes ! ! !). La fréquence MAX est de 20MHz pour les microcontrôleurs dont les références se terminent par - 20.Par exemples : 16F876-20 (20MHz max) et 16F876-04 (4MHz max). C1 1nF

C2 1nF

U1 X1

13 CRYS T AL14 1 2 3 4 5 6 7

8 9 10

OSC1/CLK INRB 0/INT OSC2/CLK OUTRB1 MCLR/V pp/T HVRB2 RB3/PGM RA0/AN0RB4 RA1/AN1RB5 RA2/AN2/V RE F-RB6/PGC RA3/AN3/V RE F+RB7/PGD RA4/T 0CKI RA5/AN4/S SRC0/T 1OS O/T 1CKI RC1/T 1OSI/CCP2 RE0/AN5/RDRC2/CCP 1 RE1/AN6/W RRC3/S CK /S CL RE2/AN7/CSRC4/SDI/S DA RC5/SDO RC6/T X/CK RC7/RX/DT

33 34 35 36 37 38 39 40

15 16 17 18 23 24 25 26

RD0/PS P0 RD1/PS P1 RD2/PS P2 RD3/PS P3 RD4/PS P4 RD5/PS P5 RD6/PS P6 RD7/PS P7 19 20 21 22 27

28 29 30

PIC16F877

. Brochage du circuit d’oscillation PIC16F877 Page 70

Remarque : La consommation du circuit sera d'autant plus faible que la fréquence sera petite, cela peut être intéressant pour des applications de faible consommation (alimentation autonome). Pour des applications faible consommation, on peut utiliser les séries LF (Low Frequency and Low Power).  Alimentation : VDD et VSS. Ce sont les broches d'alimentation du circuit. Les tensions qui peuvent être appliquées vont : - De 4,5V à 6V pour la gamme standard F. - De 2 à 6V pour la gamme étendue LF. L'intensité du courant consommé peut aller de 1μA à 10mA. La consommation du microcontrôleur sera fonction de : - La tension d'alimentation. - La fréquence interne. - Le mode de fonctionnement. De plus ces bornes doivent être découplées par deux condensateurs : - 1μF électrolytique. - 10nF céramique.  L’Interruption : RBO/INT. Cette broche à une double fonction elle peut être utilisée comme une broche standard RBO ou comme une entrée d’interruption INT. Si cette broche est utilisée comme une entrée d'interruption externe, elle doit être maintenue à un niveau haut par l'intermédiaire de résistances de 10 kΩ pour ne pas déclencher d’interruptions imprévues, cela permet aussi de relier plusieurs sources d'interruptions sur une même ligne (OU CABLE). 2. Architecture interne du16F877 : Comme pour tous les circuits intègre, chacun de ses broches à une ou plusieurs fonctions qui sont résumées par un sigle mnémotechnique. Ce microcontrôleur présente une architecture Harvard, les données sont placées dans une mémoire de type RAM de 368 bytes. La mémoire de programme est constituée de mot de 14 bytes, est type FLASH (non volatile). Ces ressources sont donc précieuses, en comparaison de celles d’autres composantes. Le 16F877 possède encore 5 ports (A à E) et 3 temporisateurs (timers), ce diagramme bloc présente les composantes du 16F877 :

Figure 2: Architecture interne du PIC 16F877 *Les 5 ports sont d’entrées sorties input/output, ils sont bidirectionnels : -Le port A (6 bits) I/O pure et/ou convertisseur analogique et/ou TIMER 0. La broche RA4 5Entrée du timer 0 T0CKI) est de type DRAIN OUVERT. -Le port B (8 bits) I/O pure et/ou programmation in situ ICSP/ICD, RB0 est entrée d’interruption externe.

-Le port C (8 bits) I/O pure et/ou SPI/I2C et/ou USART.

-Le port D (8 bits) I/O pure et/ou port parallèle 8 bits associé au port E. -Le port E (3 bits) I/O pure et/ou pilotage du port E RE0/R, RE1/WR et RE/CS. Remarque : Si le PIC est utilisé en mode ICSP/ICD il faut laisser libre les broches RB3/PGM, RB6/PGC ainsi que RB7/PGD) et les configurer en entrée. • Le PORT C (8 bits) I/O pure et/ou TIMER 1 et/ou SPI / I2C et/ou USART. • Le PORT D (8 bits) I/O pure et/ou port parallèle 8 bits associé au PORT E. • Le PORT E (3 bits) I/O pure et/ou pilotage du PORT E RE0/RD, RE1/WR et RE2/CS.



Configuration des PORTx, les registres PORTx et TRISx. Tous les ports sont pilotés par deux registres : - Le registre de PORTx, si le PORT x ou certaines lignes de PORT X sont configurées en sortie, ce registre détermine l’état logique des sorties. - Le registre TRISx, c’est le registre de direction. Il détermine si le PORTx ou certaines lignes de port sont en entrée ou en sortie. L’écriture d’une 1 logique correspond à une entrée (1 comme Input) et l’écriture d’une 0 logique correspond à une sortie (0 comme Output). Au RESET toutes les lignes de ports sont configurées en entrées. Remarque : Les registres TRISx appartiennent à la BANQUE 1 des SFR. Lors de l’initialisation du microcontrôleur il ne faut pas oublier de changer de page mémoire pour les configurer. Le tableau ci dessous représente les caractéristiques de PIC :

Tableau de caractéristiques . Les mémoires du PIC 16F877 : Les mémoires sont de trois types différents : 3.1 La mémoire FLASH : C’est une mémoire programme de taille 8ko. Chaque case mémoire unitaire est de taille 13 bits. Cette mémoire est de type mémoires stable, c'est-à-dire qu’on peut réécrire dessus à volonté, car le 16F877 est caractérisé par la possibilité d’écrire des données. La zone mémoire est caractérisée

par une adresse de 13 bits, alors ceci nous impose donc pour l’adressage les registres EEAR et EEADRH. De même, nous aurons pour les données, les registres EEDATA et EEDATH. 3.2 La mémoire RAM : Cette mémoire de taille 368 octets est une mémoire d’accès rapide et elle est volatile (les données seront perdus lorsque elle n’est plus sous tentions). Elle contient tous les registres de configuration du PIC ainsi que les différents registres de données. Elle contient également les variables utilisées par le programme. La RAM est la mémoire la plus utilisée. Toutes les données qui y sont stockées sont perdues lors d’une coupure de courant. La RAM est subdivisée de plus en deux parties dans chacune on trouve des « cases mémoire spéciales » appelée REGISTRES SPECIAUX et des cases mémoire « libre » dont on peut se servir provoque un fonctionnement spécial du PIC ou la mise en service d’une fonction particulière. 3.3 L’EPROM Interne : Le pic 16F877contient également la mémoire électriquement effaçable. Ce type de mémoire est d’accès plus lent. Pour gérer cette EEPROM on a besoin de quatre registres, à savoir EEDR, EEDATA, EECON1 et EECON2. Le registre EEADR est utilisé pour placer l’adresse relative en EEPROM, tandis que le EEDATA contient la donné à lire ou à écrire. L’adresse relative de l’accès EEPROM est donc comprise entre 0000 et 00FF ce qui nous permet d’utiliser un registre de huit bit pour définir cette adresse. 4. Les Timers : Il possède 3 timers qui sont : -Le Timer0 (8bits) : il peut être incrémenté par des impulsions extérieures via la broche (TOCKI/RA4) ou par l’horloge interne (Fosc/4). -Le Timer1 (16 bits) : il peut être incrémenté soit par l’horloge interne par des impulsions sur la broche T1CKI/RC0 ou par un oscillateur (RC ou quartz) connecté sur les broches T1OSO/RC0 et T1OSI/RC1. - Le Timer2 (8bits) : il est incrémenté par l’horloge interne, celle peut être pré divisée. Tous ces timers peuvent déclencher une interruption interne, s’ils ont été autorisés. 5. L’unité centrale :

 Organisation mémoire Comme les PICs utilisent un bus pour les instructions et un bus pour les données, il faut considérer deux plans mémoire l’un pour les instructions et l’autre pour les données ainsi que les registres internes.

Figure 3 : Plan Mémoire pour les instructions (Code programme) Le plan mémoire est linéaire les adresses vont de 0000h à 1FFFh (8k mots de 14 bits), par page de 2K mots. On peut remarquer, le vecteur de reset est figé en 0000h. Les PICs n’ont qu’un seul vecteur d’interruption en 0004h. Lors d’une interruption, le sous programme associé devra déterminer quel périphérique a demandé une interruption. La pile utilisée par les sous programmes n’est pas implantée en mémoire de donnée comme avec les microcontrôleurs classiques, mais dans la mémoire programme. Elles sont utilisées lors d’appels de sous programmes, on ne peut pas imbriquer plus de 8 sous programmes (Ce qui est déjà beaucoup). 6. Les interruptions : 6.1 Présentation : Le microcontrôleur dispose de plusieurs sources d'interruptions. • Une interruption externe, action sur la broche INT/RB0. • Débordement du TIMER0. • Changement d’état logique sur une des broches du PORTB (RB4 à RB7). • Une interruption d’un des périphériques (PEIE). - Fin de programmation d’une case mémoire de l’EEPROM. - Changement d’état sur le PORTD (PSPIE). - Fin de conversion analogique numérique (ADIE). - Réception d’une information sur la liaison série (RCIE).

- Fin d’émission d’une information sur la liaison série (TXIE).

- Interruption SPI ou I2C du module MSSP (SSPIE). - Interruption du registre de capture et/ou de comparaison 1 (CCPI1E). - Interruption du registre de capture et/ou de comparaison 2 (CCPI2E). - Débordement du TIMER1 (TMR1E). - Débordement du TIMER2 (TMR2E). - Collision de BUS (BCLIE) 6.2 Fonctionnement : Lors d’un événement dans un ou plusieurs des circuits périphériques (ADC, EEPROM, USART- SCI, MSSP-I2C-SPI, TIMER1, TIMER2) comme par exemple : la fin de conversion, la fin de programmation d’un octet dans l’EEPROM, la réception d’une information, la détection d’un front, etc.… et si le bit de l’interruption concernée a été autorisée (EEIE, PSPIE, ADIE, RCIE, TXIE, SSPIE, CCP1IE, TMR2IE, TMR1IE, CCP2IE ou BCLIE : Registres PIE1 et PIE2) alors une interruption périphérique est déclenchée. Pour que celle-ci soit prise en compte il faut que le bit d’autorisation des interruptions périphériques soit positionné à 1 (PEIE) ainsi que le bit GIE d’autorisation globale des interruptions du registre INTCON. Pour qu’une interruption du type TIMER0 ou INT/RB0 ou PORTB soit prise en compte il suffit que le bit local d’autorisation d’interruption soit positionné à 1 (T0IE ou INTE ou RBIE) ainsi que le bit GIE d’autorisation globale des interruptions du registre INTCON. Dans ces conditions le programme en cours d’exécution est interrompu et le microcontrôleur exécute le programme d’interruption à partir de l’adresse 0x0004. Au début de celui-ci il faut que le logiciel vérifie quel périphérique a déclenché l’interruption. Le programme se déroule normalement. Survient un événement spécifique. Le programme principal est interrompu (donc, subit une INTERRUPTION), et va traiter l’événement, avant de reprendre le programme principal à l’endroit où il avait été interrompu .L’interruption est donc une RUPTURE DE SEQUENCE ASYNCHRONE, c’est à dire non synchronisée avec le déroulement normal du programme. Vous voyez ici l’opposition avec les ruptures de séquences synchrones, provoquées par le programme lui-même (goto, call, btfss…). Mécanisme générale d’une interruption : Une routine d’interruption est un sous-programme particulier, déclenché par l’apparition d’un événement spécifique. Cela a l’air un peu ardu, mais vous allez voir que c’est très simple. Voici donc comment cela fonctionne : Le programme se déroule normalement  L’événement survient

  

Le programme achève l’instruction en cours de traitement Le programme saute à l’adresse de traitement de l’interruption Le programme traite l’interruption

Le programme saute programme principal.

à

l’instruction

qui

suit

la

dernière

exécutée

dans

le

Il va bien sûr de soi que n’importe quel événement ne peut pas déclencher une interruption. Il fault que 2 conditions principales soient remplies : L’événement en question doit figurer dans la liste des événements susceptibles de provoquer une interruption pour le processeur sur lequel on travaille L’utilisateur doit avoir autorisé l’interruption, c’est à dire doit avoir signalé que l’événement en question devait générer une interruption. Le programme principal ne sait pas quand il est interrompu, il est donc crucial de lui remettre ses registres dans l’état où ils étaient avant l’interruption. En effet, supposons que l’instruction xxx ait positionné un flag (par exemple, le bit d’indicateur Z). Si par malheur, la routine d’interruption a modifié ce bit, le programme ne pourra pas se poursuivre normalement. Nous voyons également que l’instruction xxx termine son exécution avant de se brancher sur la routine d’interruption. Une instruction commencée n’est donc jamais interrompue. Mécanisme d’interruption sur les PICs : les PICs répondent au fonctionnement général ci-dessus, mais elles ont également leurs particularités. Voyons maintenant le principe des interruptions sur les PICs Tout d’abord, l’adresse de début de toute interruption est fixe. Il s’agit toujours de l’adresse 0x04. Toute interruption provoquera le saut du programme vers cette adresse. Toutes les sources d’interruption arrivant à cette adresse, si le programmeur utilise plusieurs sources d’interruptions, il lui faudra déterminer lui-même laquelle il est en train de traiter. Les PICs en se connectant à cette adresse, ne sauvent rien automatiquement, hormis le contenu du PC, qui servira à connaître l’adresse du retour de l’interruption. C’est donc à l’utilisateur de se charger des sauvegardes. Le contenu du PC est sauvé sur la pile interne (8 niveaux). Donc, si vous utilisez des interruptions, vous ne disposez plus que de 7 niveaux d’imbrication pour vos sous-programmes. Moins si vous utilisez des sous-programmes dans vos interruption. Le temps de réaction d’une interruption est calculé de la manière suivante : le cycle courant de l'instruction est terminé, le flag d'interruption est lu au début du cycle suivant. Celui-ci est achevé, puis le processeur s'arrête un cycle pour charger l'adresse 0x04 dans PC. Le processeur se connecte alors à l'adresse 0x04 où il lui faudra un cycle supplémentaire pour charger l'instruction à exécuter. Le temps mort total sera donc compris entre 3 et 4 cycles.

Une interruption ne peut pas être interrompue par une autre interruption. Les interruptions sont donc invalidées automatiquement lors du saut à l’adresse 0x04 par l’effacement du bit GIE (que nous allons voir).

Les interruptions sont remises en service automatiquement lors du retour de l’interruption. L’instruction RETFIE agit donc exactement comme l’instruction RETURN, mais elle repositionne en même temps le bit GIE. . Le convertisseur Le CAN est un périphérique intégré destiné à mesurer une tension et la convertir en nombre binaire qui pourra être utilisé par un programme. Le16F877 travaille avec un convertisseur analogique/numérique qui permet un échantillonnage sur 10 bits. Le signal numérique peut donc prendre 1024 valeurs possibles. On sait que pour pouvoir numériser une grandeur, nous devons connaître la valeur minimale qu’elle peut prendre, ainsi que sa valeur maximale, Les pics considèrent par défaut que la valeur minimale correspond à leur Vss d’alimentation, tandis que la valeur maximale correspond à la tension positive d’alimentation Vdd. le principe de la conversion suit la séquence est la suivante : - Le pic connecte le pin sur laquelle se trouve la tension à mesurer à un condensateur interne, qui va se charger via une résistance interne jusque la tension appliquée. Le pin est déconnecté du condensateur, et ce dernier est connecté sur le convertisseur analogique/numérique interne. Le temps nécessaire à la conversion est égal au temps nécessaire à la conversion d’un bit multiplié par le nombre de bits désirés pour le résultat. Concernant notre pic, il faut savoir qu’il nécessite, pour la conversion d’un bit, un temps nommé Tad. Ce temps est dérivé par division d’horloge principale. Le diviseur peut prendre une valeur de 2, 8 ou 32. Le temps de conversion Tad ne peut détendre, pour des raisons électroniques, en dessous de 1.6 us pour les versions classiques de 16F87x, et en dessous de 6 us pour les versions LC. Donc en fonction des fréquences utilisées pour le quartz du pic, on choisit le diviseur le plus approprié. Voici un tableau qui reprend les valeurs de diviseur à utiliser pour quelques fréquences courantes du quartz et pour les PICs de type classique :

Diviseu r 2 8 32 Osc RC

20Mh z 100n s 400n s 1,6µ s 2-6µs

5Mhz

4Mhz

2Mhz

400n s 1,6µs

500n s 2µs

1µs

6,4µs

8µs

16µs

2-6µs

2-6µs

2-6µs

4µs

1,25Mh z 1,6µ s 6,4µ s 25,6µ s 2-6µs

333,3Kh z 6µs 24µs 96µs 2-6µs

Les valeurs 400ns; 1,6µs; 2µs; 4µs; 6,4; 24µs correspondent au meilleur diviseur en fonction de la fréquence choisie, en ce qui nous concerne puisqu’on utilise une

fréquence de 4MHZ, on utilisera la valeur de 2µs dans notre programmation. Il faut à présent préciser que le PIC nécessite un temps Tad avant le démarrage effectif de la conversion, et un temps supplémentaire Tad à la fin de la conversion.

Résumons donc le temps nécessaire pour effectuer l’ensemble des opérations : - On charge le condensateur interne (nécessite le temps Tacq). - On effectue la conversion (nécessite le temps 12 * Tad). - On doit attendre 2 * Tad avant de pouvoir recommencer une autre conversion.

Figure : cycle de conversion Le module de conversion utilise 4 registres disposés comme suit : *Registre de Résultat High (ADRESH) *Registre de Résultat Low (ADRESL) *Registre0 de Contrôle (ADCON0) *Registre1 de Contrôle (ADCON1) Regardons cela de prés dans la figure ci-dessous : Configuration interne du module de convertisseur analogique/numérique :

Figure : module du convertisseur

On voit très bien sur ce schéma que les pins AN2 et AN3 servent selon la position du sélecteur d’entrée analogique ou de tension de référence. Le sélecteur de canal permet de sélectionner lequel des 8 canaux va être appliqué au convertisseur analogique/digital. On voit que la sélection de la source des tensions de référence dépend de bits du registre ADCON1, tandis que le canal sélectionné pour être numérisé dépend d’ADCON0. C’est le registre ADCON1 qui détermine si ce port sera utilisé comme port I/O ou comme port analogique. Nous en aurons besoin dans la programmation.  Les registres ADRESL et ADRESH : Le convertisseur donne un résultat sur 10 bits, et donc que ce résultat devra donc obligatoirement être sauvegardé dans 2 registres. Ces registres sont tout simplement les registres ADRESL et ADRESH. Comme 2 registres contiennent 16 bits, et que nous n’en utilisons que 10, Microchip nous a laissé le choix sur la façon dont est sauvegardé le résultat, nous pouvons soit justifier le résultat à gauche, soit à droite La justification à droite complète la partie gauche du résultat par des « 0 ». Le résultat sera donc de la forme : ADRESH 0

0

ADRESL 0

0

0

0 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0

La justification à gauche procède bien évidemment de la méthode inverse : ADRESH

ADRESL

B9 B8 B7 B6 B5 B4 B3 B2 B1 B0

0

0

0

0

0

0

La justification à droite sera principalement utilisée lorsque nous avons besoin de l’intégralité des 10 bits de résultat, tandis que la justification à gauche est très pratique lorsque 8 bits vous suffisent. Dans ce cas, les 2 bits de poids faibles se trouvent isolés dans ADRESL, il suffit donc de ne pas en tenir compte. Cette approche est destinée à nous épargner des décalages de résultats. Le choix de la méthode s’effectue à l’aide du bit 7 d’ADCON1. Le registre ADCON1 : Ce registre permet de déterminer le rôle de chacune des pins AN0 à AN7. Il permet donc de choisir si un pin sera utilisé comme entrée analogique, comme entrée/sortie standard, ou comme tension de référence. Il permet également de décider de la justification du résultat. Pour pouvoir utiliser un pin en mode analogique, il faudra que ce pin soit configuré également en entrée par TRISA. Le registre ADCON1 dispose, comme tout registre accessible de notre PIC, de 8 bits, dont seulement 5 sont utilisés : 1.2 Tableau : le registre ADCON1 Page 80

B7 B6

ADFM INUTILISE

A/D result format select lu comme « 0 »

B5

INUTILISE

lu comme « 0 »

B4

INUTILISE

lu comme « 0 »

B3

PCFG3Port Configuration control bit 3

B2

PCFG2Port Configuration control bit 2

B1

PCFG1Port Configuration control bit 1

B0

PCFG1Port Configuration control bit 0

Le bit ADFM permet de déterminer si le résultat de la conversion sera justifié à droite (1) ou à gauche (0). Nous trouvons dans ce registre les 4 bits de configuration des pins liés au convertisseur analogique/numérique. Ces bits nous permettent donc de déterminer le rôle de chaque pin. Comme nous avons 16 combinaisons possibles, nous aurons autant de possibilités de configuration Le registre ADCON0 :

Ce registre est le dernier utilisé par le convertisseur analogique/numérique. Il contient les bits que nous allons manipuler lors de notre conversion. Sur les 8 bits de notre registre, 7 seront utilisés.

Tableau : le registre ADCON0 : B7

B6

ADCS 1

A/D conversion Clock Select bit 1

ADCS A/D conversion Clock Select 0 bit 0

B5

CHS2

B4

CHS 1 CHS 0 GO/DON E

Analog Channel Select bit2 Analog Channel Select bit1 Analog Channel Select bit0 A/D conversion status bit

B1

Inutilis é

lu comme « 0 »

B0

ADO N

B3 B2

A/D ON bit

l’oscillateur : L’horloge est un système qui peut être réalisée soit avec un QUARTZ(a), soit avec une horloge extérieur(b), soit avec un circuit RC(c), dans ce dernier la stabilité du montage est limitée. La fréquence maximale d’utilisation va dépendre de Microcontrôleur utilisé. Le suffixe indiqué sur le

boîtier donne la nature de l’horloge à utiliser et sa fréquence maximale