Vous êtes sur la page 1sur 50

LYCEE TECHNIQUE ERRAZI EL JADIDA

SCIENCE DE L’INGENIEUR

SCIENCES ET TECHNOLOGIES ELECTRIQUES

NIVEAU 2 EME ANNEE

PARTIE TRAITER
Les systèmes
programmables

SCIENCES DE L’INGENIEUR [- 2 -]
Environnement micro-informatique minimal
Un microprocesseur est un circuit intégré complexe caractérisé par une très grande
intégration. Il est conçu pour interpréter et exécuter de façon séquentielle les instructions
d’un programme. Pour fonctionner, le microprocesseur, doit être associé à d’autres
composants :

- Une mémoire où est implémenté le programme de façon permanente ;


- Une mémoire pour stocker temporairement les résultats et les données ;
- Une ou plusieurs interfaces pour l’échange d’informations avec l’extérieur.

L’association de ces éléments constitue un système à microprocesseur. Il équipe


principalement les systèmes informatiques.

Environnement minimal

Le microprocesseur ne peut fonctionner sans un environnement minimal comportant :


- Une zone de mémoire vive pour les données et les résultats.
- Une zone de mémoire morte pour le programme.
- Une ou plusieurs interfaces pour les périphériques.
Chaque ensemble doit être relié aux autres par l'intermédiaire de bus ayant chacun une
fonction spécifique :
- Un bus des données,
- Un bus des adresses,
- Un bus de commande.

Système à microprocesseur
Exemple : Microprocesseur 6809

SCIENCES DE L’INGENIEUR [- 3 -]
Pour l’environnement du 6809 :

- Le bus des données communique avec le microprocesseur par l’intermédiaire de


huit broches bidirectionnelles (D0 à D7), d’où la possibilité de traiter des mots de huit bits.
- Le bus des adresses avec sa liaison établie par seize broches unidirectionnelles (A0 à A15)
permet de gérer 216 emplacements mémoires soit 65 536 (= 64 kilo-octets = 64  1 024 car 1
Ko = 210 octets).
- Le bus de commande communique avec dix bornes (12 pour le microprocesseur
6809E dont l’horloge est externe).

Compléter le tableau ci-dessous en écrivant :


- La première adresse en binaire, en hexadécimale et en décimal
- La dernière adresse en binaire, en hexadécimale et en décimal

Mémoires :
- RAM (Random Acces Memory : mémoire à accès aléatoire (lecture et écriture)) :

Les RAM statiques (SRAM) (à base de bascules)


Les RAM dynamiques (DRAM) (charge de condensateurs, grande densité )
d'intégration, consommation réduite, doivent être rafraîchies régulièrement pour
entretenir la mémorisation.
- ROM (Read Only Memory : mémoire à lecture seulement) : programmée une seul fois
par le constructeur)
- PROM (Programmable ROM) : peut être programmée une seule fois par l'utilisateur.
- EPROM ou UV-EPROM (Erasable Programmable ROM) est une PROM qui peut être
effacée.
- EEPROM (Electically EPROM) est une mémoire programmable et effaçable
électriquement.
- Flash EPROM (ou mémoire flash) : type d’EEPROM rapide

SCIENCES DE L’INGENIEUR [- 4 -]
Répondre :

 Calculer la capacité mémoire de ce composant en nombre d’octets :


……………………………………………………………………………………………………

 Calculer sa capacité en nombre de kilo-octets (sachant qu’un kilo vaut 210 soit 1024) :
…………………………………………………………………………………………

 Calculer sa capacité en nombre de bits :


………………………………………………………………………………………..

 Calculer sa capacité en nombre de kilo-bits :

 ………………………………………………………………………………………..

SCIENCES DE L’INGENIEUR [5]


Architecture d’un microprocesseur (famille Motorola 68XX)

- D’une Unité Arithmétique et Logique (UAL) est en charge de l’exécution des calculs :
→Arithmétiques : addition, soustraction etc. ;
→ Logiques : des comparaisons de mots binaires, opérations logique (OU, ET, NON,
OU exclusif) etc.

- Des registres et accumulateurs qui permettent de stocker les données :

Le registre code condition (ou registre d’état) CCR contient des indications sur le
résultat après chaque traitement de l’unité arithmétique et logique. Il est modifié
automatiquement par l’unité arithmétique et logique quand elle effectue une opération.
Le compteur de programme (PC, Program Counter), est le registre qui pointe dans la
mémoire l’adresse de la prochaine instruction à traiter par l’unité de commande.
Le pointeur de pile SP (Stack Pointer) est le registre qui pointe l’adresse du dernier
élément de la pile. La pile est utilisée pour stocker des données intermédiaires ou
l’adresse de retour des sous programmes.
Le registre d’index X est un registre qui pointe l’adresse en cours de lecture dans une
table de données.

- D’une unité de contrôle qui lit séquentiellement les instructions et génère les signaux de
commande.
Un microprocesseur est toujours associée à de la mémoire avec qui il communique grâce au bus
d’adresse et de données. C’est dans la mémoire que se trouve le programme à exécuter.

SCIENCES DE L’INGENIEUR [6]


SCIENCES DE L’INGENIEUR [7]
MICROCONTROLEURS

SCIENCES DE L’INGENIEUR [8]


I- DESCRIPTION ET STRUCTURE INTERNE DES MICROCONTROLEURS

Un microcontrôleur se présente sous la forme d’un circuit intégré réunissant tous les éléments d’une structure à base de
microprocesseur (figure 1). Voici généralement ce que l’on trouve à l’intérieur d’un tel composant :

- Un microprocesseur (C.P.U.),
- De la mémoire de donnée (RAM et EEPROM),
- De la mémoire programme (ROM, PROM, EPROM ou EEPROM),
- Des interfaces parallèles pour la connexion des entrées / sorties,
- Des interfaces séries (synchrone ou asynchrone) pour le dialogue avec d’autres unités,
- Des timers pour générer ou mesurer des signaux avec une grande précision temporelle,
- Des convertisseurs analogique / numérique (CAN) pour le traitement de signaux analogiques.
- Un chien de garde, ce dispositif est un système anti-plantage du microcontrôleur. Il s’assure qu’il n’y ait pas d'exécution
prolongée d’une même suite d’instructions.
- Le signal d’horloge. qui permet de cadencer le fonctionnement du microcontrôleur.

Figure 1 : Structure interne d’un microcontrôleur

➢ Avantages :

• Encombrement réduit,
• Circuit imprimé peu complexe,
• Faible consommation,
• Coût réduit.

➢ Inconvénients :
• Système de développement onéreux,
• Programmation nécessitant un matériel adapté.

SCIENCES DE L’INGENIEUR [9]


II- MICROCONTROLEUR PIC 16F84

Un PIC (Programmable Interface Controler) est un microcontrôleur de chez Microchip. Son microprocesseur est de type
RISC (Reduced Instruction Set Computer) qui possède un nombre réduit d’instructions (35), Chacune d’elles s’exécute en une
période d’horloge.
Un microprocesseur CISC (Complex Instruction Set Computer) possède un nombre important d’instructions, Chacune d’elles
s’exécute en plusieurs périodes d’horloges.

Nous utiliserons un PIC 16F84 –10, soit :


- 16 : Mid-Line : Les instructions sont codées sur 14 bits. On trouve aussi Base-Line : 12bits et High-End : 16bits.
- F : FLASH : type de mémoire programme. (C : EPROM ou EEPROM. CR : PROM)
- 84 : Type
- 10 : Quartz à 10MHz au maximum
- L : Tolérance plus importante de la plage de tension, pour le 16LF84.

II.1. Aspect externe du 16F84


Le 16F84 est commercialisé dans un boîtier 18 broches classiques

II-2 HORLOGE

L'horloge peut être soit interne soit externe :

- Oscillateur à quartz (interne) : 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)

- Oscillateur RC (interne) : la fréquence de


l'oscillation est fixée par Vdd, Rext et Cext.
Elle peut varier légèrement d'un circuit à
l'autre.

