Académique Documents
Professionnel Documents
Culture Documents
SCIENCE DE L’INGENIEUR
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 :
Environnement minimal
Système à microprocesseur
Exemple : Microprocesseur 6809
SCIENCES DE L’INGENIEUR [- 3 -]
Pour l’environnement du 6809 :
Mémoires :
- RAM (Random Acces Memory : mémoire à accès aléatoire (lecture et écriture)) :
SCIENCES DE L’INGENIEUR [- 4 -]
Répondre :
Calculer sa capacité en nombre de kilo-octets (sachant qu’un kilo vaut 210 soit 1024) :
…………………………………………………………………………………………
………………………………………………………………………………………..
- 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.
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.
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.
➢ 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é.
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.
II-2 HORLOGE
3Fh/63d 8bits
Mémoire
données
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.
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.
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.
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 :
MOVF permet de copier le contenu d’un registre (SFR ou GPR) dans l’accumulateur W, le paramètre d doit être = 0
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
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
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:
adresse donnée
0C
0D FF
MOVF INDF,w
FSR 0E 0E 50 …. W
0F FF
10 …
11
12
13
C’est un compteur 8 bits (contrôlé par le registre OPTION_REG) ayant les caractéristiques suivantes :
OPTION_REG
✓ 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
✓ 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.
• 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
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.
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.
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.
; sauvegarder registres
- 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.
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 interruptions
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
• 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)
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
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)
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.
ORG 0x000
GOTO START
;**********Initialisations******************
START ORG 0x005
;************PROGRAMME PRINCIPALE****************
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******************
;************PROGRAMME PRINCIPALE****************
BCF ………….. ;Si RA4=0 alors mettre le bit RA0 à "0", éteindre la LED
END
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
;*****************************************************************************************************************************
list p=16f84,
#include "p16f84A.inc"
__config _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_OFF
;=================================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.
;******************************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
……………………………………………………………………………………………………………………………………………………
;*********************************************************************************
; 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"
END
+5vc
Rp
***Utilisation d’une routine d’interruption*** +5vc RA2
✓ Registre OPTION
b7 b6 b5 b4 b3 b2 b1 b0
RBPU(…) INTEDG(…) TOCS(…) TOSE(…) PSA(…) PS2(…) PS1(….) PS0(….)
b7 b6 b5 b4 b3 b2 b1 b0
GIE(….) EEIE(….) TOIE(…) INTE(…) RBIE(…) TOIF(….) INTF(…) RBIF(…)
*****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
;******************************************************************************
; 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
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'………' ;
movlw H'07'
; ----------------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
………………………………………………
; ------------------------Conversion----------------------------
do_conv ………………………………………………………………..; GO_DONE = 1 Lancement d’une conversion
END