- Dans certains cas, une horloge externe au


microcontrôleur peut être utilisée pour
synchroniser le PIC sur un processus
particulier.

SCIENCES DE L’INGENIEUR [10]


II-3 Architecture générale

L'architecture générale du circuit est constituée des éléments suivants :

• Une mémoire programme de type flash de 1K (1024) mots de 14 bits


• Une mémoire RAM constituée :
o Des registres de control SFR (Special Function Registers)
o 68 octets de RAM utilisateur appelés aussi GPR (General Propose Resisters)
• Une mémoire EEPROM de donnée de 64 octets
• Deux ports d'entrée sortie, un de 8 bits et un de 5 bits
• Un timer/Compteur cadencé par une horloge interne ou externe
• Un chien de garde / compteur qui est un timer particulier
• L'horloge peut être générée par 4 types d'oscillateurs sélectionnables
• Protection de code
• Fonctionnement en mode sleep pour réduction de la consommation
Diagramme bloc du 16F84A

SCIENCES DE L’INGENIEUR [11]


III- ORGANISATION DE LA MEMOIRE DU PIC 16F84
La mémoire du PIC 16F84 est répartie en trois espaces, logés sur la même pastille de silicium :

3.1) La mémoire programme (flash)


Une mémoire EEPROM de type flash, de 1 K mots de 14
bits, allant de l’adresse 000 à l’adresse 3FF.

Cet espace est dénommé mémoire de programme,


dont le plan est le suivant :

5 adresses réservées au μC 0005h


000 : Vecteur de Reset
004 : Vecteur d’Interruption
0005 Début du programme utilisateur

1019 adresses restantes, disponibles


pour y loger les instructions de votre
programme.

3FF Fin de l’espace mémoire Disponible

Mémoire programme (Program memory)


3.2) Mémoire données (Data Memory) 00h/00d 8bits
EEPROM flash, de 64 emplacements à 8 bits, allant de l’adresse 00 à
l’adresse 3F, auxquels on accède uniquement par l’intermédiaire de quatre
registres spéciaux:

-EEADR (EEprom ADRess) pour ce qui concerne les adresses.


- EEDATA (EEprom DATA) pour ce qui concerne les données.
- EECON1, EECON2 (EEprom CONtrol) : permettent de
définir le mode de fonctionnement de cette mémoire.

Ces 64 octets sont conservés après une coupure


de courant et sont très utiles pour conserver des
paramètres semi-permanents.

3Fh/63d 8bits

Mémoire
données

3.3) Fichier registre (Register File)


SCIENCES DE L’INGENIEUR [12]
Réservé aux données, cette mémoire RAM est
organisée en 2 banques (banque 0 et banque 1).

Cette RAM est subdivisée de plus en deux parties :

a) Registres spéciaux SFR : Special Fonction


Registr (Registres à Fonction Spéciale).24
emplacements à 8 bits dont 12 situés en Page 0
(adresses 00 à 0B) et 12 situés en Page 1
(adresses 80 à 8B).

b) Cases mémoires « libres » :, constituée de 68


emplacements à 8bits (adresses de 0C à 4F)
situés juste au-dessous des registres spéciaux
formant la RAM utilisateur proprement dite, selon
la mappe détaillée ci-après.

Malheureusement, l’indication « mapped in bank 0)


vous indique qu’accéder à ces 68 octets depuis la
banque 0 ou la banque 1 donne en fait accès à la
même case mémoire.

3.4 La mémoire EEPROM de configuration

- Bit 0 - FOSC0 (OSCillateur zéro) et


- Bit 1 - FOSC1 (OSCillateur un)

- Bit 2 - WDTE (Watch-Dog Timer Enable)


1 = autorise le chien de garde 0 = n’autorise pas le chien de garde
- Bit 3 - PWRTE (PoWeR Timer Enable)
Le μC possède un timer permettant de retarder de 72 ms le lancement du programme après la mise sous tension du
circuit.
1 = le μC attend 72 ms 0 = le μC démarre tout de suite
- Bit 4 - CP (Code Protection)
1 = pas de protection (le μC pourra être lu correctement)
0 = avec protection (le μC ne pourra plus être lu correctement. Le contenu de la mémoire sera désorganisé).

IV- Les ports d’entrée/sortie

SCIENCES DE L’INGENIEUR [13]


Le pic 16F84 possède deux ports d’entrée/sortie (PORTA et PORT B) dont les broches sont
bidirectionnelles et qu'ils peuvent être programmées soit en entré soit en sortie.
4.1 Les registres PORTA et TRISA
Le « PORTA » est le registre qui représente l’image des pins RA0 à RA4. Ce registre se situe à l’adresse 05H,
dans la banque0. Chaque bit de ce registre représente un pin. Donc, seuls 5 bits sont utilisés. Pour écrire sur un pin
en sortie, on place le bit correspondant à 1 ou à 0, selon le niveau souhaité.

Le registre de direction « TRISA » est situé à la même adresse que PORTA, mais dans la banque 1. Son
adresse complète sur 8 bits est donc 0x85. Ce registre est d’un fonctionnement très simple et est lié au fonctionnement
du PORTA.

- Chaque bit positionné à 1 configure le pin correspondant en entrée.


- Chaque bit à 0 configure le pin en sortie

4.2 Les registres PORTB et TRISB


Ces registres fonctionnent exactement de la même manière que PORTA et TRISA, mais concernent bien entendu
les 8 pins RB. Tous les bits sont donc utilisés dans ce cas.

V- registres fondamentaux

5.1 Le registre « W »

Ce registre est un registre utilisé par les pics pour réaliser toutes sortes de calculs. Dans une instruction la
destination d’un résultat (d) peut en général être un emplacement RAM (f) ou le registre de travail (w). C’est un donc un
registre fondamental.

5.2 Le registre « STATUS » Les indicateurs d’état (drapeaux)


C’est un registre dont chaque bit a une signification particulière. Il est principalement utilisé pour tout ce qui
concerne les tests. Il est donc également d’une importance fondamentale.

Au reset : STATUS = 00011XXX


Bit 7 : IRP = permet la sélection des pages en adressage indirect.
Pour les deux pages possibles du PIC 16F84 (de 00 à 7F et de 80 à FF) ce bit doit être laissé à "0". Mis à "1" il
permettra d'atteindre les pages 3 et 4 (de 100 à17F et de 180 à 1FF) pour les futurs produits de Microchip.
Bits 6 et 5 : RP1 et RP0 = permettent la sélection des pages en adressage direct.

SCIENCES DE L’INGENIEUR [14]


Pour les deux pages possibles du PIC 16F84 (de 00 à 7F et de 80 à FF) le bit RP1 doit être laissé à "0".
Mis à "1" il permettra d'atteindre les pages 3 et 4 (de 100 à17F et de 180 à 1FF) pour les futurs produits de Microchip.

Bit 4 : TO = Time Out bit. Bit en lecture seulement.


1 = Après une mise sous tension, après une RAZ du watchdog (CLRWDT) ou bien après l'instruction SLEEP.
0 = Signifie qu'un Time Out du timer de watchdog est survenu.
Bit 3 : PD = Power Down bit.
1 = Après une mise sous tension ou bien après une RAZ du Watchdog.
0 = Après l'instruction SLEEP.
Bit 2 : Z = Zero bit.
1 = Le résultat d'u ;ne opération arithmétique ou logique est zéro.
0 = Le résultat d'une opération arithmétique ou logique est différent de zéro.
Bit 1 : DC = Digit Carry bit.
1 = Une retenue sur le 4ème bit du poids faible est survenue après les instructions : ADDWF et ADDLW.
0 = Pas de retenue sur le 4eme bit des poids faibles.
Bit 0 : C = Carry bit.
1 = Une retenue sur le bit MSB est survenue après les instructions ADDWF et ADDLW.
0 = Pas de retenue sur le bit MSB.

SCIENCES DE L’INGENIEUR [15]


VI- Les instructions du PIC 16F84

Le microcontrôleur 16F84 possède un set de seulement 35 instructions codées (en représentation binaire) sur 14 bits,
selon le modèle : XX XXXX XXXX XXXX
bit de poids fort bit de poids faible
Codées en hexadécimal, elles prennent la forme :
0XXX
1XXX
2XXX
3XXX
Avec une étendue comprise entre 0000 et 3FFF.
La plupart des instructions opèrent en utilisant le registre de travail
W (Working register), et soit un registre soit une valeur immédiate
codée sur 8 bits appelée literal.

6.1 Instructions orientées octet (adressage direct).


Ce sont des instructions qui manipulent les données sous forme
d’octets. Elles sont codées de la manière suivante :

- 6 bits pour l’instruction : logique, car comme il y a 35


instructions, il faut 6 bits pour pouvoir les coder toutes
- 1 bit (d) pour indiquer si le résultat obtenu doit être conservé
dans le registre de travail (accumulateur) W de l’unité de calcul
(W pour Work) ou sauvé dans un registre F (F pour File).
- Reste 7 bits pour encoder l'adresse de l’opérande (128 positions au
total)
Problème ! 7 bits ne donnent pas accès à la mémoire RAM totale,
donc voici l’explication de la division de la RAM en deux banks. Pour
remplacer le bit manquant, on utilise le bit RP0 du registre STATUS.
Exemple : MOVWF 0x2C ; recopie W dans la case mémoire
d'adresse 2C.

6.2 Les instructions « orientées bits »


Ce sont des instructions destinées à manipuler directement les bits d’un registre d'une case mémoire. Elles sont codées
de la manière suivante :
- 4 bits pour l’instruction
- 3 bits pour indiquer le numéro du bit à manipuler (de 0 à 7)
- 7 bits pour indiquer l’opérande.

6.3 Les instructions opérant sur une donnée (adressage immédiat)


Ce sont les instructions qui manipulent des données qui sont codées dans l’instruction directement. Elles sont codées de
la manière suivante :

- L’instruction est codée sur 6 bits


- Elle est suivie d’une valeur IMMEDIATE codée sur 8 bits (donc de 0 à 255).

6.4 Les instructions de saut et appel de procédures

Ce sont les instructions qui provoquent une rupture dans la séquence de déroulement du programme. Elles sont
codées de la manière suivante :

- Les instructions sont codées sur 3 bits


- La destination est codée sur 11 bits
11
Nous pouvons déjà en déduire que les sauts ne donnent accès qu’à 2K de mémoire programme (2 ). Pas de problème
pour le 16F84 qui ne possède que 1k de mémoire programme.

SCIENCES DE L’INGENIEUR [16]


VII- Le jeu d’instructions de la famille 16F8XX

Résumé des instructions (mnémonique)

{W,F ? d} signifie que le résultat va soit dans W si d=0 soit dans F si d= 1 ou f

Etats de quelques registres à l’initialisation

SCIENCES DE L’INGENIEUR [17]


VIII- Exemples d'instructions

✓ Les instructions MOVWF et MOVF

Ce sont les instructions les plus utilisées,


MOVWF ; permet de copier l’accumulateur W dans un registre
(SFR ou GPR).
MOVWF STATUS ; signifie : Copier le contenu de W dans le registre
STATUS
MOVWF H’55’ ; signifie : Copier le contenu de W dans
la case mémoire d’adresse 55h

MOVF permet de copier le contenu d’un registre (SFR ou GPR) dans l’accumulateur W, le paramètre d doit être = 0

MOVF STATUS,0 ; Copier le contenu du registre STATUS dans


l’accumulateur W
MOVF 0x35,0 ; Copier le contenu de la case mémoire
d’adresse 35h dans l’accumulateur W
MOVF STATUS,1 ; Copier le contenu du registre STATUS dans lui même

En réalité cette instruction peut s’avérer utile car, comme elle


positionne l’indicateur Z, elle permet de tester si le contenu d’un
registre est égal à zéro.

✓ Les instructions btfss et btfsc


Ces instructions permettent de tester un bit et de sauter ou non une ligne de programme en fonction de la valeur du bit,

BTFSC F,b : Bit Test Skip if Clear : teste le bit b du registre F et saute l’instruction suivante si le bit testé est nul

BTFSS F,b : Bit Test Skip if Set : teste le bit b du registre F et saute l’instruction suivante si le bit testé est égal à 1.

Exemple :
SUBLW 100 ; 100 – W __> W
BTFSS STATUS,Z ; tester le bit Z du registre STATUS et sauter une ligne si Z=1
CLRF H’70’ ; après btfss, le programme continue ici si Z=0
CMPF H’70’H,f ; après btfss, le programme continue ici si Z=1
suite du programme

✓ Les instructions incfsz et decfsz

Ces instructions permette d’incrémenter ou de décrémenter un registre et de sauter si le résultat est nul.

INCFSZ F,1 : Increment Skip if Z : incrémente le registre F et sauter une ligne si le résultat = 0. Le paramètre
1 indique que le résultat de l’incrémentation doit aller dans F.
DECCFSZ F,1 : decrement skip if Z : décrémente le registre F et sauter une ligne si le résultat = 0. Le paramètre
1 indique que le résultat de la décrémentation doit aller dans F.

✓ L’instruction goto

Permet de transférer l’exécution à une autre position du programme repérée par une étiquette (label)(bonjour ds notre
exemple)
Instruction 1
Instruction 2
Goto bonjour
instruction 3
instruction 5
bonjour instruction 6
instruction 7

SCIENCES DE L’INGENIEUR [18]


IX- Les modes d’adressages

a- L’adressage littéral ou immédiat

Exemple :
MOVLW 0x55 ; charger la valeur 0x55 dans W

b- L’adressage direct
Exemple :
MOVF 0x10,w ; charger le contenu de l’emplacement 0x10 dans W

c- L’adressage indirect

Exemple1:

MOVLW 0x50 ; chargeons une valeur quelconque dans W


MOVWF 0x0E ; et plaçons-la dans l’emplacement mémoire d’adresse 0x0E.
MOVLW 0x0E ; on charge l’ADRESSE 0x0E, dans W : (W) = 0x0E
MOVWF FSR ; on place l’adresse 0x0E dans FSR.
; On dira que FSR POINTE sur l’adresse 0x0E.
MOVF INDF,w ;charger le contenu de INDF dans W.
MOVWF 0x10

adresse donnée
0C
0D FF
MOVF INDF,w
FSR 0E 0E 50 …. W
0F FF
10 …
11
12
13

Exemple 2 : Soit à effacer la zone mémoire allant de l’adresse 0x0C à 0x3F

adresse donnée adresse donnée


0C 8A 0C ….
0D AC 0D …..
0E 20 0E ….
0F 14 0F ….
10 00 10 ….
11 FF 11 ….
12 1D 12 ….
13 40 13 ….
14 68 14 ….
15 77 15 ….
: : : :
: : : :
3F 3F ….
movlw 0x0C ; initialiser pointeur
……. ………. ; charger l’adresse 0x0C dans FSR
NEXT clrf INDF ; effacer registre INDF
……. FSR ; inc pointeur
btfss FSR,6 ; Si (FSR)=40h → fin boucle
goto …….. ; Non, aller à NEXT
: ; oui, on continue le programme

SCIENCES DE L’INGENIEUR [19]


X- Le Timer TMR0 (compteur)

C’est un compteur 8 bits (contrôlé par le registre OPTION_REG) ayant les caractéristiques suivantes :

OPTION_REG

Au reset : OPTION_REG = 11111111

✓ Il est incrémenté en permanence soit par l’horloge interne Fosc/4 (mode timer) soit par une horloge externe
appliquée à la broche RA4 du portA (mode compteur). Le choix de l'horloge se fait à l'aide du bit T0CS (Timer zero
Clock Source) du registre OPTION_REG

• TOCS = 0 → horloge interne


• TOCS = 1 → horloge externe appliquée à RA4
✓ Dans le cas de l'horloge externe, on peut choisir le front sur lequel le TIMER s'incrémente avec T0SE (Timer 0 Signal
Edge).
• TOSE = 0 → incrémentation sur fronts montants
PS2 PS1 PS0 DIV
• TOSE = 1 → incrémentation sur fronts descendants
0 0 0 2
0 0 1 4
✓ Quelque soit l'horloge choisie, on peut la passer dans un diviseur de 0 1 0 8
fréquence programmable (prescaler) dont le rapport est fixés par les bits 0 1 1 16
PS0, PS1 et PS2 du registre OPTION_REG (tableau ci-dessous). 1 0 0 32
L'affectation ou non du prédiviseur se fait à l'aide du bit PSA (Pre-Scaler 1 0 1 64
Assignment) du registre OPTION_REG. 1 1 0 128
• PSA = 0 → on utilise le prédiviseur 1 1 1 256
• PSA = 1 → pas de prédiviseur (affecté au chien de garde)

✓ Le contenu du timer TMR0 est accessible par le registre qui porte le même nom. Il peut être lu ou écrit à n'importe
quel moment. Après une écriture, l'incrémentation est inhibée pendant deux cycles instruction.

✓ Au débordement de TMR0 (FF → 00), le drapeau T0IF du registre INTCON est placé à 1. Ceci peut déclencher
l'interruption T0I si celle-ci est validée par le bit T0IE (INTCON).

Registre INTCON

Structure du TIMER0

TH T0 T0F

Bit 7 : RBPU = Pull up Enable bit on Port B. 1 = Pull up désactivé sur le Port B. 0 = Pull up activé.
Bit 6 : INTEDG = Interrupt Edge select bit.
1 = Interruption si front montant sur la broche RB0/INT.
0 = Interruption si front descendant sur RB0/INT.

XI- Le chien de garde WDT (Watchdog Timer)


SCIENCES DE L’INGENIEUR [20]
C'est un système de protection contre un blocage du programme. Par exemple, si le programme attend le résultat d'un
système extérieur (conversion analogique numérique par exemple) et qu'il n'y a pas de réponse, il peut rester bloquer.
C’est un compteur 8 bits incrémenté en permanence (même si le μC est en mode sleep (sommeil)) par une horloge RC
intégrée indépendante de l'horloge système. Lorsqu’il 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é.
• Si le μC est en mode SLEEP, le WDT time-out provoque un WAKE-UP (réveil), l'exécution du programme continue
normalement là où elle s'est arrêtée avant de rentrer en mode SLEEP. Cette situation est souvent exploitée pour réaliser
des temporisations.

L'horloge du WDT est ajustée pour que Le Time-Out arrive toutes les 18 ms. Il est cependant possible d'augmenter cette
durée en faisant passer le signal Time-Out dans un prédiviseur programmable (partagé avec le timer TMR0). L’affectation se
fait à l'aide du bit PSA du registre OPTION_REG.
• PSA = 1 → on utilise le prédiviseur.
• PSA = 0 →pas de prédiviseur (affecté à TMR0).

Le rapport du prédiviseur est fixé par les bits PS0, PS1 et PS2 du registre OPTION_REG. 8 valeurs de 1 à 128 sont
disponibles, ce qui permet d'aller jusqu'à 128*18ms=2.3s avant le déclenchement du chien de garde.

L'utilisation du WDT doit se faire avec précaution pour éviter la réinitialisation (inattendue) répétée du programme. Pour
éviter un WDT timeOut lors de l'exécution d'un programme, on a deux possibilités :

• Inhiber (désactiver) le WDT d'une façon permanente en mettant à 0 le bit WDTE dans l'EEPROM de configuration.
l'EEPROM de configuration

• Remettre le WDT à 0 périodiquement dans le programme à l'aide de l'instruction CLRWDT pour éviter qu'il ne
déborde

Structure du chien de garde

XII- Le mode SLEEP (sommeil)

SCIENCES DE L’INGENIEUR [21]


Le PIC peut être placé en mode faible consommation à l'aide de l'instruction SLEEP. Dans ce mode, l'horloge système
est arrêtée ce qui arrête l'exécution du programme.

Pour sortir du mode SLEEP, il faut provoquer un WAKE-UP (réveil), pour cela il y a 3 possibilités :
1. RESET externe dû à l'initialisation du PIC en mettant l'entrée MCLR à 0. Le PIC reprend l'exécution du
programme à partir du début.
2. Timeout du chien de garde WDT si celui-ci est validé. Le PIC reprend le programme à partir de l'instruction qui
suit l'instruction SLEEP.
3. Interruption INT (sur RB0) ou RBI (sur RB4-RB7) ou EEI (fin d'écriture en EEPROM de données). Le bit de
validation de l'interruption en question doit être validé, par contre, le WAKE-UP a lieu quelque soit la position de
bit de validation globale GIE. On a alors deux situations :
a. GIE = 0, Le PIC reprend l'exécution du programme à partir de l'instruction qui suit l'instruction SLEEP,
l'interruption n'est pas prise en compte.
b. GIE = 1, Le PIC exécute l'instruction qui se trouve juste après l'instruction SLEEP puis se branche à
l'adresse 0004 pour exécuter la procédure d'interruption. Dans le cas où l'instruction suivant SLEEP
n'est pas désirée, il faut utiliser l'instruction NOP.

XIII- La mémoire EEPROM de données


Le PIC possède une zone EEPROM (DATA MEMORY) de 64 octets (allant de l’adresse 0x2100 à 0x213F) accessibles
en lecture et en écriture par le programme. On peut y sauvegarder des valeurs, qui seront conservées même si
l'alimentation est éteinte, et les récupérer lors de la mise sous tension. On accède à cette mémoire uniquement par
l’intermédiaire de quatre registres spéciaux:
- EEADR (EEprom ADRess) pour ce qui concerne les adresses
- EEDATA (EEprom DATA) pour ce qui concerne les données
- EECON1 (EEprom CONtrol) permettant de définir le
- EECON2 mode de fonctionnement de cette mémoire.

La durée d’écriture d’un octet est de l’ordre de 10 ms, la fin de chaque écriture réussie est annoncé par le drapeau EEIF et la
remise à zéro du bit WR du registre EECON1. Le drapeau EEIF peut déclencher l'interruption EEI si elle a été validée.

a- Procédure de lecture dans l'EEPROM de données.


Exemple : on veut lire le contenu de l’emplacement mémoire 03 :
BCF STATUS,RP0 ; passer en banque 0.
MOVLW Adresse ; charger Adresse (00à 3F) dont on veut lire le contenu
MOVWF EEADR dans EEADR 1 = L'opération d'écriture est terminée. Ce Flag doit être
BSF STATUS,RP0 ; passer en banque1 remis à zéro par soft.
BSF EECON1,RD ;lancer la lecture de l’EEPROM 0 = L'opération d'écriture n'est pas terminée ou n'a pas
BCF STATUS,RP0 ; passer en banque 0 encore démarré.
MOVF EEDATA,W ;charger valeur lue dans W

b- Procédure d'écriture dans l'EEPROM de données.


EECON1
BCF STATUS,5 ; Accès page 0.
MOVLW Adresse ; Adresse est une valeur entre 00 et 3F.
MOVWF EEADR ; Ecriture adresse dans registre Adresse 1 = Une opération d'écriture s'est terminée
MOVLW Data ; Data est une valeur entre 00 et FF. prématurément à cause d'un reset ou de l'entrée en
MOVWF EEDATA ; Ecriture data dans le registre de DATA. action du watchdog pendant la phase d'écriture.
BSF STATUS,5 ; Accès page 1.
BCF INTCON,7 ; Interdit les IT par bit GIE = 0. 0 = L'opération d'écriture s'est passé correctement.
BSF EECON1,2 ; Autorise écriture par bit WREN = 1. 1 = Autorise les cycles d'écriture.
MOVLW h'55' ; Début de la séquence d'initialisation. 0 = Interdit l'écriture dans l'EEPROM.
Séquence MOVWF EECON2 ; Ecriture valeur h"55" dans EECON2.
MOVLW h'AA'
d'initialisation 1 = Démarre un cycle d'écriture. Ce bit ne peut qu'être
MOVWF EECON2 ; Ecriture valeur h"AA" dans EECON2.
mis à "1"par soft. Il est remis à "0" par hard quand
BSF EECON1,1 ; Démarrage cycle écriture par bit WR = 1.
TESTFL BTFSS EECON1,4 ; Test du flag "fin d'écriture". l'écriture est terminée.
GOTO TESTFL ; pas fini car flag EEIF = 0.
0 = Le cycle d'écriture en EEPROM est terminé.
BCF EECON1,4 ; C'est fini, RAZ du flag EEIF obligatoire. 1 = Débute un cycle de lecture de l'EEPROM. Ce bit ne
BCF EECON1,2 ; On interdit l'écriture par bit WREN = 0. peut qu'être mis à "1" par soft. Il est remis à "0" par hard.
0 = Ne débute pas un cycle de lecture.

XIV- LES INTERRUPTIONS

SCIENCES DE L’INGENIEUR [22]


Une interruption provoque l’arrêt du programme principal 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é

Lorsque l'événement déclencheur d'une


interruption intervient, alors son drapeau est
positionné à un (levé). Si l'interruption
correspondante a été validée, elle est alors
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 en
exécutant les étapes suivantes :
• 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 procédure d'interruption (instruction
RETFIE) :
o le bit GIE est replacé à l'état haut (autorisant
ainsi un autre événement)
o le contenu du PC est rechargé à partir de la
pile ce qui permet au programme de
reprendre là où il s'est arrêté

Les sources d’interruptions du 16F84


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

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.

Permet de valider ou d’invalider toutes les interruptions


Les sources d’interruptions
Ce bit permet de valider l’interruption de fin d’écriture en EEPROM
Valide l’interruption générée par le débordement du timer0
Valide l’interruption dans le cas d’une modification de niveau du pin RB0.

Signale qu’une des entrées


RB4 à RB7 a été modifiée.

Détermine quel est le sens de transition qui Signale une transition sur la pin RB0 dans le sens
provoque l’interruption déterminé par INTEDG du registre OPTION (b6)
C’est un Flag, il signale la fin d’écriture en EEPROM C’est un Flag, il signale le débordement du timer0.

Valide les interruptions si on a changement de niveau sur une des entrées RB4 à RB7.

Sauvegarde et restitution du contexte

SCIENCES DE L’INGENIEUR [23]


C'est un point important pour tous les sous-programmes qui devient capital pour les sous-programmes d'interruption.
En effet, beaucoup d'instructions modifient le registre STATUS et/ou utilisent le registre W. Afin de les rendre dans
le même état à la fin du sous-programme d'interruption qu'au début, il faut les sauvegarder au début et les recopier
à la fin. Si d'autres registres sont utilisés dans le sous-programme d'interruption, il faut généralement les sauvegarder
aussi.

Voici donc la structure de base d’une routine d’interruption :

; sauvegarder registres

Org 0x004 ; adresse d'interruption


Movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
; switch vers différentes interrupts
; ----------------------------------
; ici, on teste éventuellement de quelle interruption il s’agit
; traitement des interruptions
; -----------------------------
; ici, on peut traiter interruption puis effacer son flag
; restaurer registres

swapf status_temp,w ; swap ancien status, résultat dans w


movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; Ré-inversion de L et H dans W
; W restauré sans modifier status
retfi ; return from interrupt

Reconnaissance de l'interruption active


Les bits 0 à 2 du registre INTCON et le bit 4 du registre EECON1 permettent de savoir quel événement extérieur a
déclenché une interruption. Ainsi, au début du programme d'interruption, si plusieurs sources ont été validées, il faut
impérativement aller tester ces différents bits pour connaître la source active et dérouler le programme correspondant.
On utilise pour cela l'instruction btfsc qui exécute l'instruction suivante si le bit testé vaut 1, la saute sinon.

btfsc INTCON, RBIF ; Test du bit RBIF


call Int_PB ; Appel sous-programme si RBIF=1
btfsc INTCON, 1 ; Test du bit INTF
call Int_Ext ; Appel sous-programme si INTF=1
btfsc INTCON, 2 ; Test de bit T0IF
call Int_Timer ; Appel sous-programme si T0IF=1
btfsc EECON1, 4 ; Test de bit EEIF
call Int_Eeprom ; Appel sous-programme si EEIF=1

SCIENCES DE L’INGENIEUR [24]


PIC 16F876/877

SCIENCES DE L’INGENIEUR [25]


PIC 16F876/877
✓ BROCHAGE

✓ Eléments essentiels du PIC 16F877

• Une mémoire programme de type EEPROM flash de 8K mots de 14 bits,


• Une RAM donnée de 368 octets,
• Une mémoire EEPROM de 256 octets,
• Trois ports d'entrée sortie, A (6 bits), B (8 bits), C (8 bits),D (8bits), E (3bits)
• Convertisseur Analogiques numériques 10 bits à 5 canaux,
• USART, Port série universel, mode asynchrone (RS232) et mode synchrone,
• SSP, Port série synchrone supportant I2C,
• Trois TIMERS avec leurs Prescalers, TMR0, TMR1, TMR2,
• Deux modules de comparaison et Capture CCP1 et CCP2,
• Un chien de garde,
• 13 sources d'interruption,
• Générateur d'horloge, à quartz (jusqu’ à 20 MHz) ou à Oscillateur RC,
• Protection de code,
• Fonctionnement en mode sleep pour réduction de la consommation,
• Programmation par mode ICSP (In Circuit Serial Programming) 12V ou 5V,
• Possibilité aux applications utilisateur d’accéder à la mémoire programme,
• Tension de fonctionnement de 2 à 5V,
• Jeux de 35 instructions

Les éléments constitutifs du PIC16F877


SCIENCES DE L’INGENIEUR [26]
✓ Accès à la RAM

- Par adressage DIRECT : Si on utilise l'instruction MOVWF 50. Cette instruction sera codée sur 14 bits, la partie
adresse est codée sur 7 bits ce qui va poser quelques petits problèmes. En effet, 7 bits permettent d’adresser
seulement 128 positions. Pour pouvoir adresser les 512 positions accessibles, il faut 9 bits d’adresse. Pour avoir ces 9
bits, le PIC complète les 7 bits venant de l’instruction par deux bits situés dans le registre de configuration STATUS. Ces
bits sont appelés RP0 et RP1 et doivent être positionnés correctement avant toute instruction qui accède à la RAM par
l’adressage direct.

Les instructions bcf et bsf et qui permettent de positionner un bit à 0 ou à 1 :


BCF STATUS, RP0 ; place le bit RP0 à 0
BSF STATUS, RP1 ; place le bit RP1 à 1

Organisation de la RAM du 16F876/877

SCIENCES DE L’INGENIEUR [27]


Par l’adressage INDIRECT

Pour accéder à une position de la RAM en utilisant l’adressage indirect, on passe toujours par une
position fictive appelée INDF. Exemple : l’instruction CLRF INDF signifie : mettre à zéro la case
mémoire d’adresse INDF. Mais quelle est l’adresse de cette position appelée INDF ? INDF est la case
mémoire pointée par le registre (pointeur) FSR.
Cela signifie que si on place 74h dans le registre FSR et ensuite on exécute l’instruction CLRF
INDF, cela va remettre à zéro la case mémoire d’adresse 74h.
Comme tous les registres, le registre de pointage FSR est un registre 8 bits, il peut donc adresser
au maximum 256 positions mémoire (de 00h à FFh). Il nous manque un bit pour avoir les 9 bits
nécessaires. On utilise le bit IRP qui se trouve dans le registre STATUS.

✓ Registres de configuration

Les registres avec leurs adresses

SCIENCES DE L’INGENIEUR [28]


✓ Les registres de configuration avec leurs états après un RESET

✓ Les interruptions

SCIENCES DE L’INGENIEUR [29]


Sur le 16F876/877, les interruptions sont classées en deux catégories, les interruptions primaires et les interruptions
périphériques. Elles sont gérées par les registres :

• Toutes les interruptions peuvent être validées/interdites par le bit INTCON.GIE


• Toutes les interruptions périphériques peuvent être validées/interdites par le bit INTCON.PEIE
• Chaque interruption peut être validée/interdite par son bit de validation individuel

Les sources d'interruption

Lorsque l'événement déclencheur d'une interruption intervient, alors son drapeau est positionné à 1 (levé). Si
l'interruption a été validée (bits de validations = 1), elle est alors 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 en exécutant les étapes suivantes :
• l'adresse contenue dans le PC (Program Conter) 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 que le PIC ne soit pas dérangé pendant
l'exécution de la procédure d'interruption).
• A la fin de la procédure d'interruption (instruction RETFIE) :
• le bit GIE est remis à 1 (autorisant ainsi un autre événement)
• le contenu du PC est rechargé à partir de la pile ce qui permet au programme de reprendre là où il s'est
arrêté

✓ LES TIMERS

SCIENCES DE L’INGENIEUR [30]


• Le Timer TMR0

✓ Le Watchdog Timer WDT (Chien de garde)

• Le Timer TMR1

✓ Le Timer TMR1

TMR1 est un Timer/Compteur 16 bits accessible en lecture/écriture par l'intermédiaire des registres 8 bits TMR1H
(bank0) et TMR1L (bank0) qui constituent sa partie haute et sa partie basse.
On le configure à l'aide du registre T1CON (bank0)

TMR1 peut fonctionner dans 3 modes différents :

SCIENCES DE L’INGENIEUR [31]


- Timer Synchrone (horloge interne) :
Dans ce mode, TMR1 est incrémenté par l’horloge système Fosc/4 éventuellement prédivisée. Le bit de synchronisation
n'a pas d'effet car l'horloge Fosc/4 est toujours synchronisée sur l'horloge système.

- Compteur Synchrone (horloge externe)


Dans ce mode, TMR1 est incrémenté à chaque front montant de l'horloge externe T1CKI (RC0).
L'horloge externe (éventuellement prédivisée) n'incrémente pas directement le timer mais elle est synchronisée sur
l'horloge système ce qui peut entraîner un délai de l'ordre de 1 cycle machine.

- Compteur Asynchrone (horloge externe)


Dans ce mode, TMR1 est incrémenté à chaque front montant d’Horloge interne générée par l’oscillateur dédié T1OSC à
condition de positionner le bit T1OSCEN à 1 et de brancher un quartz entre les broches RC0 et RC1.
L'horloge externe (éventuellement prédivisée) incrémente le timer indépendamment de l'horloge système.

Le bit de contrôle TMR1CS détermine le fonctionnement en Timer ou en Compteur et le bit T1SYNC détermine le mode
de fonctionnement en synchrone ou en asynchrone

✓ TMR1 peut être arrêté/démarré à l'aide du bit TMR1ON


✓ TMR1 peut être RAZ à l'aide du module de capture/comparaison CCP
✓ TMR1 peut être précédé d'un prédiviseur (Prescaler) qui peut diviser la fréquence par 1, 2, 4 ou 8
selon la valeur des bits T1CKPS1 et T1CKPS0
✓ A son débordement (FFFFh à 0000h) le drapeau PIR1.TMR1IF (bank0) est positionné ce qui peut
déclencher l'interruption périphérique TMR1I si elle est validée par son bit de validation PIE1.TMR1IE
(bank1).

✓ Le registre de control de T1CON

SCIENCES DE L’INGENIEUR [32]


Le PIC 16F877 possède 8 entrées analogiques (RA0..RA5 et RE0..RE2 pour les PICs disposant du port
E) multiplexées vers un C.A.N. à approximation successive (SAR = Successive approximation register). Ce
dernier est précédé d’un échantillonneur / bloqueur permettant une stabilité de la tension d’entrée pendant
toute la durée de la conversion.

 La gestion de la conversion se fait grâce à 4 registres 8 bits :


 ADRESH et ADRESL (Analog to Digital result High and Low), contiennent le résultat de la
conversion sur 10 bits. Rem: un octet ne contiendra que 2 bits.
 ADCON0 et ADCON1 (Analog to Digital Control 0, 1), permettent de configurer la conversion.
 La tension de référence peut être interne (GND ou 5v), ou externe (RA2 et RA3) selon la configuration.
En aucun cas elle ne doit dépasser la tension d’alimentation.
 Le temps de conversion minimum est d’environ 20 µs. La durée du signal d’horloge TAD ne doit pas être
en dessous de 1,6 µs.

Le control du module se fait par les deux registres ADCON0 et ADCON1

ADCS1:ADCS0 : Choix de l'horloge de conversion donc du temps de conversion

Le temps de conversion d'un bit est TAD. Pour une conversion totale des 10 bits il faut : 12.5TAD.
TAD minimum est de 1,6μs. Avec l'oscillateur interne RC on a : TAD = 4 μs.
Si on utilise un Quartz de 4MHz et on a choisi ADCS1=0 et ADSC0=0 on a alors Fosc/2=4M/2=2MHz donc TAD=0,5 μs<1.6 μs :
ne convient pas. (Pour Fosc/8 TAD=2 μs c’est OK)

SCIENCES DE L’INGENIEUR [33]


CHS2:CHS0 : choix de l'entrée analogique

GO/DONE : Une conversion démarre quand on place ce bit à 1. A la fin de la conversion, il est remis automatiquement à zéro.
Ce bit peut aussi être positionné automatiquement par le module CCP2.
ADON : Ce bit permet de mettre le module AN en service

ADFM : justification à droite ou à gauche du résultat dans les registre ADRESH et ADRESL

PCFG3:PCFG0 : configuration des E/S et des tensions de références. Les 5 broches de PORTA et les 3 de PORTE peuvent
être configurés soit en E/S digitales, soit en entrées analogiques. RA2 et RA3 peuvent aussi être configurées en entrée de
référence.

INTERRUPTION
La fin de conversion A/N peut générer une routine d’interruption. Pour cela il faut positionner à “1” le
bit d’activation général des interruptions “GIE” (Bit 7 du registre INTCON), le bit d’activation des interruptions
périphériques “PEIE” (Bit 6 du registre INTCON), ainsi que le bit d’activation de l’interruption CAN “ADIE”
(Bit 6 du registre PIE1). Lorsqu’une requête d’interruption est lancée par le CAN (A la fin d’un cycle de
conversion), le drapeau (Flag) “ADIF” (Bit 6 du registre PIR1) passe à “1”. Ce bit doit être repositionné à “0”
avant toute nouvelle conversion et lors de l’initialisation.

SCIENCES DE L’INGENIEUR [34]


EXERCICES

Résumé des instructions (mnémonique)

SCIENCES DE L’INGENIEUR [35]


Exercice
Allumer une LED.

SCIENCES DE L’INGENIEUR [36]


list p=16f84A
#include <p16f84A.inc>
__CONFIG H'3FF9

ORG 0x000
GOTO START

;**********Initialisations******************
START ORG 0x005

……….. STATUS,RP0 ;passage en banque 1

MOVLW B'……………….' ;RA0 en sortie, les autres en entrée.

MOVWF ……………….. ;chargement du registre de direction "TRISA" du PORTA

BCF ……………….. ; retour en banque 0

;************PROGRAMME PRINCIPALE****************

BSF ……………. ;mettre le bit RA0 à "1", Allumer la LED

END

********Exercice**********
On connecte un interrupteur sur RA4 (entrée) et une LED sur RA0 (sortie).

Si on ouvre l’interrupteur (5v), la LED doit s'allumer, si on le ferme, elle doit s'éteindre.
SCIENCES DE L’INGENIEUR [37]
list p=16f84A

#include <p16f84A.inc>

__CONFIG _CP_OFF & _XT_OSC & _PWRTE_OFF & _WDT_OFF ;ou __CONFIG H'3FF9

ORG 0x000

GOTO START

;**********Initialisations******************

START ORG 0x005

……….. STATUS,RP0 ;passage en banque 1

MOVLW B'…………………….. ;RA0 en sortie, les autres en entrée.

MOVWF TRISA ; chargement du registre de direction "TRISA" du PORTA

BCF …………………. ; retour en banque 0

;************PROGRAMME PRINCIPALE****************

test BTFSC ………………. ;RA4=?(0 ou 1)

GOTO ON_LED ;Si RA4=1 aller à ON_LED

BCF ………….. ;Si RA4=0 alors mettre le bit RA0 à "0", éteindre la LED

……….. test ; Aller à test

ON_LED ……… …………… ;Allumer la LED

GOTO test ;revenir à test

END

***************Exercice : calcul d’une temporisation **************


Compléter le programme ci-dessous et calculer la fréquence F de clignotement de la LED D, si on utilise un
quartz de 20MHz.

SCIENCES DE L’INGENIEUR [38]


list p=16f84A
#include <p16f84A.inc>
__CONFIG H'3FF9
ORG 0x000
GOTO START
;**********DECLARATION DES VARIABLES
N1 EQU 20
N2 EQU 21
;**********INITIALISATIONS******************
START ORG H'005'
………. STATUS,RP0 ;passage en banque 1
MOVLW H'…….' ; RB0 en sortie, les autres en entrée.
MOVWF TRISB ; chargement du registre de direction "TRISB" du PORTB
BCF ………….. ; Retour en banque 0
;************PROGRAMME PRINCIPALE****************
prog
BCF ………….. ; Eteindre la LED
………. tempo ; Appeler sous-programme de temporisation "tempo"
……… PORTB,0 ;Allumer la LED
CALL ………….. ; Appeler sous-programme de temporisation "tempo"
………. prog ; Revenir à ‘prog’

;************SOUS-PROGRAMME DE TEMPORISATION "TEMPO"****************


Tempo

MOVLW D'255' ; on met ff dans le registre W


MOVWF N2 ; on met W dans le registre N2
attente MOVLW D'0'
MOVWF N1

DECFSZ N1,F ; on décrémente N1 et on saute la prochaine instruction si


GOTO attente ; le registre N1 = 0 sinon retour à ‘attente’.

DECFSZ N2,F ; on décrémente N2 et on saute la prochaine instruction si


GOTO attente ; le registre N2 = 0 sinon retour à ‘attente’
RETURN ; retour au programme principal après l’instruction CALL
END

------------ Exemple d'application avec un PIC : Un chennillard -----


----------
Le quartz est de 4 Mhz , on effectue une tempo environ égale à 0.2 seconde

SCIENCES DE L’INGENIEUR [39]


Un bouton marche sur le PORT A permet de lancer l’application
;------------ Directive d' assemblage pour MPLAB ---------------
list p=16f84A
#include <p16f84A.inc>
__config H'3FF9'

;------------ Définition des constantes ---------------


#define inter0 0 ; bouton marche

;------------ Définition des registres ---------------


retard1 EQU H’0C ‘
retard2 EQU H’0F’
memo EQU H’10’

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

ORG 0
BSF ………………….. ; 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 …………… ; on met 00 dans TRISB, le port B il est programmé en sortie
………………………… ; on met 1F dans le registre W
MOVWF TRISA ; on met 1F dans TRISA. Le PORTA est programmé en entrée
………….STATUS,RP0 ; on remet à 0 le 5eme bit du registre STATUS pour accéder
; à la 1ère page mémoire

;------------ Init des leds et registres ---------------


CLRF PORTB ; on met 0 sur le port B (LEDs éteintes ).
MOVLW 01 ; on met 01 dans le registre W.
MOVWF memo ; on met W dans le registre ‘memo’.

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


debut
BTFSS PORTA,inter0 ; interrupteur 0 ( marche ) appuyé ? si oui on continu sinon
GOTO debut ;va à debut
MOVF ………………… ; on met memo dans W
MOVWF PORTB ; on met W sur le port B ( leds )
………… tempo ; on appel la temporisation
……….. memo, F ; rotation à gauche du registre memo
GOTO debut ; retour au début du programme

;------------ Programme de temporisation longue ---------------


tempo
MOVLW H’FF’ ; on met ff dans le registre W
MOVWF …………… ; on met W dans le registre retard2
attente
…………… retard1,F ; on décrémente retard1 et on saute la prochaine instruction si
GOTO ……………… ; le registre retard1 = 0 sinon retour à attente
DECFSZ ……………… ; on décrémente retard2 et on saute la prochaine instruction si
GOTO attente ; le registre retard2 = 0 sinon retour à attente
…………… ; retour au programme principal après l’instruction CALL
END

Temporisation avec 3 boucles imbriquées N1 (256), N2 (256), N3 (à préciser)

SCIENCES DE L’INGENIEUR [40]


Clignotement d'une LED reliée à n'importe quelle sortie du port B.

;*****************************************************************************************************************************
list p=16f84,
#include "p16f84A.inc"
__config _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_OFF

N1 EQU 0x0D ; N1,N2,N3 = compteurs temporisateur


N2 EQU 0x0E
N3 EQU 0x0F
;=================================Programme principal
ORG 0x000
GOTO Début
Début ORG 0x005
BSF STATUS,RP0 ; sélection banque1.
…….. TRISB ; programmation des bits du port B en sortie.
BCF STATUS,RP0 ; sélection banque 0
Loop ……… PORTB,f ; complémente PORTB
MOVLW 3 ;
CALL tempo
GOTO loop ; recommence la loupe indéfinitivement

;=================================Procédure de temporisation
Tempo MOVWF N3 ; copier W dans N3
tmp DECFSZ N1,f ; boucle intérieure
GOTO tmp
DECFSZ N2,f ; boucle médiane
GOTO tmp
DECFSZ N3,f ; boucle extérieure
GOTO tmp
RETURN
END
………Calcul du temps de temporisation T (Q=4MHz):..…………………………………………………………………

……………………………………………………………………………………………………………………………………

……………………………………………………………………………………………………………………………………

……………………………………………………………………………………………………………………………………

……………………………………………………………………………………………………………………………………

……………………………………………………………………………………………………………………………………

…………………………………………………………………………………………………………………………………..
Temporisation avec TIMER0
Faire clignoter une LED connectée sur une sortie du port B. la temporisation est réalisé avec le timer0.

SCIENCES DE L’INGENIEUR [41]


;*****************************Directive d’assemblage pour MPLAB***********************
LIST p=16f84A,
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_OFF & _WDT_OFF
#INCLUDE "p16f84A.inc"

;******************************Variables****************************************
CTR EQU 0x0C

;*****************************Vecteur de reset***********************************
ORG 0x000
GOTO START
;******************************Initialisation**********************************
START ORG H'005'
BSF STATUS,RP0 ; banque 1 (pour TRISB et OPTION_REG)
CLRF …………. ; PORTB en sortie
MOVLW B'……………………..' ; PSA=0, pré diviseur affecté à TMR0,
MOVWF OPTION_REG PS1 PS2 PS3 = 111, div = 256
; T0CS=0, horloge TMR0 = fosc/4/div

BCF STATUS,RP0 ; retour à banque 0


;*******************************Programme principale**************************
encore COMF PORTB,f ; complémenter PORTB
CALL delay ; attendre un peu
GOTO encore ; recommencer
;*****************************Temporisation par TMR0************************
delay MOVLW H’5’ ; pour attendre que TMR0 déborde 5 fois
MOVWF CTR ; ce qui donne ………………………………………
test BTFSS INTCON,…………. ; attendre que TMR0 déborde
GOTO test
………. INTCON,T0IF ; baisser le drapeau
DECFSZ CTR,f ; pour recommencer CTR fois
GOTO test
RETURN
END
;******************************************************************************
Temporisation T=…………………………………………………………………………………………………………………………

……………………………………………………………………………………………………………………………………………………

Temporisation à l'aide du chien de garde (watchdog timer)


SCIENCES DE L’INGENIEUR [42]
Clignotement d'une LED reliée à la sortie 0 du port B, on utilisant le chien de garde (WDT).

;*********************************************************************************
; Clignotement d'une LED reliée à la sortie 0 du port B. Les autres bits du port B ne sont pas affectés
; La temporisation est réalisée à l'aide du Watch dog timer
;********************************************************************************
LIST p=16f84
__CONFIG _PWRTE_OFF & _CP_OFF & _WDT_ON & _HS_OSC
#include "p16f84A.inc"

BSF STATUS, RP0 ; select bank1

…………………………….. ; RB0 en sortie

MOVLW B'……………………' ; prescaler affecté au WDT, prescaler = 101 = 32

MOVWF OPTION_REG ; débordement du WDT tous les …………………………….

BCF STATUS, RP0 ; select bank0

MOVLW 1 ; bit 0 de W à 1, le autres à 0,

Loop …………………………………. ; passe en mode sleep, réveil dans ……………..

XORWF PORTB,f ; complémente le bit 0 de PORTB

GOTO Loop ; recommence la loupe indéfinitivement

END

+5vc
Rp
***Utilisation d’une routine d’interruption*** +5vc RA2

SCIENCES DE L’INGENIEUR [43] LED


PIC16F84
15pF
On désire construire un programme qui inverse l’allumage de la
LED à chaque pression sur le bouton poussoir BP (front descendant ↓ sur
RB0/INT).
Configuration des registres OPTION et INTCON

✓ Registre OPTION

b7 b6 b5 b4 b3 b2 b1 b0
RBPU(…) INTEDG(…) TOCS(…) TOSE(…) PSA(…) PS2(…) PS1(….) PS0(….)

- b7 = …, car on a besoin de la résistance de rappel au


+5v pour le bouton poussoir.
- B6=…, interruption active sur front descendant.
- b5à b0=…., aucune importance.
Il faut donc charger le registre OPTION par 0x….
-
✓ Registre INTCON
Il faut :
- valider les interruptions ; Pas d’IT EEPROM ; Pas d’IT TMR0 ;Valider IT RB0/INT ; Pas d’INT RB4/RB7 ; Effacer les
flags.

b7 b6 b5 b4 b3 b2 b1 b0
GIE(….) EEIE(….) TOIE(…) INTE(…) RBIE(…) TOIF(….) INTF(…) RBIF(…)

Charger donc l’octet 0x…. dans INTCON.

*** ******DECLARATIONS DE VARIABLES ************ ***********INITIALISATIONS****************


CBLOCK 0x020 ; début de la zone variables init
w_temp :1 ; Sauvegarde de W dans interruption bsf ………………; passer en banque 1
status_temp : 1 ; Sauvegarde de STATUS dans interrupt movlw 0x……. ; charger masque
movwf OPTION ; initialiser registre option
***********DEMARRAGE SUR RESET*****************
org 0x000 ; Adresse de départ après reset *********configuer PORTS*************
goto …….. ; Adresse 0: initialiser bcf …………. ; RA2 en sortie (TRISA)
………………………; passer banque0
******ROUTINE INTERRUPTION****************** Movlw ………. ; masque interruption
*****sauvegarder registres **** ………. INTCON ; charger interrupt control
org ………… ; adresse d'interruption
movwf w_temp ; sauver registre W ********** PROGRAMME PRINCIPAL**********
swapf STATUS,w ; swap status avec résultat dans w debut
movwf status_temp ; sauver status swappé goto debut ; boucler
***** interruption RBO/INT********** END
movlw B'00000100' ; bit positionné = bit inversé
xorwf PORTA , f ; inverser RA2
………. INTCON , INTF ; effacer flag INT/RB0

*****restaurer registres********
swapf status_temp,w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; ;Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W
; W restauré sans modifier status
retfie ; retour de l’interruption

Temporisation avec l’interruption T0I du TMR0


SCIENCES DE L’INGENIEUR [44]
Faire clignoter une LED connectée sur une sortie du port B.

;******************************************************************************
; programme led-tmr0-2.asm
; faire clignoter une LED connectée sur une sortie du port B. La temporisation permettant d'ajuster la ;
fréquence est obtenue en comptant les débordements du timer TMR0 à l'interieur de l'interruption T0I
; TMR0 est utilisé en timer avec un pré diviseur de 256. En comptant 5 débordements on obtient une
; Temporisation de 5x256 x 256 x0,4 x μs
;********************************************************************************
;*****************************Directive d’assemblage pour MPLAB***********************
LIST p=16f84A
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_OFF & _WDT_OFF
INCLUDE "p16f84A.inc"

;******************************Variables****************************************
CTR EQU 0x0C

;*****************************Vecteur de reset***********************************
ORG 0x000
GOTO START
;================= procédure d'interruption=======================================
ORG 4
BCF INTCON,T0IF ; baisser le drapeau levé par l'interruption
DECFSZ CTR,f
RETFIE
…………. PORTB,f ; changer l'état de la LED
MOVLW …………….. ; initialiser compteur à la valeur 5
MOVWF CTR
………………….. ; Retour d’interruption
;================= Programme principal==========================================
START …….. STATUS,RP0 ; select bank1
CLRF …………….. ; programme tous les bits du bort B en sortie
MOVLW B'…………………..’ ; mode timer, prédiviseur pour TMR0, div=256
MOVWF OPTION_REG
BCF STATUS,RP0 ; select bank0
MOVLW B'………………….' ; autorisation Interruption T0I
MOVWF INTCON
MOVLW 5 ; initialise CTR pour le premier passage
MOVWF CTR
Loop GOTO Loop ; le PIC reste planté ici et n'en sort que pour aller
; exécuter une interruption due au débordement de TMR0
END

************CONVERSION ANALOGIQUE/NUMERIQUE AVEC LE PIC 16F877A***************

Soit à convertir une tension analogique (0<Vin<5v) en une tension numérique affichée en hexadécimale.
SCIENCES DE L’INGENIEUR [45]
Compléter le programme mnémonique qui permet de réaliser la conversion analogique numérique.

1. LIST p=16F877
#include "P16F877.INC"
org 0
goto start

; *******programme principal*******
start
bsf STATUS,RP0 ; Select Bank 1

movlw H'………' ;

movwf ……………… ; PORTA en entrée

movlw H'07'

movwf TRISE ; PORTE en entrée

clrf ………………… ; PORTC en sortie

……………………………………………… ; PORTD en sortie.

; ----------------Configuration du CAN--------------------
; Configuration du registre ADCON1
; ADFM = 1 justification à droite du résultat
; RA3=Vref+, RA2=Vref-=Vss , RA0 entrée analogique, les autres entrées logiques

…………………………………………
movwf ADCON1
…………. STATUS,RP0 ; Bank 0.
; Configuration du registre ADCON0
; ADCS1 et ADSC0 = 1 1 ; Oscillateur RC interne; T AD=4µs>1.6µs
; ADON = 1 Mise en service du CAN
; GO_DONE = 0 Conversion n’est pas encore lancée

………………………………………………

SCIENCES DE L’INGENIEUR [46]


movwf …………………………… ; Sauvegarder

; ------------------------Conversion----------------------------
do_conv ………………………………………………………………..; GO_DONE = 1 Lancement d’une conversion

wait_eoc btfsc …………………,………… ; tester GO/DONE

goto wait_eoc ; si encore GO/DONE=1 retester

bsf STATUS,RP0 ; Bank 1

movf ……………………………… ; charger 8bits (poids faible) du


; resultat de conversion ADRESL dans W.
bcf STATUS,RP0 ; bank 0

movwf PORTC ; afficher poids faible (8bit); 2 Digits à droite

………………………………………… ; charger 2bits (poids fort) du


; résultat de conversion ADRESH dans W.
movwf PORTD ; afficher poids fort

goto …………………… ; aller faire une autre conversion.

END

SCIENCES DE L’INGENIEUR [47]


SCIENCES DE L’INGENIEUR [48]
SCIENCES DE L’INGENIEUR [49]
SCIENCES DE L’INGENIEUR [50]

Vous aimerez peut-être aussi