Les Microcontroleurs
اسم المؤلف
وسام الزعفراني - Wissem Zaafrani
التاريخ
المشاهدات
944
التقييم
(لا توجد تقييمات)
Loading...
التحميل

Les Microcontroleurs
وسام الزعفراني
Wissem Zaafrani
1) Qu’est ce qu’un microcontrôleur :
C’est un ordinateur monté dans un circuit intégré. Les avancées technologiques en
matière d’intégration, ont permis d’implanter sur une puce de silicium de quelques
millimètres carrés la totalité des composants qui forment la structure de base d’un
ordinateur. Leur prix varie de quelques Euros à une dizaine d’Euros pour les plus
complexes. Comme tout ordinateur, on peut décomposer la structure interne d’un
microprocesseur en trois parties :
-Les mémoires
-Le processeur
-Les périphériques
C’est ce qu’on peut voir sur la figure 1 :
figure 1
les mémoires sont chargées de stocker le programme qui sera exécuté ainsi que les
données nécessaires et les résultats obtenus
le processeur est le cœur du système puisqu’il est chargé d’interpréter les instructions
du programme en cours d’exécution et de réaliser les opérations qu’elles
contiennent .Au sein du processeur, l’unité arithmétique et logique interprète,
traduit et exécute les instructions de calcul.
les périphériques ont pour tâche de connecter le processeur avec le monde extérieur
dans les deux sens . Soit le processeur fournit des informations vers l’extérieur
(périphérique de sortie ), soit il en reçoit (périphérique d’entrée ).2) Intérêt des microcontrôleurs :
Les microcontrôleurs sont de taille tellement réduite qu’ils peuvent être sans difficulté
implantés sur l’application même qu’ils sont censés piloter. Leur prix et leurs
performances simplifient énormément la conception de système électronique et
informatique. L’utilisation des microcontrôleurs ne connaît de limite que l’ingéniosité
des concepteurs, on les trouve dans nos cafetières, les magnétoscopes, les radios …..Une
étude menée en l’an 2004 montre qu’en moyenne, un foyer américain héberge environ
240 microcontrôleurs.II PRESENTATION GENERALE DU PIC 16F84
1) Classification du PIC 16F84
Le PIC 16F84 est un microcontrôleur 8 bits. Il dispose donc d’un bus de données de
huit bits. Puisqu’il traite des données de huit bits, il dispose d’une mémoire de donnée
dans laquelle chaque emplacement (défini par une adresse) possède huit cases pouvant
contenir chacune un bit.
2) Architecture interne
La structure générale du PIC 16F84 comporte 4 blocs comme le montre la figure 2 :
-Mémoire de programme
-Mémoire de données
-Processeur
-Ressources auxiliaires ( périphériques )
figure 2
La mémoire de programme contient les instructions pilotant l’application à
laquelle le microcontrôleur est dédié. Il s’agit d’une mémoire non volatile ( elle
garde son contenu, même en l’absence de tension ), elle est de type FLASH
c’est à dire qu’elle peut être programmée et effacée par l’utilisateur via un
programmateur et un PC. La technologie utilisée permet plus de 1000 cycles
d’effacement et de programmation. Pour le PIC 16F84 cette mémoire est d’une
taille de 1024*14 bits, c’est à dire qu’elle dispose de 1024 emplacements ( de000h à 3FFh ) contenant chacun 14 cases car dans le cas du PIC, les instructions
sont codées sur 14 bits. On peut donc stocker 1024 instructions.
La mémoire de donnée est séparée en deux parties :
-une mémoire RAM de 68 octets puisque le bus de donnée est de huit bits.
Cette RAM est volatile (les données sont perdues à chaque coupure de
courant). On peut y lire et écrire des données.
-une mémoire EEPROM de 64 octets dans laquelle on peut lire et écrire des
données ( de huit bits soit un octet ) et qui possède l’avantage d’être non
volatile ( les données sont conservées même en l’absence de tension ). La
lecture et l’écriture dans cette mémoire de données sont beaucoup plus
lentes que dans la mémoire de données RAM.Le processeur est formé de deux parties :
-une unité arithmétique et logique ( UAL ) chargée de faire des calculs.
-un registre de travail noté W sur lequel travail l’UAL.
les ressources auxiliaires qui sont dans le cas du PIC16F84
-ports d’entrées et de sorties.
-temporisateur.
-interruptions
-chien de garde
-mode sommeil
Ces ressources seront analysées dans la suite du cours.
III STRUCTURE INTERNE DU PIC 16F84
1) Brochage et caractéristiques principales
Le PIC16F84 est un circuit intégré de 18 broches ( figure 3) :
figure 3
L’alimentation du circuit est assurée par les pattes VDD et VSS. Elles
permettent à l’ensemble des composants électroniques du PIC de fonctionner.
Pour cela on relie VSS (patte 5) à la masse ( 0 Volt ) et VDD (patte 14 ) à laborne positive de l’alimentation qui doit délivrer une tension continue comprise
entre 3 et 6 Volts.
Le microcontrôleur est un système qui exécute des instructions les unes après
les autres à une vitesse ( fréquence ) qui est fixée par une horloge interne au
circuit. Cette horloge doit être stabilisée de manière externe au moyen d’un cristal
de quartz connecté aux pattes OSC1/CLKIN (patte 16) et OSC2/CLKOUT (
patte 15 ) . Nous reviendrons en détail sur l’horloge au paragraphe 3.
La patte 4 est appelée MCLR. Elle permet lorsque la tension appliquée est égale
à 0V de réinitialiser le microcontrôleur. C’est à dire que si un niveau bas ( 0 Volt )
est appliqué sur MCLR le microcontrôleur s’arrête, place tout ses registres dans
un état connu et se redirige vers le début de la mémoire de programme pour
recommencer le programme au début ( adresse dans la mémoire de
programme :0000 ).A la mise sous tension, la patte MCLR étant à zéro, le programme démarre donc à
l’adresse 0000,( MCLR=Master Clear Reset ).
Les broches RB0 à RB7 et RA0 à RA4 sont les lignes d’entrées/sorties
numériques. Elles sont au nombre de 13 et peuvent être configurées en entrée ou
en sortie. Ce sont elles qui permettent au microcontrôleur de dialoguer avec le
monde extérieur (périphériques). L’ensemble des lignes RB0 à RB7 forme le port
B et les lignes RA0 à RA4 forment le port A. Certaines de ces broches ont aussi
d’autres fonctions (interruption, timer ).
2) Structure interne
La structure interne du PIC16F84 est donnée figure 4 : ( structure HARVARD : la
mémoire de programme et la mémoire de données sont séparées contrairement à
l’architecture Von Neuman qui caractérise d’autres fabricants de microcontrôleurs )figure 4
On retrouve sur ce schéma la mémoire de programme, la mémoire RAM de données, la
mémoire EEPROM, les ports A et B, ainsi que la partie processeur avec l’UAL et le
registre de travail W ( work ). Nous allons étudier à présent plus en détail le
fonctionnement du PIC.3) Principe de fonctionnement du PIC
Un microcontrôleur exécute des instructions. On définit « le cycle instruction » comme
le temps nécessaire à l’exécution d’une instruction. Attention de ne pas confondre cette
notion avec le cycle d’horloge qui correspond au temps nécessaire à l’exécution d’une
opération élémentaire ( soit un coup d’horloge ).
Une instruction est exécutée en deux phases :
la phase de recherche du code binaire de l’instruction stocké dans la mémoire
de programme
la phase d’exécution ou le code de l’instruction est interprété par le processeur
et exécuté.
Chaque phase dure 4 cycles d’horloge comme le montre la figure 5 :
figure 5
On pourrait donc croire qu’un cycle instruction dure 8 cycles d’horloge mais
l’architecture particulière du PIC lui permet de réduire ce temps par deux. En effet,
comme les instructions issues de la mémoire de programme circulent sur un bus
différent de celui sur lequel circulent les données, ainsi le processeur peut effectuer l a
phase de recherche d’une instruction pendant qu’il exécute l’instruction précédente (
Voir figure 6 et 7 ).figure 6figure 7
4) Déroulement d’un programme
Le déroulement d’un programme s’effectue de façon très simple. A la mise sous tension,
le processeur va chercher la première instruction qui se trouve à l’adresse 0000 de la
mémoire de programme, l’exécute puis va chercher la deuxième instruction à l’adresse
0001 et ainsi de suite ( sauf cas de saut ou d’appel de sous programme que nous allons
voir plus loin ). On parle de fonctionnement séquentiel. La figure 8 va nous permettre
de mieux comprendre le fonctionnement :figure 8On constate sur cette figure que la mémoire de programme contient 1024
emplacements ( 3FF en hexadécimale ) contenant 14 bits ( de 0 à 13 ). Une
instruction occupe un emplacement qui est défini par une adresse. Le processeur
peut alors sélectionner l’emplacement souhaité grâce au bus d’adresse et il peut
lire son contenu ( ici l’instruction ) grâce à son bus d’instruction ( voir figure 7 ).
Cet adressage s’effectue à l’aide d’un compteur ordinal appelé PC qui lors de la
mise sous tension démarre à zéro puis s’incrémente de 1 tous les quatre coups
d’horloge, on exécute bien ainsi les instructions les unes à la suite des autres.
Mais il arrive que dans un programme on fasse appel à un sous programme
dont l’adresse de l’instruction ne se trouve pas juste après celle qui est en train
d’être exécutée. C’est le rôle de la pile qui sert à emmagasiner de manière
temporaire l’adresse d’une instruction. Elle est automatiquement utilisée chaque
fois que l’on appelle un sous programme et elle permet une fois que l’exécution
du sous programme est terminée de retourner dans le programme principal juste
après l’endroit où l’on a appelé le sous programme. On constate que cette pile
possède huit niveaux, cela signifie qu’il n’est pas possible d’imbriquer plus de huit
sous programmes, car au-delà de huit, le processeur ne sera plus capable de
retourner à l’adresse de base du programme principal.
L’adresse 0000 est réservée au vecteur RESET, cela signifie que c’est à cette
position que l’on accède chaque fois qu’il se produit une réinitialisation ( 0 volts
sur la patte MCLR ). C’est pour cette raison que le programme de fonctionnement
du microcontrôleur doit toujours démarrer à cette adresse.
L’adresse 0004 est assignée au vecteur d’interruption et fonctionne de manière
similaire à celle du vecteur de Reset. Quand une interruption est produite et
validée, le compteur ordinal PC se charge avec 0004 et l’instruction stockée à cet
emplacement est exécutée.
5) La mémoire de données RAM
Si l’on regarde la mémoire de donnée RAM, on s’aperçoit que celle-ci est un peu
particulière comme le montre la figure 9 :
On constate en effet que cette mémoire est séparée en deux pages ( page 0 et page 1 ).
De plus, on remarque que tant pour la page 0 que pour la page 1, les premiers octetssont réservés ( SFR pour Special File Register ). Ces emplacements sont en effet utilisés
par le microcontrôleur pour configurer l’ensemble de son fonctionnement. On les
appelle registres spécifiques et nous verrons au chapitre suivant leurs rôles.
Le bus d’adresse qui permet d’adresser la RAM est composé de 7 fils ce qui veut dire
qu’il est capable d’adresser 128 emplacements différents. Or, chaque page de la RAM est
composée de 128 octets, le bus d’adresse ne peut donc pas accéder aux deux pages, c’est
pourquoi on utilise une astuce de programmation qui permet de diriger le bus d’adresse
soit sur la page 0, soit sur la page 1. Cela est réalisé grâce à un bit d’un registre
spécifique ( le bit RP0 du registre STATUS ) dont nous verrons le fonctionnement plus
loin.
La RAM de données proprement dite se réduit donc à la zone notée GPR (Registre à
usage générale ) qui s’étend de l’adresse 0Ch ( 12 en décimale ) jusqu’à 4Fh ( 79 en
décimale ) soit au total 68 registres en page 0 et autant en page 1, mais on constate que
les données écrites en page 1 sont redirigées en page 0 cela signifie qu’au final
l’utilisateur dispose uniquement de 68 registres ( donc 68 octets de mémoire vive) dans
lesquels il peut écrire et lire à volonté en sachant qu’à la mise hors tension, ces données
seront perdues.figure 9
STAT
US
STAT
US6) Les registres
Nous avons vu au chapitre précédent que la mémoire de données RAM contenait des
registres spécifiques qui permettent de configurer le PIC, nous allons les détailler un à
un et voir comment on peut accéder à la page 0 ou la page 1. Afin de faciliter la
compréhension, les registres les plus utilisés sont encadrés.
adresse 00 et 80 ,INDF . Cette adresse ne contient pas de registre physique, elle
sert pour l’adressage indirect. (non utilisée dans le projet de cette année )
adresse 01 , TMR0 . Contenu du Timer (8 bits). Il peut être incrémenté par
l’horloge (fosc/4) c’est à dire tous les 4 coups d’horloge ou par la broche RA4.
adresse 02 et 82 , PCL .8 bits de poids faibles du compteur ordinal PC. Les 5
(13-8) bits de poids forts sont dans PCLATH.
adresse 03 et 83 , STATUS Registre d’état .
les cinq bits de poids faible de ce registre sont en lecture seule , ce sont des
témoins (drapeaux ou flag en anglais) caractérisant le résultat de l’opération
réalisée par l’UAL. Le bit RP0 est lui en lecture /écriture et c’est lui qui permet
de sélectionner la page dans la mémoire RAM .
Si RP0=0 on accède à la page 0 et si RP0=1 on accède à la page 1 .
Au reset, seul le bit RP0 de sélection de page est fixé ( RP0=0 : page 0 )
TO/ (Time Out) : débordement du timer WDT
PD/ : (Power Down) caractérise l’activité du chien de garde WDT
Z (zéro) résultat nul pour une opération arithmétique et logique.
DC (digit carry) retenue sur un quartet ( 4 bits )
C (carry) retenue sur un octet ( 8 bits ).
RP0 TO/ PD/ Z DC Cadresse 04 et 84 , FSR . Registre de sélection de registre : contient l’adresse
d’un autre registre (adressage indirect, non utilisé dans le projet )
adresse 05 , PORTA . Ce registre contient l’état des lignes du port A ( voir
chapitre sur les ports ).
adresse 06 , PORTB . Ce registre contient l’état des lignes du port B ( voir
chapitre sur les ports ).
adresse 08 , EEDATA .Contient un octet lu ou à écrire dans l’EEPROM de
données.
adresse 09 , EEADR . Contient l’adresse de la donnée lue ou écrite dans
l’EEPROM de données.
adresse 0A et 8A, PCLATH . Voir l’adresse 02 PCL.adresse 0B et 8B , INTCON .
Contrôle des 4 interruptions
Masques :
GIE : (Global Interrupt Enable) : masque global d’inter.
EEIE : (EEProm Interrupt Enable) autorise l’interruption venant de l’EEPROM.
T0IE : (Timer 0 Interrupt Enable) autorise l’interruption provoquée par le
débordement du TIMER0
INTE: ( Interrupt Enable) autorise l’interruption provoquée par un changement
d’état sur broche RB0/INT
RBIE: (RB Interrupt Enable) autorise les interruptions provoquées par un
changement d’états sur l’une des broches RB4 à RB7.
Si ces bits sont mis à 1 , ils autorisent les interruptions pour lesquels ils sont
dédiés .
Drapeaux :
T0IF : (Timer 0 Interrupt Flag) débordement du timer
INTF ( Interrupt Flag) interruption provoquée par la broche RB0/INT
RBIF ( RB Interrupt Flag) interruption provoquée par les broches RB4-RB7.
adresse 81 , OPTION
8 bits (tous à 1 au RESET) affectant le comportement des E/S et des timers.
RBPU/ (RB Pull Up) Résistances de tirage à Vdd des entrées du port B ( voir le
détail du fonctionnement au chapitre port ).Si RBPU/=0 les résistances de pull-up
sont connectées en interne sur l’ensemble du port B.
GIE EEI
E
T0I
E
INT
E
RBIE T0I
F
INTF RBI
F
RBPU/ INTEDG RTS RTE PSA PS2 PS1 PS0INTEDG (Interrupt Edge) sélection du front actif de l’interruption sur RB0/INT
( 1 pour front montant et 0 pour front descendant ).
RTS (Real Timer Source) sélection du signal alimentant le timer 0 : 0 pour
horloge interne, 1 pour RA4/T0CLK
RTE (Real Timer Edge) sélection du front actif du signal timer ( 0 pour front
montant).
PSA (Prescaler assignment) 0 pour Timer 0 et 1 pour chien de garde WDT.
PS2..0 (Prescaler 210 ) sélection de la valeur du diviseur de fréquence pour les
timers.
adresse 85 , TRISA . Direction des données pour le port A : 0 pour sortir et 1
pour entrer ( voir chapitre sur les ports ).
adresse 86 , TRISB . Direction des données pour le port B : 0 pour sortir et 1
pour entrer ( voir chapitre sur les ports ).adresse 88 , EECON1 Contrôle le comportement de l’EEPROM de données.
EEIF (EEProm Interrupt Flag) passe à 1 quand l’écriture est terminée.
WRERR (Write Error) 1 si erreur d’écriture.
WREN (Write Enable) : 0 pour interdire l’écriture en EEPROM de données.
WR (Write) 1 pour écrire une donnée. Bit remis automatiquement à 0
RD (Read) : 1 pour lire une donnée. Bit remis automatiquement à 0
adresse 89 , EECON2 . 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.
7) Les ports d’entrées/sorties
Le PIC16F84 est équipé de 13 lignes d’entrées/sorties réparties en deux ports :
-le port A : RA0 à RA4
-le port B : RB0 à RB7
Chaque ligne peut être configurée soit en entrée, soit en sortie, et ceci indépendamment
l’une de l’autre. Pour cela on utilise les registres TRISA et TRISB . Le bit de poids
faible ( b0 ) du registre TRISA correspond à la ligne RA0, le bit b1 de TRISA
correspond à RA1 et ainsi de suite. Il en est de même pour le port B et le registre
TRISB ( b0 de TRISB correspond à RB0  b7 correspond à RB7 ). Si l’on veut placer
une ligne en sortie il suffit de mettre le bit correspond dans TRISA ou TRISB à 0
(retenez 0 comme Output=sortie ) . Si l’on veut placer une ligne en entrée, il suffit de
placer le bit correspondant dans TRISA ou TRISB à 1 (retenez 1 comme Input=entrée )
.
EEIF WRERR WRE
N
WR R
DLes bits des deux registres PORTA et PORTB permettent soit de lire l’état d’une ligne
si celle-ci est en entrée, soit de définir le niveau logique d’une ligne si celle-ci est en
sortie.
Lors d’un RESET, toutes les lignes sont configurées en entrées.
particularité du portA : les bits b7 à b5 des registres TRISA et PORTA ne
correspondent à rien car il n’y a que 5 lignes ( b0 à b4 ) . RA4 est une ligne à
collecteur ouvert, cela veut dire que configurée en sortie cette broche assure 0Volt
à l’état bas, mais qu’à l’état haut, il est nécessaire de fixer la valeur de la tension
grâce à une résistance de tirage (pull up en anglais)
particularité du portB :il est possible de connecter de façon interne sur chaque
ligne une résistance de tirage ( pull up ) dont le rôle consiste à fixer la tension de
la patte (configuré en entrée ) à un niveau haut lorsque qu’aucun signal n’est
appliqué sur la patte en question. Pour connecter ces résistances, il suffit de
placer le bit RBPU/ du registre OPTION à 0 .8) Le Timer
Dans la majeure partie des applications, il est nécessaire de contrôler le temps; afin de
ne pas occuper le microcontrôleur qu’à cette tâche ( boucle de comptage qui monopolise
le micro ), on le décharge en utilisant un timer. Le pic 16F84 dispose de deux timers, un
à usage général ( le TMR0 ) et un autre utilisé pour le chien de garde ( watch dog
WDG ).
Le TMR0 est un compteur ascendant (qui compte) de 8 bits qui peur être chargé avec
une valeur initiale quelconque. Il est ensuite incrémenté à chaque coup d’horloge jusqu’à
ce que le débordement ait lieu ( passage de FF à 00 ); Le principe est représenté figure
10 :
figure 10
Le TMR0 peut remplir deux fonctions:
-Temporisateur ou contrôle du temps. Son entrée d’incrémentation est alors
l’horloge qui correspond au cycle instruction ( Fosc/4). Il est possible
d’utiliser un pré-diviseur de fréquence que nous verrons plus loin.
-Compteur d’événements. Dans ce cas les d’impulsions d’entrées du timer
sont fournies par la patte RA4/TOCK1
le choix s’effectue grâce au bit RTS du registre OPTION.
Le pic 16F84 dispose d’un diviseur de fréquence qui peut être assigné soit au chien de
garde, soit au TMR0 ( uniquement un à la fois ). L’assignation du pré diviseur se faitgrâce au bit PSA du registre OPTION. La structure interne du TMR0 est donc la
suivante ( figure 11 ):
figure 11
du registre
intcon
il se produit un
retard de deux
cycles avant que le
timer ne
commence à
compter après un
chargement
RTS RTESuivant que le pré-diviseur est assigné au chien de garde ou au TMR0, la valeur de la
pré-division n’est pas la même, il faut donc être vigilant lors de la programmation
comme le montre la figure 12 :
figure 12
Enfin, vu que le timer ne peut que compter, cela oblige à une petite gymnastique lors de
l’introduction de la valeur de pré chargement :
exemple :
On veut que le timer nous indique par la mise à un du drapeau T0IF l’écoulement d’une
durée de 20ms ( la fréquence d’horloge étant de 4MHz ) d’où Fosc/4=1μs
si on choisit une pré division de 256 , on aura donc 20000 μs / 256 =78
Il ne faut pas charger le TMR0 avec 78 mais avec le complément à deux de cette valeur
( car le timer compte et ne décompte pas ) d’où 256-78=178
RPBU/
INTEDG
RTS
RTE
RTS RTEsoit en hexadécimale la valeur B2h à charger dans le registre TMR0.9) Mise en oeuvre
L’utilisation et la mise en œuvre très simple des PICs les a rendus extrêmement
populaire au point que la société qui les fabrique ( MICROCHIP ) est en passe de
devenir le leader mondial dans le domaine des microcontrôleurs devant MOTOROLA et
INTEL.
Il suffit d’alimenter le circuit par ses deux broches VDD et VSS, de fixer sa vitesse de
fonctionnement à l’aide d’un quartz ( figure13) et d’élaborer un petit système pour
permettre de réinitialiser le microcontrôleur sans avoir à couper l’alimentation ( figure
14 ).
figure 13
figure 14Il suffit ensuite d’écrire le programme en langage assembleur ou en C sur un ordinateur
grâce au logiciel MPLAB de MICROCHIP ( logiciel gratuit ) puis de le compiler pour le
transformer en langage machine et le transférer dans le PIC grâce à un programmateur.
Lors de la mise sous tension, tous les registres spécifiques sont placés dans un état
déterminé comme le montre la figure 15u=unchanged ; x=unknown ; -=unimplemented ( read as 0 ) ; q=value depends on
condition
figure 15
Il ne nous reste plus qu’à voir le jeu d’instruction de programmation en assembleur du
PIC et c’est là que réside tout l’intérêt puisqu’il ne dispose que de 35 instructions qui
lui permettent de réaliser toutes les tâches.IV JEU D’INSTRUCTIONS
Afin de comprendre la fonction de chaque instruction, la notation adoptée pour les
données et adresses manipulées par les instructions est fort simple et est la suivante :
-f représente un registre
-b représente un numéro de bit en sachant que 0 correspond toujours au bit de
poids faible ( le plus à droite dans le registre )
-k représente une donnée aussi appelé littéral
Un certain nombre d’instructions ( ADDWF , ANDWF , etc.. ) utilise une notation
spéciale présentée sous la forme :
ADDWF f,d Où f indique le registre et où d peut prendre deux valeurs (0 ou
1), ce qui change le comportement de l’instruction . Si d est à 0,
le résultat est placé dans le registre de travail W, la valeur dans
le registre f est alors inchangée, alors que si d est à 1, le résultat
est placé dans le registre f.
Un autre type d’instruction mérite quelques éclaircissements, ce sont les instructions de
branchement conditionnel. Prenons comme exemple :
BTFSC f,b Qui va vouloir dire ( Bit Test File Skip if Clear ) qui signifie
que l’on va tester le bit b du registre f ( b peut prendre une
valeur de 0 à 7 pour un registre 8 bits ) .Il peut alors y avoir
deux solutions :
-Soit le bit testé est à 1, donc la condition testée n’est pas
réalisée, le programme continue alors son déroulement
normalement en séquence avec l’instruction juste en
dessous.
-Soit le bit testé vaut 0, donc la condition testée est réalisée
et le programme saute l’instruction qui suit le BTFSC dans
le programme.Cette façon de programmer peut paraître étrange, mais avec de l’habitude, elle s’avère
très pratique et permet de réaliser des programmes compacts et performants.
Les 35 instructions sont donc les suivantes :
ADDLW ( Add Literal to W )
syntaxe : ADDLW k
Opération : W+kW
Bits d’état du registre STATUS affectés : C,DC,Z
on ajoute au registre de travail la valeur k et on place le résultat dans le registre de
travail W
durée : 1 cycle instruction ( 4 cycles d’horloge )ADDWF (Add W to F )
syntaxe : ADDWF f,d
Opération : W+ff si d=1 ou W+fW si d=0
Bits d’état du registre STATUS affectés : C,DC,Z
on ajoute le contenu de W et le contenu de f et on place le résultat dans f si d=1 ou
dans W si d=0
durée : 1 cycle instruction ( 4 cycles d’horloge )
ANDLW ( And Literal and W )
syntaxe : ANDLW k
Opération : W ET kW
Bit d’état du registre STATUS affecté : Z
on effectue un ET logique entre le contenu de W et le littéral k , on place le résultat
dans W
durée : 1 cycle instruction ( 4 cycles d’horloge )
ANDWF ( And W with F )
syntaxe : ANDWF f,d
Opération : W ET ff si d=1 ou W ET fW si d=0
Bit d’état du registre STATUS affecté :Zon effectue un ET logique entre le contenu de W et le contenu de f , on place le résultat
dans W si d=0 ou dans f si d=1
durée : 1 cycle instruction ( 4 cycles d’horloge )
BCF ( Bit Clear F )
syntaxe : BCF f,b
Opération : 0b(f)
Bits d’état du registre STATUS affectés :aucuns
on met à 0 le bit b du registre f
durée : 1 cycle instruction ( 4 cycles d’horloge )BSF ( Bit Set F )
syntaxe : BSF f,b
Opération : 1b(f)
Bits d’état du registre STATUS affectés :aucuns
on met à 1 le bit b du registre f
durée : 1 cycle instruction ( 4 cycles d’horloge )
BTFSC ( Bit Test , Skip if Clear )
syntaxe : BTFSC f,b
Opération : saut de l’instruction qui suit si b(f)=0
Bits d’état du registre STATUS affectés :aucuns
Si le bit b de f est nul, l’instruction qui suit celle-ci est ignorée et traitée comme un
NOP. Dans ce cas et dans ce cas seulement, l’instruction BTFSC demande deux cycle s
pour s’exécuter.
durée : 1 cycle instruction ( 4 cycles d’horloge ) ou 2 cycles
BTFSS ( Bit Test , Skip if Set )
syntaxe : BTFSS f,b
Opération : saut de l’instruction qui suit si b(f)=1
Bits d’état du registre STATUS affectés :aucunsSi le bit b de f est à 1, l’instruction qui suit celle-ci est ignorée et traitée comme un
NOP. Dans ce cas et dans ce cas seulement, l’instruction BTFSS demande deux cycles
pour s’exécuter.
durée : 1 cycle instruction ( 4 cycles d’horloge ) ou 2 cycles
CALL (subroutine Call)
syntaxe : CALL label
Bits d’état du registre STATUS affectés :aucuns
On sauvegarde l’adresse de retour dans la pile puis on appelle le sous programme définit
avec l’étiquette label
durée : 2 cycles instruction ( 8 cycles d’horloge )CLRF ( Clear F )
syntaxe : CLRF f
Opération : 0F
Bit d’état du registre STATUS affecté :Z
On met le contenu du registre f à 0 et on positionne Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
CLRW ( Clear W )
syntaxe : CLRW
Opération : 0W
Bit d’état du registre STATUS affecté :Z
On met le contenu du registre W à 0 et on positionne Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
CLRWDT ( Clear WatchDog Timer )
syntaxe : CLRWDT
Opération : 0WDT et 0pré diviseur du Timer
On met le contenu du registre du timer chien de garde à 0 ainsi que le pré diviseur
durée : 1 cycle instruction ( 4 cycles d’horloge )COMF ( Complement F )
syntaxe : COMF f,d
opération :/ff si d=1 ou /fW si d=0
Bit d’état du registre STATUS affecté :Z
On complémente le contenu du registre f bit à bit , le résultat est placé dans f si d=1 ,
dans W si d=0 .
durée : 1 cycle instruction ( 4 cycles d’horloge )DECF ( Decrement F )
syntaxe : DECF f,d
opération :f-1f si d=1 ou f-1W si d=0
Bit d’état du registre STATUS affecté :Z
On diminue le contenu du registre f d’une unité, le résultat est placé dans f si d=1, dans
W si d=0 ( dans ce cas f reste inchangé ).
durée : 1 cycle instruction ( 4 cycles d’horloge )
DECFSZ ( Decrement F ,Skip if Zero )
syntaxe : DECFSZ f,d
opération :f-1f si d=1 ou f-1W si d=0 et saut si f-1=0
Bit d’état du registre STATUS affecté :aucun
On diminue le contenu du registre f d’une unité, le résultat est placé dans f si d=1, dans
W si d=0 (dans ce cas f reste inchangé).Si le résultat est nul, l’instruction suivante est
ignorée et dans ce cas, cette instruction dure deux cycles.
durée : 1 cycle instruction ( 4 cycles d’horloge ) ou 2 cycles
GOTO ( branchement inconditionnel )
syntaxe : GOTO label
Bit d’état du registre STATUS affecté :aucunOn effectue un saut dans le programme pour aller à l’adresse pointé par le label précisé
dans GOTO
Durée : 2 cycles ( 8 cycles d’horloge )
INCF (Increment F)
syntaxe : INCF f,d
opération :f+1f si d=1 ou f+1W si d=0
Bit d’état du registre STATUS affecté :Z
On augment le contenu du registre f d’une unité, le résultat est placé dans f si d=1 ,
dans W si d=0 ( dans ce cas f reste inchangé ).
durée : 1 cycle instruction ( 4 cycles d’horloge )INCFSZ ( Increment F , Skip if Zero )
syntaxe : INCFSZ f,d
opération :f+1f si d=1 ou f+1W si d=0 et saut si f-1=0
Bit d’état du registre STATUS affecté :aucun
On augmente le contenu du registre f d’une unité, le résultat est placé dans f si d=1,
dans W si d=0 (dans ce cas f reste inchangé).Si le résultat est nul, l’instruction suivante
est ignorée et dans ce cas, cette instruction dure deux cycles.
durée : 1 cycle instruction ( 4 cycles d’horloge ) ou 2 cycles
IORLW ( Inclusive Or Literal with W )
syntaxe: IORLW k
opération: W OU k  W
Bit d’état du registre STATUS affecté :Z
On effectue un OU logique entre le contenu de W et le littéral k , le résultat est placé
dans W .
durée : 1 cycle instruction ( 4 cycles d’horloge )
IORWF ( Inclusive Or W with F )
syntaxe : IORWF f,d
opération :W OU ff si d=1 ou W OU fW si d=0
Bit d’état du registre STATUS affecté :ZOn effectue un OU entre le contenu de W et le contenu de f , on place le résultat dans
f si d=1, dans W si d=0
durée : 1 cycle instruction ( 4 cycles d’horloge )
MOVF ( Move F )
syntaxe : MOVF f,d
opération :ff si d=1 ou fW si d=0
Bit d’état du registre STATUS affecté :Z
On déplace le contenu de f dans f si d=1 ou de f dans W si d=0 . Attention, le
déplacement de f dans f semble à priori inutile, mais il permet en fait de tester le
contenu de f par rapport à 0 et de positionner le bit Z
durée : 1 cycle instruction ( 4 cycles d’horloge )MOVLW ( Move Literal to W )
syntaxe : MOVLW k
opération :kW
Bit d’état du registre STATUS affecté :aucun
On charge le contenu de W avec le littéral k
durée : 1 cycle instruction ( 4 cycles d’horloge )
MOVWF ( Move W to F )
syntaxe : MOVWF f
opération :Wf
Bit d’état du registre STATUS affecté :aucun
On charge le contenu de f avec le contenu de W
durée : 1 cycle instruction ( 4 cycles d’horloge )
NOP ( No Operation )
syntaxe: NOP
opération: néant
Bit d’état du registre STATUS affecté :aucun
On ne fait que consommer du temps machine ( un cycle dans ce cas )durée : 1 cycle instruction ( 4 cycles d’horloge )
RETFIE ( Return From Interrupt )
syntaxe : RETFIE
opération :Pile PC
Bit d’état du registre STATUS affecté :aucun
On charge le compteur ordinal avec la valeur qui se trouve au sommet de la pile pour
revenir au programme principal lorsque l’exécution du sous programme est terminée.
durée : 2 cycles instruction ( 8 cycles d’horloge )RETLW ( Return Literal to W )
syntaxe : RETLW k
opération :kW , PilePC
Bit d’état du registre STATUS affecté :aucun
On charge le contenu de W avec le littéral k puis on charge le compteur ordinal PC avec
la valeur qui se trouve au sommet de la pile effectuent ainsi un retour de sous
programme .
durée : 2 cycles instruction ( 8 cycles d’horloge )
RETURN ( Return from subroutine )
syntaxe : RETURN
opération :PilePC
Bit d’état du registre STATUS affecté :aucun
On charge le compteur ordinal PC avec la valeur qui se trouve au sommet de la pile
effectuent ainsi un retour de sous programme. C’est un RETLW simplifié .
durée : 2 cycles instruction ( 8 cycles d’horloge )
RLF ( Rotate Left F through carry )
syntaxe : RLF f,d
opération :
7 6 5 4 3 2 1 0
C
Registre fBit d’état du registre STATUS affecté :C
On effectue une rotation à gauche de un bit du contenu du registre f en passant par le
bit de retenu C . Si d=1 le résultat est placé dans f , si d=0 , le résultat est placé dans
W
durée : 1 cycle instruction ( 4 cycles d’horloge )RRF ( Rotate Right F through carry )
syntaxe : RRF f,d
opération :
Bit d’état du registre STATUS affecté :C
On effectue une rotation à droite de un bit du contenu du registre f en passant par le
bit de retenu C. Si d=1 le résultat est placé dans f , si d=0, le résultat est placé dans W
durée : 1 cycle instruction ( 4 cycles d’horloge )
SLEEP ( Sleep )
syntaxe : SLEEP
opération :0PD, 1T0, 0WDT , 0 pré diviseur
On place le circuit en mode sommeil avec arrêt de l’oscillateur. Cette commande est à
utiliser avec précaution, elle nécessite la connaissance du mode sommeil.
SUBLW ( Substract W from Literal )
syntaxe : SUBLW k
opération :k-WW
Bits d’état du registre STATUS affectés :C,DC,Z
7 6 5 4 3 2 1 0
C
Registre fOn soustrait le contenu du registre W du littéral k et on place le résultat dans W (
soustraction par la méthode du complément à 2 ).
durée : 1 cycle instruction ( 4 cycles d’horloge )
SUBWF ( Substract W from F )
syntaxe : SUBWF f,d
opération :f-WW si d=0 ou f-Wf si d=1
Bits d’état du registre STATUS affectés :C,DC,Z
On soustrait le contenu du registre W du contenu du registre f et on place le résultat
dans W si d=0, ou dans f si d=1 ( soustraction par la méthode du complément à 2 ).
durée : 1 cycle instruction ( 4 cycles d’horloge )SWAPF ( Swap F )
syntaxe : SWAPF f,d
opération :f(0-3)f(4-7) et f(4-7)f(0-3) résultat dans W ou f selon d
Bit d’état du registre STATUS affecté :aucun
On échange les quatre bits de poids forts avec les quatre bits de poids faibles et on
place le résultat dans W si d=0 , ou dans f si d=1
durée : 1 cycle instruction ( 4 cycles d’horloge )
XORLW ( Exclusive Or Literal with W )
syntaxe : XORLW k
opération :W OU EXCLUSIF kW
Bit d’état du registre STATUS affecté :Z
On effectue un OU Exclusif entre W et le littéral k, le résultat est placé dans W
durée : 1 cycle instruction ( 4 cycles d’horloge )
XORWF ( Exclusive Or W with F)
syntaxe : XORWF f,d
opération :W OU EXCLUSIF fW si d=0 ou W OU EXCLUSIF ff si d=1
Bit d’état du registre STATUS affecté :Z
On effectue un OU Exclusif entre W et le contenu de f , le résultat est placé dans W si
d=0, sinon il est placé dans f .durée : 1 cycle instruction ( 4 cycles d’horloge )JEU D’INSTRUCTIONV Petite application
Afin de mettre en pratique des notions encore toutes fraîches, il peut être intéressant de
clôturer ce cours par une séance de travaux dirigés. Commençons par le commencement
avec un petit exemple qui n’a d’autre intérêt que d’appréhender de façon simple un
premier programme écrit en assembleur.
 Voici donc un exemple de programme dont la seule fonction et de recopier sur l a
patte RA0 (donc programmée en sortie) l’état de la patte RB0 ( donc programmée
en entrée). Sur ce petit exemple, on peut alors aborder les notions d’algorithme et
de structure de programmation avec les instructions spécifique aux logiciels de
compilation (org, equ, end , les étiquettes, etc…).
;définition des différentes étiquettes
;pour une structure de programme plus claire
;equ n’est pas une instruction PIC mais sert
;au compilateur
statusequ h’0003′ ;adresse du registre (page 0)
portaequ h’0005′;adresse porta (page0)
portbequ h’0006′;adresse port b (page 0)
trisa equ h’0085′;adresse trisa (page 1)
trisb equ h’0086′;adresse trisb (page 1)
RA0 equ h’0000′;rang du bit RA0 dans porta
RB0 equ h’0000′;rang du bit RB0 dans portb
RP0 equ h’0005′;rang du bit RP0 dans status
;début du programme indiqué par l’instruction
;org qui est nécessaire au compilateur
org 0000 ;début du programme
;nécessairement à l’adresse
;0000 pour tous les PICs
;initialisation de RA0 en sortie
bsf status,RP0;passage en page 1 de
début
initialisation de RA0 en sortie
initialisation du portB en entrée
RB0=0? non
oui
RA0=0 RA0=1
Algorithme du programme;la mémoire de données
bcf trisa,RA0 ;mise à 0 de RA0 (sortie)
;initialisation de RB0 en entrée
bsf trisb,RB0 ;mise à 1 de RB0 (entrée)
,mais inutile en pratique
;car réalisé après un RESET
;programme principal
;test de RB0 et recopie en RA0
bouc bcf status,RP0;retour en page 0
btfss portb,RB0 ;test RB0 saute l’instruction si RB0=1
goto eteind ;va à l’étiquette eteint
goto allum ;va à l’étiquette allum
;mise à 0 de RA0
eteintbcf porta,RA0 ;mise à 0 de RA0
goto bouc ;retour à la boucle de test
;mise à 1 de RA0
allumbsf porta,RA0 ;mise à 1 de RA0
goto bouc ;retour à la boucle de test
;fin du programme
;utilisé par le compilateur
End16 RA7/OSC1/CLKIN
RB0/INT 6
RB1/RX/DT 7
RB2/TX/CK 8
RB3/CCP1 9
RB4 10
RB5 11
RB6/T1OSO/T1CKI 12
RB7/T1OSI 13
RA0/AN0 17
RA1/AN1 18
RA2/AN2/VREF 1
RA3/AN3/CMP1 2
RA4/T0CKI/CMP2 3
15 RA6/OSC2/CLKOUT
4 RA5/MCLR
U1
PIC16F628A
0 0
D1
D2
D3
LED
D4
D5
LED-GREEN
D6
LED-GREEN
D7
D8
R1
220
R2
220
R3
R4 220
220
R5
220
R6
220
R7
R8
220
LES MICROCONTRÔLEURS
☺ Activité de découverte: La signalisation lumineuse d’un robot est assurée par une
série de 8 diodes LED de couleur rouge, ces diodes permettent à l’utilisateur de
connaitre l’état de robot :
Le fonctionnement des diodes est le suivant :
 À l’arrêt les diodes sont toutes éteintes.
 En fonctionnement le robot allume les diodes l’une après l’autre (chenillard).
 Lorsque sa batterie est à la limite de la décharge, le robot effectue un
clignotement des diodes.
 Durant la charge de la batterie toutes les diodes sont constamment allumées.
On peut mettre en œuvre la fonction signalisation lumineuse du robot en utilisant
un microcontrôleur comme suit :Tableau résumant le fonctionnement des diodes
 Qu’appelle t-on le circuit U1 ? : Microcontrôleur PIC 16F628A
 Le nombre de broches d’entrée/sortie est : 16
PORTA RA1 RA0 Etat du robot Etat des diodes
0 0 0 Arrêt Eteintes
1 0 1 Batterie à la limite de décharge Clignotent
2 1 0 Fonctionne chenillard
3 1 1 Charge de la batterie Allumées Quelles sont les broches qui sont utilisées comme entrée ? :
RA0 et RA1
 Quelles sont les broches qui sont utilisées comme sorties ? : RB0
,RB1,RB2,RB3,RB4,RB5,RB6,RB7
 Les registres TRIS ont pour fonction de configurer les broches d’entrées/sorties des
ports.
Chaque broche de chaque port peut être utilisée en entrée ou en sortie :
Un bit à 0 programme la broche correspondante en sortie.
Un bit à 1 programme la broche correspondante en entrée.
Exemple : Remplir le tableau suivant :
 Déduire alors les valeurs des TRISA et TRISB du microcontrôleur pour l’exemple
précédent :
TRISA
1 1 1 1 1 1 1 1
= (111111111
.)Bin = (FF)HEX = ( 255
)10
TRISB 1 0 1 0 0 1 1 0 = (C6 )HEX = (198 )10
PORTB
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
entrée sortie entrée sortie sortie entrée entrée sortieTRISB
0 0 0 0 0 0 0 0 = (00000000 .)Bin
= (00)HEX = ( 0 )10
Mise en œuvre d’une application à base de microcontrôleur :
Cette opération consiste à traduire un cahier des charges en un programme codé, puis
à le transférer vers la mémoire programme du microcontrôleur.
Divers outils de développement sont mis à la disposition du concepteur. Parmi ces
outils, on cite :

  • La programmation graphique, elle est basée sur l’interconnexion graphique
    de symbole ou modules « algorigrammes, grafcet et autres… ».
  • La programmation mettant en œuvre un langage évolué tels que langage C,
    Basic, Pascal,…
    Que ce soit par la méthode graphique ou en langage évolué, l’écriture du
    programme ainsi que
    sa mise au point doivent suivre le diagramme suivant :
    I – PROGRAMMATION EN MIKROPASCAL :
    1 – Structure d’un programme :
    Cahier des
    Charges
    Programmation
    graphique :
    Organigramme
    Compilateur Fichier.hex
    Simulation
    (ISIS)
    Transfert
    Ic prog, Winpic
    Programmation en
    langage évolué :
    PascalUn programme est un texte que le compilateur va traduire en fichier hexadécimal. Le
    texte d’un programme contient au moins trois parties.
    a- L’entête : commence par le mot réservé ” Program ” suivi par le nom du projet.
    b- Les déclarations : On déclare les variables, les Procédures et les fonctions
    utilisées dans le programme.
    c- Le corps du programme : Commence par ” Begin ” et se termine par “End ” suivi
    d’un point final. Entre “Begin” et “End” se trouvent les instructions à effectuer par le
    programme.
    2 – Les règles de bases :
    a- Toutes instructions ou actions se terminent par un point virgule ;
    b- Une ligne de commentaires doit commencer par “{” et se terminer par “}” ou
    commence par “//”.
    c- Un bloc d’instructions commence par “Begin” et se termine par “End”.
    3 – Les types de variables utilisées en Mikropascal :
    Algorithmique Langage PASCAL Commentaires
    Algoritme Nom Algorithme ;
    Variables
    Nom variable : Type ;
    Constantes
    Nom constante : Type =valeur ;
    Début
    ……..
    ……..
    Fin.
    Program Nom programme ;
    Var
    Nom variable : Type ;
    Const
    Nom constante : Type =valeur ;
    Begin
    ……..
    ……..
    End.
    // Entête
    // Déclaration
    // Programme
    principal4 – Les bases du compilateur Mikropascal :
    Le décimal A = 12
    L’hexadécimal A = $0C ou A = 0x0C
    Le binaire A = %0001100
    5 – les opérateurs arithmétiques et logiques :
    6 – Les structures usuelles :
    a- L’affectation : C’est l’action d’attribuer une valeur à une variable.
    Type Désignation Taille Rang
    Bit bit 1 bit 0 ou 1
    Bit registre sbit 1 bit 0 ou 1
    octet byte 8 bits 0 – 255
    Caractère ASCII char 8 bits 0 – 255
    mot word 16 bits 0 – 65535
    Octet signé short 8 bits -128 à +127
    Entier integer 16 bits -32768 à +32767
    Entier long longint 32 bits -2147483648 à +214783647
    Réel real 32 bits ±1.17549435082 * 10-38 à ±6.80564774407 * 1038
    Tableau Array[n]of type n éléments Rang du type
    Chaîne de caractères String[N] N caractères 0 – 255
    Opérateurs arithmétiques Opérateurs de comparaison Opérateurs logiques
    Opérateur opération Opérateur Opération Opérateur Opération
  • Addition = Egalité AND ET
  • Soustraction < > Différent OR OU
  • Multiplication > Supérieur XOR OU exclusif
    / Division < inférieur NOT NON div Division entière <= Inférieur ou égale SHL Décalage à gauche mod Reste de la division >= Supérieur ou égale SHR Décalage à droite
    Langage graphique Langage algorithmique Langage PASCAL
    a = b+c a  b+c a : = b+cb- Les structures alternatives :
    c- Les structures itératives ou répétitives :
    Langage graphique Langage algorithmique Langage PASCAL
    i : entier ;
    POUR i variant de « valeur initiale »
    i : integer ;
    FOR i := « valeur initiale »
    i=valeur initiale
    Langage graphique Langage algorithmique Langage PASCAL
    SI condition Alors
    DEBUT
    traitement ;
    FINSI ;
    IF condition THEN
    BEGIN
    traitement ;
    END ;
    SI condition Alors
    DEBUT
    traitement 1 ;
    FIN
    SINON
    DEBUT
    traitement 2 ;
    FINSI ;
    IF condition THEN
    BEGIN
    Traitement 1 ;
    END
    ELSE
    BEGIN
    traitement 2 ;
    END;
    SELON expression
    Valeur 1 : action1 ;
    Valeur 2 : action2 ;
    ………………… ;
    Valeur n : action n ;
    Autrement : action 0 ;
    FINSELON ;
    CASE expression OF
    Valeur 1 : action1 ;
    Valeur 2 : action2 ;
    ………………… ;
    Valeur n : action n ;
    ELSE : action 0 ;
    END ;
    non
    Valeur 1
    Action 1
    non
    oui
    Valeur 2 non
    oui
    Action 2
    Valeur 3
    oui
    Action 3
    Condition
    Traitement
    non
    oui
    Condition
    Traitement 1 Traitement 2
    non
    ouiII – APPLICATIONS À BASE DE PIC :
    Activité N°1: Equations
    Objectif : L’objectif de cette activité est de traduire des équations logiques d’un système
    combinatoire en
    un programme en Mikropascal.16 OSC1/CLKIN
    RB0/INT 6
    RB1 7
    RB2 8
    RB3 9
    RB4 10
    RB5 11
    RB6 12
    RB7 13
    RA0 17
    RA1 18
    RA2 1
    RA3 2
    RA4/T0CKI 3
    15 OSC2/CLKOUT
    4 MCLR
    U1
    PIC16F84A
    0 ? ? ? ? ?
    A B D
    S1
    S2
    S3
    S4
    S5
    0 0
    Lancer le logiciel mikropascal pro et créez un nouveau projet :
    1- Dans le menu principal cliquer sur «Project» par la
    suite sur «New project»
    2- Une fenêtre «New Project Wizard» apparait,
    cliquer sur « Next ».
    3- Dans le champ «Project Name» Saisir le nom du
    projet Par exemple : activite1, ce nom ne doit pas
    contenir des caractères accentués ou des espaces.
    1
    2
    S1= A+B
    S2 = B.D
    S3 = A  B
    S4 = A .B + D
    S5 = A B
    Affectation des entrées /sorties
    Entrées Sorties
    A RA0 S1 RB0
    B RA1 S2 RB1
    D RA2 S3 RB2
    S4 RB3
    S5 RB44- Cliquer sur le bouton « Browse » et sélectionner un répertoire sur le disque de votre
    PC, ce répertoire contiendra tous les fichiers de votre projet.
    5- Sélectionner le type du microcontrôleur : P16F84A
    6- Fixer la valeur de l’horloge du microcontrôleur : 4MHz.
    7- Cliquer sur le bouton « Next »
    8- Cliquer sur le bouton « Next »
    9- Cocher la case « IncludeAll » cette option permet d’utiliserles fonctions prédéfinies de
    Mikropascal
    8 9
    10
    3 5
    6
    7
    P16F84A10- Cliquer sur le bouton
    « Next
    11- Cocher la case « Open Edit Project window to set Configuration bits ».
    12- Cliquer sur le bouton « Finish ».
    11
    1213- Assurer les réglages des bits de configurations comme indiqué dans la figure
    suivante.
    14- Cliquer sur le bouton « OK ».
    15- Compléter puis saisir le programme ci-contre
    program equations; // Nom du programme
    var // déclaration des variables
    13
    14A: sbit at RA0_bit; // La variable A est un bit affecté à la broche RA0
    B: sbit at RA1_bit; // La variable B est un bit affecté à la broche RA1
    D: sbit at RA2_bit; // La variable D est un bit affecté à la broche RA2
    S1: sbit at RB0_bit; // La variable S1 est un bit affecté à la broche RB0
    S2: sbit at RB1_bit;
    S3: sbit at RB2_bit;
    S4: sbit at RB3_bit;
    S5: sbit at RB4_bit;
    begin
    TRISA:= $FF; // Tout le portA est configuré en entrée
    TRISB:= 0; // Tout le portB est configuré en sortie
    PORTB:= 0; // Initialisation des sorties
    while true do // Boucle infinie
    begin
    S1:= A Or B; // equation de S1
    S2:= B And D;
    S3:= A xor B ;
    S4:= (not A) and B or D;
    S5:= not (A xor B);
    end;
    end.16 OSC1/CLKIN
    RB0/INT 6
    RB1 7
    RB2 8
    RB3 9
    RB4 10
    RB5 11
    RB6 12
    RB7 13
    RA0 17
    RA1 18
    RA2 1
    RA3 2
    RA4/T0CKI 3
    15 OSC2/CLKOUT
    4 MCLR
    U1
    PIC16F84A
    0 ? ? ? ? ?
    A B D
    S1
    S2
    S3
    S4
    S5
    0 0
    16- Compiler le projet et vérifier que la compilation a réussi :
    17-Message «Compiled Successfuly » dans l’onglet messages.
    18- Lancer le logiciel de simulation et saisir le schéma de simulation.
    19- Dans la fenêtre « Edit Component » indiquer le nom et le chemin du fichier.hex
    16
    1720- Régler l’horloge à 4MHz
    21- Lancer la simulation et vérifier le fonctionnement des sorties.
    22- Lancer le logiciel WinPic800.
    23- Cliquer sur l’icône de détection du type du microcontrôleur.
    19
    20
    22
    23
    24
    2524- Dans le menu principal cliquer sur : Fichier … Ouvrir … equations.hex
    25- Programmer le microcontrôleur PIC16F84A
    Activité N°2: Compteur à base de PIC16F876A
    On souhaite réaliser un compteur modulo 10 avec le PIC 16F876A suivant ce montage :
    Traduire l’algorigramme suivant en un programme micropascal.
    R1
    1k
    7 A QA 13
    1 B QB 12
    2 C QC 11
    6 D QD 10
    4 BI/RBO QE 9
    5 RBI QF 15
    3 LT QG 14
    U2
    7447
    2 RA0/AN0
    3 RA1/AN1
    4 RA2/AN2/VREF-/CVREF
    6 RA4/T0CKI/C1OUT
    7 RA5/AN4/SS/C2OUT
    9 OSC1/CLKIN
    10 OSC2/CLKOUT
    RC1/T1OSI/CCP2 12
    RC2/CCP1 13
    RC3/SCK/SCL 14
    RB7/PGD RB6/PGC RB5 RB4 28 27 26 25
    RB3/PGM RB0/INT RB2 RB1 24 23 22 21
    RC4/SDI/SDA RC7/RX/DT RC6/TX/CK RC5/SDO 18 17 16 15
    5 RA3/AN3/VREF+
    RC0/T1OSO/T1CKI 11
    1 MCLR/Vpp/THV
    U1 PIC16F876A
    Q1
    2N2222
    program ACTIVITE2;
    Var
    N:byte; // N est une variable de type octet
    beginActivité N° 3: Affichage multiplexéR3
    1k
    R2
    1k
    R1
    1k
    7 A QA 13
    1 B QB 12
    2 C QC 11
    6 D QD 10
    4 BI/RBO QE 9
    5 RBI QF 15
    3 LT QG 14
    U4
    7447 T1
    2N2222
    T2
    2N2222
    T3
    2N2222
    16 OSC1/CLKIN
    RB0/INT 6
    RB1 7
    RB2 8
    RB3 9
    RB4 10
    RB5 11
    RB6 12
    RB7 13
    RA0 17
    RA1 18
    RA2 1
    RA3 2
    RA4/T0CKI 3
    15 OSC2/CLKOUT
    4 MCLR
    U1
    PIC16F84A
    Vcc
    Afficheurs à anodes communes
    Afficheurs 3 Afficheurs 2 Afficheurs 1
    Décodeur
    On désire afficher un nombre formé de 3 chiffres exemple 932 en utilisant 3 afficheurs
    à 7 segments
    et un seul décodeur, pour cela on utilise un microcontrôleur 16F84A qui réalise le
    multiplexage de l’affichage. Le décodeur utilisé est le 7447 dont les sorties sont
    activées à niveau bas donc les afficheurs sont à anodes communes.
    Les bornes communes des afficheurs « anodes » sont commandées à travers des
    transistors NPN de telle sorte que lorsque un transistor est saturé, la borne commune de
    l’afficheur est alors reliée au +Vcc donc l’afficheur correspondant fon ctionne.
    Le principe est de placer le
    nombre à afficher sur le décodeur
    puis commander le transistor
    correspondant
    pour l’afficher.
    Schéma du montage :
     Si B=1 le transistor est saturé
     Si B=0 le transistor est bloqué
    Les transistors utilisés pour la
    commande des afficheurs sont
    de type NPN.
    C
    B
    E
    C E
    C E1°) Compléter le tableau suivant :
    2°) Compléter puis saisir le programme ci-contre puis simuler et vérifier le
    fonctionnement :
    program affichage_multiplexe;
    begin
    trisb:=$F0 ; // RB0,RB1,RB2,RB3 sorties
    trisa:=$18 ; // RA0,RA1,RA2 sorties,
    RA3,RA4 entrées
    porta:=0; // état initial du porta
    While true do
    begin
    porta:=%000 ; // aucun afficheur
    delay_ms(1);
    portb:=2; // placer le nombre de l’unité
    porta:=%001; // Commander le 1er afficheur
    Transistor : bloqué ou saturé Afficheur commandé : oui ou non
    Temporisation
    Nombre à afficher T1 T2 T3 Afficheur 1 Afficheur 2 Afficheur 3
    bloqué bloqué bloqué non non non 1ms
    2 saturé bloqué bloqué oui non non 10ms
    bloqué bloqué bloqué non non non 1ms
    3 bloqué saturé bloqué non oui non 10ms
    bloqué bloqué bloqué non non non 1ms
    9 bloqué bloqué saturé non non oui 10ms
    porta:=%000; // aucun afficheur
    delay_ms(1);
    portb:=3 ; // placer le nombre de dizaine
    porta:=%010 ; // Commander le 2éme afficheur
    delay_ms(10) ;
    porta:=%000; // aucun afficheur
    delay_ms(1);
    portb:=9 ; // placer le nombre de centaine
    porta:=%100; // Commander le 3 éme afficheur
    delay_ms(10);
    end;
    end.delay_ms(10);
    Activité N°4: Compteur modulo 1000 avec affichage multiplexé
    Compléter puis saisir le programme ci-contre puis simuler et vérifier le fonctionnement :
    program compteur_modulo1000_affichage_multiplexe;
    var i:word;
    var j:byte;
    var unite,dizaine,centaine:byte;
    begin
    trisb:=$F0 ; // RB0,RB1,RB2,RB3 sorties
    trisa:=$18 ; // RA0,RA1,RA2 sorties RA3,RA4 entrées
    porta:=0 ; // état initial du porta
    While true do
    begin
    for i:=0 to 999 do
    begin
    unite:= i mod 10 ; // identifier le chiffre de l’unité
    dizaine:= (i div 10) mod 10 ; // identifier le chiffre de dizaine
    centaine:= i div 100 ; // identifier le chiffre de centaine
    for j:=1 to 28 do
    begin
    Comment identifier les chiffres unité, dizaine,
    centaine et millier d’un nombre ?
    Exemple :N=9573
    N=9573
    Unité de N 3 N mod 10
    Dizaine de N 7 (N div 10) mod 10
    Centaine de N 5 (N div 100) mod 10
    Millier de N 9 N div 1000porta:=%000;
    delay_ms(1);
    portb:=unite;
    porta:=%001; // Commander le premier afficheur
    delay_ms(10);
    porta:=%000;
    delay_ms(1);
    portb:=dizaine;
    porta:=%010; // Commander le 2éme afficheur
    delay_ms(10);
    porta:=%000;
    delay_ms(1);
    portb:=centaine;
    porta:=%100;
    delay_ms(10);
    end;
    end;
    end;
    end.
    Activité N°5: signalisation lumineuse d’un robot (voir activité de découverte)
    Compléter puis simuler le programme suivant :
    program activité5;var i:byte; // declaration d’une variable i de type octet
    begin
    TRISB:= 0 ; // Configuration du port B comme sortie
    TRISA:=$FF; // Configuration du port A comme entrée
    PORTB:=0; // initialisation du port B
    CMCON:=$07; // Désactivation du comparateur, PORTA numérique
    While true do // Boucle infinie
    begin
    if PORTA = 0 then PORTB:= 0; // Arrêt toutes les diodes sont
    éteintes
    if PORTA = 3 then PORTB:=$ FF; // Charge de la batterie toutes
    sont allumées
    if PORTA = 1 then // Batterie à la limite de décharge
    clignotement des diodes
    begin
    PORTB:=$ FF;delay_ms(100) ;
    PORTB:=$00 ;
    delay_ms(100) ;
    end;
    if PORTA = 2 then // fonctionnement normal chenillard
    begin
    PORTB:=%10000000;
    for i:=1 to 8 do // Boucle pour
    begin
    delay_ms(100);
    PORTB:=PORTB shr 1 ; // décalage
    à droite de 1 bit du PORTB
    end;
    end;
    end;
    end.
    Activité N°5 bis : signalisation lumineuse d’un robot (Utilisation des procédures)program Activite 5bis;
    var
    diodes: byte at portB; // On déclare une variable diodes de type octet affecté au
    PORTB pour les sorties
    entrees: byte at portA; // On déclare une variable entrées de type octet affecté au
    PORTA pour les entrées
    procedure marche(const etat:byte); // déclaration d’une procédure qui porte le nom
    marche
    begin // la procédure marche reçoit du programme principal une
    constante etat de type octet
    diodes:=etat;
    end;
    procedure chenillard(); // déclaration d’une procédure qui porte le nom
    chenillard
    var i:byte; // On déclare une variable i de type octet
    begin
    diodes:=%10000000; // cette procédure allume les diodes l’une après
    l’autre (chenillard)for i:=1 to 8 do
    begin
    delay_ms(100);
    diodes:=diodes shr 1 ;
    end;
    end;
    procedure clignotant(); // déclaration d’une procédure qui porte le nom
    clignotant
    begin
    marche($FF);delay_ms(100); // tous les diodes sont allumées pendant 100ms
    marche($00);delay_ms(100); // tous les diodes sont éteintes pendant 100ms
    end;
    begin
    trisb:=$00;TRISA:=$FF; // Configuration du PORTB en sortie et
    PORTA en entées
    cmcon:=$07; // PORTA numérique désactivation du comparateurs
    analogiques
    while true do // boucle infinie
    begin
    Programme principalif entrees=0 then marche(0); // Appel de la procédure marche qui reçoit la valeur
    0 « diodes éteintes »
    if entrees=1 then clignotant(); // Appel de la procédure clignotant
    if entrees=2 then chenillard(); // Appel de la procédure chenillard
    if entrees=3 then marche($FF); //Appel de la procédure marche qui reçoit la
    valeur 255 « diodes allumées »
    end;
    end.
    ☺ ActivitéN°6 (Grafcet1)
    Objectif : L ‘objectif de cette activité est de traduire un grafcet d’un point de vue partie
    commande en un algorithme puis le traduire en programme en Mikropascal.
    GRAFCET d’un point de vue P.C
    On vous donne le tableau
    d’affectation des entrées /sorties
    Pour le microcontrôleur PIC
    16F84A :
    Entrées Sorties
    Capteurs microcont Broche du rôleur Préactionneurs microcontrôleur Broche du
    Dcy RB0 KM1 RA0
    L11 RB1 KM2 RA1
    a RB2 KM3 RA2
    L10 RB3
    0 1 2 3
    Dcy
    KM1
    L11
    KM2
    a
    KM3
    L10 Compléter l’algorithme.
     Compléter le programme en Mikropascal.
    Ecrire le programme, le compiler et vérifier le fonctionnement :
    Algorithme Programme
    Algorithme grafcet_1;
    Variables :
    Dcy :un bit affecté à RB0 ;
    L11 :un bit affecté à RB1 ;
    a : un bit affecté à RB2 ;
    L10 :un bit affecté à RB3 ;
    KM1 :un bit affecté à RA0 ;
    KM2 :un bit affecté à RA1 ;
    KM3 :un bit affecté à RA2 ;
    X0, X1, X2, X3:bit ;
    début
    trisa  $00; trisb  $FF;
    KM1  0 ; KM2  0 ;KM3  0 ;
    X0  1; X1  0; X2  0; X3  0;
    Tant que (vrai) faire
    début
    si (X0=1) ET (Dcy=1) alors
    début
    X0  0; X1  1;
    finsi;
    si (X1=1) ET ( L11 =1) alors
    début
    X1  0; X2  1;
    finsi;
    si (X2=1) ET ( a =1) alors
    début
    X2  0; X3  1;
    finsi;
    si (X3=1) ET ( L10 =1) alors
    début
    X3  0; X0  1;
    finsi;
    si (X1=1) alors KM1 1 sinon KM1  0
    si (X2=1) alors KM2  1 sinon KM2  0
    si(X3=1) alors KM3 1 sinon KM3  0
    finfaire;
    fin.
    program grafcet_1;
    var
    Dcy : sbit at RB0_bit ;
    L11 : sbit at RB1_bit ;
    a : sbit at RB2_bit ;
    L10 : sbit at RB3_bit ;
    KM1 :sbit at RA0_bit ;
    KM2 :sbit at PORTA.1 ;
    KM3 :sbit at PORTA.2;
    X0, X1, X2, X3:bit;
    begin
    trisa := $00; trisb := $FF;
    KM1 := 0 ; KM2 := 0 ;KM3 := 0 ; // initialisation des sorties
    X0 :=1; X1 := 0; X2 := 0; X3 := 0; // initialisation des étapes
    while true do // boucle infinie
    begin
    if (X0=1) and (Dcy=1) then
    begin // désactivation: étape 0
    X0 := 0; X1 := 1; // activation: étape1
    end;
    if (X1=1) and ( L11 =1) then
    begin
    X1 := 0; X2 :=1;
    end;
    if (X2=1) and ( a=1 ) then
    begin
    X2 := 0; X3 :=1;
    end;
    if (X3=1) and ( L10=1 ) then
    begin
    X3 := 0; X0 :=1;
    end;
    if (X1=1) then KM1:= 1else KM1:= 0; // sortie: KM1
    if (X2=1) then KM2:= 1else KM2:= 0; // sortie: KM2
    if (X3=1) then KM3:= 1else KM3:= 0; // sortie: KM3
    end;
    end.16 OSC1/CLKIN
    RB0/INT 6
    RB1 7
    RB2 8
    RB3 9
    RB4 10
    RB5 11
    RB6 12
    RB7 13
    RA0 17
    RA1 18
    RA2 1
    RA3 2
    RA4/T0CKI 3
    15 OSC2/CLKOUT
    4 MCLR
    U1
    PIC16F84A
    +5V
    RAZ
    X1
    CRYSTAL
    FREQ=4MHz
    C11
    15pF
    C2
    15pF
    R2
    10k
    +5V
    DCY
    SW-SPST-MOM
    L11
    L10
    10k 10k 10k 10k
    ?
    KM1
    ?
    KM2
    ?
    KM3
    a
    ☺ Activité N° 7 (Grafcet2)
    On vous donne le tableau
    d’affectation des entrées /sorties
    Pour le microcontrôleur
    PIC 16F876A :
    Entrées Sorties
    Capteurs microcontrôleur Broche du Préactionneurs microcontrôleur Broche du
    m RA0 KM1 RB0
    a RA1 KM2 RB1
    b RA2 AV RB2
    AR RB3
    0 1 2 3
    m
    KM1
    a
    T
    t / 2 / 5s
    b
    KM2 AV
    KM1 KM2 AR+5V
    10k 10k 10k
    ?
    KM1
    ?
    KM2
    ?
    AV
    a
    2 RA0/AN0
    3 RA1/AN1
    4 RA2/AN2/VREF-/CVREF
    6 RA4/T0CKI/C1OUT
    7 RA5/AN4/SS/C2OUT
    9 OSC1/CLKIN
    10 OSC2/CLKOUT
    RC1/T1OSI/CCP2 12
    RC2/CCP1 13
    RC3/SCK/SCL 14
    RB7/PGD 28
    RB6/PGC 27
    RB5 26
    RB4 25
    RB3/PGM 24
    RB2 23
    RB1 22
    RB0/INT 21
    RC7/RX/DT 18
    RC6/TX/CK 17
    RC5/SDO 16
    RC4/SDI/SDA 15
    5 RA3/AN3/VREF+
    RC0/T1OSO/T1CKI 11
    1 MCLR/Vpp/THV
    U1
    PIC16F876A
    m b
    ?
    AR
     Compléter le programme en Mikropascal.
    Algorithme Programme
    program grafcet_2;
    var
    m: sbit at RA0_bit ;
    a: sbit at RA1_bit ;
    b: sbit at RA2_bit ;
    KM1
    Algorithme grafcet_2;
    variables
    m: un bit du registre PORTA affecté à RA0 ;
    a: un bit du registre PORTAaffecté à RA1 ;
    b: un bit du registre PORTA affecté à RA2 ;☺ Activité 8: GRAFCET3 (séquences multiples) :
    Chariot de soudage mobile sur rail fixePrésentation :
    Un appui sur le bouton poussoir «m» provoque le déplacement du chariot et active la
    torche de soudage.
    Le chariot effectue 4 cycles de va et vient puis s’arrête.
    Entrées Sorties
    Désignation microcontrôleur Broche du Désignation Préactionneurs microcontrôleur Broche du
    Mise en marche m RA0 Translation du
    chariot KM1 RB0
    Fin de course droite a1 RA1 Torche de
    soudage KM2 RB1
    Fin de course gauche a0 RA2
    Sens avant
    pour la
    translation du
    chariot
    AV RB2
    Sens arrière
    pour la
    translation du
    chariot
    AR RB3
    0 1 2 3
    m
    KM1
    a1
    KM2 AV
    KM1
    CT=0
    AR
    a0
    CT= CT + 1
    CT=4 CT<4
    10k +5V
    ? KM1
    ? KM2
    ? AV
    m
    ? AR
    a
    a
    16 OSC1/CLKIN
    RB0/INT 6
    RB1 7
    RB2 8
    RB3 9
    RB4 10
    RB5 11
    RB6 12
    RB7 13
    RA0 17
    RA1 18
    RA2 1
    RA3 2
    RA4/T0CKI 3
    15 OSC2/CLKOUT
    4 MCLR
    U2
    PIC16F84A
    1
    0Traduire le GRAFCET d’un point de
    vue partie commande cidessous en un GRAFCET codé
    microcontrôleur puis le traduire
    en programme en Mikropascal.
    program Grafcet_soudure;
    var
    m : sbit at RA0_bit ;
    a0: sbit at RA2_bit;
    a1: sbit at RA1_bit ;
    Grafcet codé PIC
    0 1 2 3
    RA0
    CT=0
    CT= CT + 1
    CT=4 CT<4
    RB0 RB1 RB2
    Not RA1
    RB0 RB3KM1:sbit at RB0_bit ;
    KM2:sbit at RB1_bit ;
    AV:sbit at RB2_bit ;
    AR: sbit at RB0_bit ;
    X0,X1,X2,X3:bit;
    CT:byte;
    begin
    trisa := $1F; trisb := $00;
    KM1:= 0 ;KM2 := 0 ;AV := 0 ;AR := 0 ;
    X0 :=1; X1 := 0; X2 := 0; X3 := 0;
    while true do
    begin
    if (X0=1) and (m=1) then
    begin
    X0 := 0; X1 := 1;
    end;
    if (X1=1) and ( a1 = 0) then
    begin
    X1 := 0; X2 :=1;
    end;
    if (X2=1) and ( a0 = 0 ) then
    begin
    X2 := 0; X3 :=1;CT:=CT +1 ;end;
    if (X3=1) and (CT < 4 ) then
    begin
    X3 := 0; X1 :=1;
    end;
    if (X3=1) and (CT = 4 ) then
    begin
    X3 := 0; X0 :=1;CT:=0;
    end;
    if (X1=1) or (X2=1) then KM1:= 1 else KM1:= 0;
    if (X1=1) then KM2:= 1 else KM2:= 0;
    if (X1=1) then AV:= 1 else AV:= 0;
    if (X2=1) then AR:= 1 else AR:= 0;
    end;
    end.
    LE TIMER TMR0
    Le registre TMR0 est un compteur programmable de 8 bits (de 0 à 255).
    La configuration du TMR0 est assurée par le registre OPTION « OPTION_REG »
    Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    RBPU INTEDG TOCS TOSE PSA PS2 PS1 PSOLe TMR0 est incrémenté en permanence soit par :
     L’horloge interne (fosc/4) « mode TIMER »
     L’horloge externe appliquée à la broche RA4 du portA « mode compteur »
    Le choix de l’horloge se fait à laide du bit 5 du registre OPTION_REG « TOCS »
     TOCS = 0 Horloge interne « mode TIMER »
     TOCS = 1 Horloge externe « mode COMPTEUR»
    Dans le cas de l’horloge externe ,le bit 4 « TOSE » du registre OPTION_REG permet
    de choisir le front sur lequel le TIMER0 s’incrémente :
     TOSE = 0 incrémentation sur fronts montants
     TOSE = 1 incrémentation sur fronts descendants
    PS2 PS1 PSO Diviseur
    0 0 0 2
    0 0 1 4
    0 1 0 8
    0 1 1 16
    1 0 0 32
    1 0 1 64
    1 1 0 128
    1 1 1 256
    Tableau 1
    OPTION_REG
    Schéma synoptique du registre OPTIONQuelque soit l’horloge choisie, on peut la faire passer dans un diviseur de fréquence
    programmable (prescaler) dont le rapport est fixé par les bits PS0,PS1 et PS2 du registre
    OPTION_REG « voir tableau 1 »
    L’affectation ou non du prédiviseur se fait à l’aide du bit 3 « PSA » du registre
    OPTION_REG
     PSA =0 on utilise le prédiviseur.
     PSA =1 pas de prédiviseur.
    Bit 6 :INTEDG « lNTerrupt Edge » : dans le cas où on utilise l’ interruption externe
    avec RB0
     Si INTEDG = 1, on a interruption si le niveau sur RB0 passe de 0 vers
  1. « front montant »
     Si INTEDG = 0, l’interruption s’effectuera lors de la transition de 1 vers
  2. « front descendant »
    Bit 7 : RBPU: Quand ce bit est mis à 0, une résistance de rappel au +5 volt est placée
    sur chaque broche du PORTB
    ☺ Activité 9 : On désire réaliser un compteur modulo10 en utilisant le timer TMR0. En
    mode compteur « entrée de comptage sur RA4 » avec un coefficient de prédivision =1
    (sortie sur le port B)
    N.B À l’issue d’un Reset, le registre OPTION_REG = 1111111116 OSC1/CLKIN
    RB0/INT 6
    RB1 7
    RB2 8
    RB3 9
    RB4 10
    RB5 11
    RB6 12
    RB7 13
    RA0 17
    RA1 18
    RA2 1
    RA3 2
    RA4/T0CKI 3
    15 OSC2/CLKOUT
    4 MCLR
    U1
    PIC16F84A
    0
    1°) Configurer le registre « OPTION_REG »

    Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    RBPU INTEDG TOCS TOSE PSA PS2 PS1 PSO
    1 1 1 0 1 0 0 0
    2°) Compléter puis saisir le programme ci-contre puis simuler et vérifier le
    fonctionnement :
    program
    activite_TMR0_compteur_10;
    begin
    TRISB:=$F0;
    TRISA:=$1F;
    OPTION_reg:= %11101000;
    TMR0:=0;
    while true do
    begin
    portb:=TMR0;
    if TMR0=10 then TMR0:=0;
    end;
    end.Activité 10: On désire réaliser un compteur modulo 8 en utilisant le timer TMR0
    Configurer ce même registre pour un prédiviseur = 2 « entrée de comptage sur RA4 »
    front 
    1°) Configurer le registre « OPTION_REG »
    2°) Compléter puis saisir le programme ci-contre puis simuler et vérifie le
    fonctionnement :
    program activite2_tmr0_compteur_8;
    begin
    TRISB:=$F0;
    TRISA:=$1F;
    OPTION_reg:= %11110000;
    TMR0:=0;
    while true do
    begin
    portb:= TMR0;
    if TMR0=8 then TMR0:=0;
    end;
    end.
    Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    RBPU INTEDG TOCS TOSE PSA PS2 PS1 PSO
    1 1 1 1 0 0 0 0☺ Activité 11 : On désire réaliser un décompteur modulo10 en utilisant le timer TMR0
    en mode compteur « entrée de comptage sur RA4 » avec un coefficient de prédivision
    =1 ( sortie sur le port B)
    1°) Configurer le registre « OPTION_REG »
    2°) Compléter puis saisir le programme ci-contre puis simuler et vérifier le
    fonctionnement :
    program activite_3_tmr0_decompteur_10;
    begin
    TRISB:=$F0;
    TRISA:=$1F;
    OPTION_reg:= %11101000;
    TMR0:=0;
    while true do
    begin
    portb:= 9 – TMR0;
    if TMR0=10 then TMR0:=0;
    Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    RBPU INTEDG TOCS TOSE PSA PS2 PS1 PSO
    1 1 1 0 1 0 0 0end;
    end.
    ☺ Activité 12 : Comptage de véhicules sur une route:
    Ce système permet l’enregistrement du nombre de véhicules qui passent sur une route
    durant un temps donné. Le système est constitué d’un tuyau sensible à la pression,
    relié à une carte à base de microcontrôleur PIC 16F628A et un afficheur 7 segments 4
    digits, le tout contenu dans un boîtier résistant aux intempéries en plastique
    transparent. Pour l’utiliser, il faut déployer le tuyau à travers la route, en le fixant avec
    une robuste bande adhésive puis, laisser les voitures rouler dessus. Chaque jeu de deux
    essieux (c’est-à-dire toutes les deux impulsions) est enregistré comme un véhicule.R90
    1k
    R89
    1k
    R88
    1k
    R87
    1k
    7 A QA 13
    1 B QB 12
    2 C QC 11
    6 D QD 10
    4 BI/RBO QE 9
    5 RBI QF 15
    3 LT QG 14
    U4
    7447
    CAPTEUR
    R112
    1k
    16 OSC1/CLKIN
    RB0/INT 6
    RB1 7
    RB2 8
    RB3 9
    RB4 10
    RB5 11
    RB6 12
    RB7 13
    RA0 17
    RA1 18
    RA2 1
    RA3 2
    RA4/T0CKI 3
    15 OSC2/CLKOUT
    4 MCLR
    U1
    PIC16F84A
    Q1
    Q2 2N2907
    2N2907
    Q3
    Q4 2N2907
    2N2907
    Schéma de montage
    Les transistors utilisés pour la commande des afficheurs sont de type PNP.
     Si B=0 le transistor est saturé
     Si B=1 le transistor est bloqué
    C E
    C E
    C
    B
    E1°) A chaque passage d’un véhicule, le capteur génère deux impulsions, justifier le
    choix de L’entrée RA4 du microcontrôleur PIC 16F84A pour relier ce capteur .
    On a besoin d’une horloge externe pour compter le nombre d’impulsions : c’est la
    broche RA4 et on va utiliser le timer TMR0 en mode compteur.
    2°) Déterminer la valeur du registre OPTION_REG
    3°) Compléter puis saisir le programme ci-contre puis simuler et vérifie le
    fonctionnement :
    program ativite6_voitures_comptage;
    var
    i: word;
    a, uni,dix,cent,mil : byte;
    const
    aucun_afficheur : byte = %1111;
    afficheur1 : byte = % 1110 ; // commande de l’afficheur 1
    afficheur2 : byte = %1101 ; // commande de l’afficheur 2
    afficheur3 : byte = %1011; // commande de l’afficheur 3
    Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    RBPU INTEDG TOCS TOSE PSA PS2 PS1 PSO
    1 1 1 0 0 0 0 0afficheur4 : byte = % 0111; // commande de l’afficheur 4
    begin
    trisb:=$F0; // de RB0 à RB3 sorties ,de RB4 à RB7 entrées
    trisa:=$10; // de RA0 à RA3 sorties , RA4 entrée
    i:=0;a:=0; // Initialisation des variables i et a à la valeur 0
    TMR0:=0; // initialisation du timer 0 à la valeur 0
    OPTION_REG := %11100000; // TMR0 en mode compteur qui s’incrémente toutes les
    deux impulsions.
    while true do
    begin
    if TMR0 > 200 then
    begin
    TMR0:=TMR0-200; // pour étendre le comptage à des valeurs
    supérieures à 255
    a:=a+1;
    end;
    i:=TMR0 + a*200 ;
    uni := i mod 10; // Identifier le chiffre de l’unité de la variable i
    dix := (i div 10) mod 10; // Identifier le chiffre de dizaine de la variable i
    cent := (i div 100) mod 10; // Identifier le chiffre de centaine de la variable i
    mil := (i div 1000); // Identifier le chiffre de millier de la variable i
    porta:=aucun_afficheur;
    delay_ms(1);
    portb:=uni;
    porta:=afficheur1;
    delay_ms(10);
    porta:=aucun_afficheur ;delay_ms(1);
    portb:=dix;
    porta:=afficheur2;
    delay_ms(10);
    porta:=aucun_afficheur ; // affichage multiplexé puisqu’on dispose d’un seul
    décodeur
    delay_ms(1);
    portb:=cent;
    porta:=afficheur3;
    delay_ms(10);
    porta:=aucun_afficheur ;
    delay_ms(1);
    portb:=mil;
    porta:=afficheur4;
    delay_ms(10);
    end;
    end.
    NOTION D’INTERRUPTION
    1°) Définition :
    Une interruption est un événement qui provoque l’arrêt d’un programme en cours
    d’exécution pour aller exécuter un autre programme appelé programme d’interruption
    (ou routine).
    A la fin du programme d’interruption, le microcontrôleur reprend le programme
    principal à l’endroit où il s’est arrêté.
    2°) Déroulement d’une interruption :Le programme se déroule normalement lorsque une interruption survient, le
    programme exécute les tâches suivantes :
     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 revient à l’instruction
    qui suit la dernière exécutée dans
    le programme principal
    3°) Les sources et types d’interruptions :
    Le nombre de sources d’interruptions dépend du microcontrôleur utilisé
    Exemples:
     On distingue deux types d’interruptions :
     Internes
     externes
    Microcontrôleur 16F84A 16F628A 16F88 16F876A 16F877A
    Sources d’interruption 4 10 12 14 15
    Événement
    déclencheur
    Programme principal
    Instruction quelconque
    Instruction xxx
    Routine interruption
    Traiter
    l’interruption
    Fin de
    l’interruption
    Instruction suivanteExemple: PIC 16F84A
    Le PIC 16F84A dispose que de 4 sources d’interruptions, les événements susceptibles
    de déclencher une interruption sont les suivants :
     TMR0 : Débordement du timer0 (TMR0). Une fois que le contenu du TMR0
    passe de ‘FF’ à ‘00’, une interruption peut être générée.
     EEPROM : cette interruption peut être générée lorsque l’écriture dans une case
    EEPROM interne est terminée.
     RB0/INT : Une interruption peut être générée lorsque, la broche RB0, encore
    appelée INTerrupt pin, étant configurée en entrée, le niveau qui lui est appliqué
    est modifié.
     PORTB : De la même manière, une interruption peut être générée lors du
    changement d’un niveau sur une des pins RB4 à RB7.
    4°) Regitre de configuration des interruptions (INTCON) :
    Le registre INTCON (INTerrupt CONtroller) est le registre principal de contrôle et de
    gestion des interruptions.
    Le registre INTCON est parfois différent d’un PIC à un autre il est impératif de revenir
    au document constructeur pour chaque type de microcontrôleur.
    Registre INTCON pour PIC16F84A
    Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
    Registre INTCONGIE : « Global lnterrupt Enable » mis à 1 autorise toutes les interruptions non masquées
    par leur bit individuel.
    EEIE : « EEPROM write completed lnterrupt Enable » : autorise les interruptions de fin
    d’écriture dans l’EEPROM.
    T0IE : « Timer 0 Interrupt Enable » : mis à 1 autorise les interruptions dues au
    débordement du timer 0.
    INTE : « lNTerrupt Enablé » : mis à 1, autorise les interruptions sur RB0/INI.
    L’interruption a lieu sur le front montant de l’impulsion si le bit INTEG (lNTerrupt
    Edge) du registre OPTION est à 1 ; elle a lieu sur
    le front descendant si ce bit est à 0.
    RBIE : « RB Interrupt Enable » :mis à 1, autorise les interruptions sur RB4 à RB7.
    T0IF : « Timer 0 lnterrupt Flag » : est mis à 1 en cas de débordement du timer 0.
    INTF : « lNTerrupt Flag » : est mis à 1 si une interruption est générée sur RB0/INT.
    RBIF : « RB Interrupt Flag », est mis à 1 lors d’un changement d’état sur une des lignes
    RB4 à RB7.
    Chaque indicateur de changement d’état doit être remis à 0 par le logiciel dans le
    programme de traitement de l’interruption.
    NB : Lors d’un Reset, tous les bits du registre INTCON sauf RBIF sont mis à 0. RBIF
    garde son état précédent.
    Le schéma synoptique du registre INTCONOn s’intéresse uniquement aux deux types d’interruptions
     À l’interruption sur la broche RB0
     À l’interruption RB4 à RB7
    5°) Mise en œuvre d’une routine d’interruption en mikropascal
    En mikropascal,le sous programme d’interruption est déclaré en tant que procédure avec
    le nom spécial « Interrupt » procédure interrupt .L’appel d’une procédure d’interruption
    ne dépend pas du programme principal, mais elle l’interrompe pendant son exécution.
    Dans une procédure d’interruption on ne peut pas appeler une autre procédure.
    procedure interrupt ;
    Begin
    Instruction 1;
    …………….;
    Fin d’écriture
    en EEPROM
    Débordement
    Timer 0
    Modif
    RB4 à RB7
    Modif.pin
    RB0
    EEIE
    T0IF
    T0IE
    RBIF
    RBIE
    INTF
    INTE
    GIE
    Autorisation d’une interruption
    INTEDG
    0 / 1 ou 1 / 0Instruction n;
    End;
    5-1 Interruption RB0/INT :
    ☺ Activité : Configurer le registre INTCON en vue d’activer l’interruption externe sur
    RB0 (front montant)
    AVANT L’INTERRUPTION : Au cours de déroulement normal du programme principal :
    Le bit7 (GIE=1) Le bit4 (INTE=1) Le bit (INTF =0 )
    AU COURS DE L’INTERRUPTION :Le microcontrôleur exécute la routine d’interruption :
    Le bit7 (GIE=0) Le bit4 (INTE=1) Le bit (INTF=1)
    Il faut impérativement mettre à 1 le bit GIE et mettre à zéro l’indicateur INTF à la fin
    du sous-programme d’interruption pour pouvoir revenir au programme principal et
    autoriser de nouvelles interruptions sur la broche RB0/INT.A la sortie de la routine
    d’interruption on écrit la valeur $ 90 dans le registre INTCON
    CONCLUSION :
    INTCON
    GIE EEIE T0IE INTE RBIE T0IF INTF RBIF Valeur INTCON
    1 0 0 1 0 0 0 0 (90)16
    INTCON
    GIE EEIE T0IE INTE RBIE T0IF INTF RBIF Valeur INTCON
    0 0 0 1 0 0 1 0 (12)16
    INTCON
    GIE EEIE T0IE INTE RBIE T0IF INTF RBIF Valeur INTCON
    1 0 0 1 0 0 0 0 (90)16Déroulement normal du programme
    principal
    Au cours d’une
    interruption
    A la fin de
    l’interruption
    INTCON := 0x90 INTCON := 0x12 INTCON := 0x90
    Il faut toujours remettre le registre INTCON à 0x90 à la fin de la routine d’interruption
    pour autoriser une autre interruption ou bien mettre les bits : INTCON.GIE :=1 et
    INTCON.INTF :=0
    N.B si on veut produire l’interruption sur le front descendant d’une impulsion
    appliquée sur RB0 on doit
    Mettre un 0 au bit INTEDG du registre OPOTION_REG
    Si INTEDG = 1, l’interruption s’effectuera si le niveau sur RB0 passe de 0 vers1.(front
    montant de RB0)
    Si INTEDG = 0, l’interruption s’effectuera si RB0 passe de 1 vers0. (front descendant
    de RB0)
    À l’issue d’un Reset, tous les bits du registre OPTION sont à 1.
    activité N°1 (interruption avec RB0) : Dé électronique
    Présentation :
    Le dé électronique est constitué :
     D’une platine comportant 7 diodes leds D1, D2, D3, D4, D5, D6 et
    D7. (PORTB)
     Un étage de commande comportant un interrupteur S1
    Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    RBPU INTEDG TOCS TOSE PSA PS2 PS1 PSO16 OSC1/CLKIN
    RB0/INT 6
    RB1 7
    RB2 8
    RB3 9
    RB4 10
    RB5 11
    RB6 12
    RB7 13
    RA0 17
    RA1 18
    RA2 1
    RA3 2
    RA4/T0CKI 3
    15 OSC2/CLKOUT
    4 MCLR
    U1
    PIC16F84A
    D1 D2
    D3
    D4
    D6
    D5
    D7
    S1
    S2
    pour la marche /arrêt et un bouton poussoir S2 pour jouer
     Une carte électronique à base d’un microcontrôleur
     Schéma structurel
     Description du fonctionnement :
    Ce circuit génère un nombre des LEDs allumées de 1 à 6 de manière aléatoire (comme
    un dé à 6 faces).
    Lorsqu’on met l’interrupteur S1 à 1, on aura une boucle qui incrémente le registre port
    B alimentant les 7 diodes LEDs donnant une valeur aléatoire (1-2-3-4-5-6-1-2 …)
    suivant une base de temps de 10s .
    Un appui sur le bouton poussoir S2 provoque une interruption (RB0/INT) : le contenu
    du registre port B reste à sont état pendant environ 2 secondes indiquant un nombre
    de 1 à 6 affiché par les diodes LEDs.
     Configuration du registre INTCON :
    INTCON
    GIE EEIE T0IE INTE RBIE T0IF INTF RBIF Valeur INTCON
    1 0 0 1 0 0 0 0 (90)16 Compléter puis saisir le programme ci-contre puis simuler et vérifier le
    fonctionnement :
    program D_electronique;
    Procedure interrupt;
    begin
    delay_ms(2000);
    intcon:=$90; //Mise à zéro du bit “INTF” du registre INTCON
    end;
    begin
    intcon:=$90; // Activation de l’interruption externe RB0/INT
    Trisb:=$ 01; // Configurer le port B en sortie sauf RB0 entrée
    Trisa:=$ FF ; // Configurer le port A en entrées
    portb:=0; // Initialiser le portB
    5-2 Interruption RB4 à RB7 :
    L’interruption est provoquée par un changement d’état sur au moins d’une des entrées
    RB4 à RB7
    du port B. Les broches (RB4 à RB7) configurées en entrées sont comparées
    while true do
    begin
    if porta.0=0 then portb:=%00000000 else
    begin
    portb:=%10000000; delay_us(10); //Allumer D7
    portb:=% 00100100; delay_us(10); // D2 et D5
    portb:=%10100100; delay_us(10);
    portb:=%00110110; delay_us(10);
    portb:=%10110110; delay_us(10);
    portb:=%01111110; delay_us(10);
    end;
    end;
    end.périodiquement à l’ancienne valeur mémorisée par la dernière lecture du port B pour
    gérer l’interruption.
    Lorsque le mécanisme de l’interruption RB4 à RB7 se déclenche le microcontrôleur
    verrouille le bit indicateur RBIF à 1, une opération de lecture sur le port B est
    nécessaire pour déverrouiller l’accès au bit RBIF afin de pouvoir le remettre à 0.
    ☺ Activité : Configurer le registre INTCON en vue d’activer l’interruption externe
    sur RB4 à RB7
    Activité N°2 (interruption avec RBI ) : Dé électronique
    Refaire le même exemple mais en utilisant l’interruption sur RB4 à RB7 « PIC
    16F876A »
    Le dé électronique est constitué :
     D’une platine comportant 7 diodes leds D1, D2, D3, D4, D5, D6 et D7.(PORTC)
     Un étage de commande comportant un interrupteur S0 pour la marche /arrêt et
    des boutons poussoirs S1, S2, S3 et S4 pour jouer.
     Compléter puis saisir le programme ci-contre puis simuler et vérifier le
    fonctionnement :
    program de_electronique_interruption_RBi;
    var etat:byte;
    Procedure interrupt;
    Begin
    INTCON
    GIE EEIE T0IE INTE RBIE T0IF INTF RBIF Valeur INTCON
    1 0 0 0 1 0 0 0 (88)16RS1
    R107
    1k
    1
    0 0 0 0
    ?
    ? ?
    ? ?
    ? ?
    INT / RBI
    S0
    S1 S2 S3 S4
    D1
    D6
    D5
    D7
    D2
    D3
    D4
    2 RA0/AN0
    3 RA1/AN1
    4 RA2/AN2/VREF-/CVREF
    6 RA4/T0CKI/C1OUT
    7 RA5/AN4/SS/C2OUT
    9 OSC1/CLKIN
    10 OSC2/CLKOUT
    RC1/T1OSI/CCP2 12
    RC2/CCP1 13
    RC3/SCK/SCL 14
    RB7/PGD 28
    RB6/PGC 27
    RB5 26
    RB4 25
    RB3/PGM 24
    RB2 23
    RB1 22
    RB0/INT 21
    RC7/RX/DT 18
    RC6/TX/CK 17
    RC5/SDO 16
    RC4/SDI/SDA 15
    5 RA3/AN3/VREF+
    RC0/T1OSO/T1CKI 11
    1 MCLR/Vpp/THV
    U1
    PIC16F876A
    etat:=PORTB; // lecture du portB pour déverrouiller
    l’accès au bit RBIF
    delay_ms(2000);
    intcon:=$88 ; //Mise à zéro du bit “INTF” du
    registre INTCON
    // ou intcon.rbif:=0 ; intcon.GIE:=1
    end;
    begin
    intcon:=$ 88 ; //Activation de l’interruption externe RBI
    Trisb:=$FF ; //Configurer le port B en entrées
    TRISC:=0; // Configurer le portC en sortie
    portc:=0; //Initialiser le portC
    while true do begin
    if portb.1=0 then portc:=%00000000 else
    begin
    portc:=%10000000; delay_us(10); // Allumer la led D7
    portc:=%00100100; delay_us(10); // Allumer la led D2 et D5
    portc:=% 10100100 ; delay_us(10); // Allumer la led D2 , D5 et D7
    portc:=% 00110110 ; delay_us(10); // Allumer la led D1 , D2 , D4 et D5
    portc:=%10110110; delay_us(10); // Allumer la led D1 , D2 , D4 , D5 et D7
    portc:=%01111110; delay_us(10); // Allumer la led D1, D2, D3, D4, D5 et D6
    end;end;
    end.
    Activité N° 3 (interruption avec RBI) : Coffre-fort électronique
    Ce coffre-fort électronique sert à protéger des objets de valeur du
    vol. Pour l’ouvrir l’utilisateur doit introduire une séquence de 6
    chiffres dans l’ordre via une roue codeuse par exemple : 5-4-7-10-
    9-12
    Un bouton poussoir situé permet d’initialiser la séquence d’ouverture à partir du premier
    chiffre du code.
    A chaque changement de la position de la roue, le microcontrôleur de la carte de
    commande du coffre enregistre les positions intermédiaires.
    Exemple : Pour le code 5-4-7-10-9-12 la séquence correcte qui permet d’ouvrir la porte
    du coffre après l’appui sur le bouton poussoir est :
    1- On souhaite lire les 4 bits fournis par la roue codeuse à chaque changement
    d’état.
    Quelle est la technique la plus adaptée qui permet de lire cet évènement quel que soit
    l’état du programme en cours d’exécution ?
    C’est l’interruption par le changement de l’un des états RB4, RB5,RB6 et RB7
    5  4  5  6  7  8  9  1 0  9  1 0  1 1  1 216 RA7/OSC1/CLKIN
    RB0/INT 6
    RB1/RX/DT 7
    RB2/TX/CK 8
    RB3/CCP1 9
    RB4 10
    RB5 11
    RB6/T1OSO/T1CKI 12
    RB7/T1OSI 13
    RA0/AN0 17
    RA1/AN1 18
    RA2/AN2/VREF 1
    RA3/AN3/CMP1 2
    RA4/T0CKI/CMP2 3
    15 RA6/OSC2/CLKOUT
    4 RA5/MCLR
    U1
    PIC16F628A
    BP 0
    ?
    C6
    SW1
    THUMBSWITCH-HEX
    PORTE
    Initialisation de la séquence
    2- Le microcontrôleur utilisé étant un PIC16F628A : donner la valeur du registre
    INTCON :
    BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
    G I E P E I E T O I E I N T E R B I E T O I F I N T F R B I F
    1 0 0 0 1 0 0 0
    3- Saisir le programme ci-contre puis simuler et vérifier le fonctionnement :
    program coffre_fort ;const
    code_acces:array[12]of byte=(5,4,5,6,7,8,9,10,9,10,11,12);
    var
    code_saisi:array[12]of byte;
    i,j:byte;
    etat:byte;
    RAZ:sbit at PORTA.0;
    porte:sbit at porta.1;
    ok:bit;
    Procedure interrupt;
    begin
    etat:= PORTB; // lecture du PORTB
    etat:=etat SHR 4 ; // Décalage à droite des 4 bits lus puisque la roue codeuse est
    branchée sur
    RB4,RB5,RB6 et RB7
    code_saisi[j]:=etat ; // la colonne j prend la valeur de cet etat
    j:=j+1; // on incrémente à chaque fois j pour remplir les douzes colonnes du tableau
    avec 12 chiffres
    if j>11 then j:=0;
    INTCON.RBIF:=0; //Remise à zéro de l’indicateur RBIF
    INTCON.GIE:=1; // Réactivation globale des interruptions
    end;
    begin
    CMCON :=$07; // PortA numérique
    j:=0;TRISA.1:=0; // La broche RA1 est une sortie
    porte:=0; // Initialisation de la variable porte à 0
    INTCON:=%10001000; // ACTIVATION DE L’INTERRUPTION AVEC RBI
    WHILE TRUE DO
    begin
    if RAZ =1 then
    begin
    code_saisi[0]:=portb shr 4 ; // Initialisation la séquence d’ouverture à partir du premier
    chiffre du code
    j:=1;
    end;
    ok:=1;
    for i:=0 to 11 do
    begin
    // test de la sequence saisies ; on teste les douzes numéros du code d’accée et les
    douzes numéros du code de saisi
    if code_saisi[i] <> code_acces[i] then ok:=0;
    end;
    if ok=1 then porte:=1 else porte:=0; // commande de la porte
    end;
    end.1 1 1 1 14 3 2 1 0 9 8 7 D D D DD D D D 7 65 4 3 2 1 0
    65 4 E R RWS
    1 V SS
    2 V DD
    3 V EE
    LCD2
    LM016L
    COMMANDE D’UN AFFICHEUR
    LCD
    Exemple : Afficheur LCD LM016L (16×2) 2 lignes
    16 colonnes
    L’afficheur LM016L possède :
     3 bornes d’alimentation (nommées VSS, VDD et VEE)
     3 entrées de contrôle (nommées RS, RW et E)
     8 entrées de données (nommées D0, D1, D2, D3, D4, D5, D6 et D7)
    Appelons N la valeur de l’octet de donnée D0 à D7
     VSS doit être reliée à la borne moins d’une alimentation de 5 V
     VDD doit être reliée à la borne plus d’une alimentation de 5 V
     VEE permet de modifier l’éclairage et le contraste de l’afficheur
     Si RS = 0 alors N est une instruction
     Si RS = 1 alors N est une donnée : N correspond au code ASCII du caractère à
    afficher
     Si RW =0 alors l’afficheur est en mode écriture (write)
     Si RW =1 alors l’afficheur est en mode lecture (read)
     E est l’entrée de validation activée à niveau haut
    Instructions spécifique au compilateur Mikropascal pro pour l’afficheur LCD
    Les variables suivantes doivent être définies dans tous les projets utilisant la
    bibliothèque d’affichage à cristaux liquides LCD:RS1
    R107
    1k
    CRY1
    4MHz
    C1
    15p
    C2
    15p
    2 RA0/AN0
    3 RA1/AN1
    4 RA2/AN2/VREF-/CVREF
    6 RA4/T0CKI/C1OUT
    7 RA5/AN4/SS/C2OUT
    8 RE0/AN5/RD
    9 RE1/AN6/WR
    10 RE2/AN7/CS
    13 OSC1/CLKIN
    14 OSC2/CLKOUT
    RC1/T1OSI/CCP2 16
    RC2/CCP1 17
    RC3/SCK/SCL 18
    RD0/PSP0 19
    RD1/PSP1 20
    RB7/PGD 40
    RB6/PGC 39
    RB5 38
    RB4 37
    RB3/PGM 36
    RB2 35
    RB1 34
    RB0/INT 33
    RD7/PSP7 30
    RD6/PSP6 29
    RD5/PSP5 28
    RD4/PSP4 27
    RD3/PSP3 22
    RD2/PSP2 21
    RC7/RX/DT 26
    RC6/TX/CK 25
    RC5/SDO 24
    RC4/SDI/SDA 23
    5 RA3/AN3/VREF+
    RC0/T1OSO/T1CKI 15
    1 MCLR/Vpp/THV
    U1
    PIC16F877A
    1 1 1 1 14 3 2 1 0 9 8 7 D D D D D D D D 7 6 5 4 3 2 1 0
    6 5 4 E R RWS
    1 V SS
    2 V DD
    3 V EE
    LCD1
    LM016L
    50%
    RV1
    10k
    // Connections du module LCD
    var LCD_RS : sbit at RB0_bit;
    var LCD_EN : sbit at RB1_bit;
    var LCD_D4 : sbit at RB2_bit;
    var LCD_D5 : sbit at RB3_bit;
    var LCD_D6 : sbit at RB4_bit;
    var LCD_D7 : sbit at RB5_bit;
    var LCD_RS_Direction : sbit at TRISB0_bit;
    var LCD_EN_Direction : sbit at TRISB1_bit;
    var LCD_D4_Direction : sbit at TRISB2_bit;
    var LCD_D5_Direction : sbit at TRISB3_bit;
    var LCD_D6_Direction : sbit at TRISB4_bit;
    var LCD_D7_Direction : sbit at TRISB5_bit;
    // FIN
    Lcd_Init () ; // Initialisation de l’LCD
    Lcd_Out(1, 2, ‘BRAVO’) ; // écrire BRAVO sur l’LCD à partir de la ligne 1 ,colonne 2
    Lcd_Chr(2, 3, i); // écrire la caractère équivalent en code ASCII i sur l’LCD à partir de
    la ligne 2 ,colonne 3
    Lcd_Cmd exemples :Lcd_Cmd(_LCD_CLEAR); // effacer l’LCD
    Lcd_Cmd(_LCD_CURSOR_OFF) ; // supprimer le curseur de L’LCD
    Activité N° 1 (LCD)
    Sur un afficheur LCD « LM016L » écrire :  4 Sc. TECNIQUE 4 sur la 1ère ligne et la
    1ère colonne
     2014- 2015 sur la 2ème ligne et l a
    4ème colonne
     # au 2ème ligne et 14ème colonne
    Compléter puis saisir le programme ci-contre puis simuler et vérifier le fonctionnement :
    program activite_LCD_1;
    // connections du module Lcd
    var LCD_RS : sbit at PORTB.0;
    var LCD_EN : sbit at PORTB.1;
    var LCD_D4 : sbit at PORTB.2 ;
    var LCD_D5 : sbit at PORTB.3;
    var LCD_D6 : sbit at PORTB.4;
    var LCD_D7 : sbit PORTB.5;
    var LCD_RS_Direction : sbit at TRISB.0;
    var LCD_EN_Direction : sbit at TRISB.1 ;
    var LCD_D4_Direction : sbit at TRISB.2 ;
    var LCD_D5_Direction : sbit at TRISB.3 ;var LCD_D6_Direction : sbit at TRISB.4;
    var LCD_D7_Direction : sbit at TRISB.5;
    begin
    LCD_init(); // initialisation de LCD
    LCD_CMD(_LCD_CURSOR_OFF); // supprimer le curseur de LCD
    while true do
    begin
    LCD_out(1,1,’4 sc.TECHNIQUE 4′); // 4 Sc. TECNIQUE 4 s’écrit à la 1ère ligne et
    la 1ère colonne
    LCD_out(2,4,’2014-2015′); // 2014-2015 s’écrit à la 2ème ligne et la 4ème colonne
    Lcd_chr(2,14 ,35); // écrire la caractère # au 2ème ligne et 14ème colonne ( 35 est le code
    ASCII de #)
    end;
    end.
    GESTION D’UN CLAVIER
    Le mikroPascal PRO pour PIC fournit une bibliothèque pour
    travailler avec des claviers « en bloc de touches 4×4 ». Les routines
    de bibliothèque peuvent également être employées avec le bloc de touches 4×1, 4×2, ou
    4×3.
    L’utilisation de ce clavier nécessite un port obligatoirement bidirectionnel 8 bits.
    Instructions spécifique au compilateur « Mikropascal pro » pour le ClavierVar keypadPort : byte at PORT… ; // Pour la connexion du clavier au PORT. ..
    considéré ( 8 bits)
    Var Kp :byte ; // on définit une variable de type octet
    Keypad _Init(); // Initialisation du clavier
    Kp:=Keypad_key_Press(); // lecture de code de la touche « touche enfoncée » de 1 à
    16.
    Kp:=Keypad_key_click(); // lecture de code de la touche « touche enfoncée puis
    libérée »de 1 à 16.
    Activité N°1 (Clavier)
    Saisir le programme suivant puis simuler le fonctionnement de chaque circuit et remplir
    les tableaux correspondants :
    program clavier_prefabrique;
    var keypadPort : byte at PORTB; // le clavier est relié au port B
    var kp : byte; // On déclare une variable kp de type octet
    begin
    trisa:=0; // Le portA est configuré en sortie
    porta:=0; // Initialisation du portA
    Keypad_Init(); // initialiser le portB pour communiquer avec le clavier
    while true do
    begin
    kp := Keypad_Key_Click();
    if kp <> 0 then porta:=kp;
    end;
    end.
    Touche Code en
    décimal
    1 1
    L1 R1 2 2
    1 2 3 4
    16 OSC1/CLKIN
    RB0/INT 6
    7
    RA0 17
    RA1 18
    RA2 1
    RA3 2
    RA4/T0CKI 3
    15 OSC2/CLKOUT
    4 MCLR
    U1
    ? ? ? ?
    lecture
    L1
    ?
    R9
    10k
    Circuit 1Touche Code en
    décimal
    1 1
    2 5
    3 9
    4 13
    5 2
    6 6
    7 10
    8 14
    9 3
    10 7
    11 11
    12 15
    13 4
    14 8
    15 12
    16 16
    L1 R1
    10k
    R2
    10k
    R3
    10k
    R4
    10k
    1 2 3 4
    5 6 7 8
    9 10 11 12
    13 14 15 16
    16 OSC1/CLKIN
    RB0/INT 6
    RB1 7
    RB2 8
    RB3 9
    RB4 10
    RB5 11
    RB6 12
    RB7 13
    RA0 17
    RA1 18
    RA2 1
    RA3 2
    RA4/T0CKI 3
    15 OSC2/CLKOUT
    4 MCLR
    U1
    PIC16F84A
    ? ? ? ?
    R5
    10k
    R6
    10k
    R7
    10k
    R8
    10k
    lecture
    L1
    L2
    L3
    L4
    Colonne1
    Colonne2
    Colonne3
    Colonne4
    On fait une balayage sur les colonnes et on lit sur les lignes
    Le balayage se fait avec RB4 RB5 RB6 RB7
    Lecture sur RB0 RB1 RB2 RB3 RB4
    ?
    R9
    10k
    Circuit 21 2 3
    4 5 6

8 9

7
ONC 0 +
A B C D
1 2 3 4
2 RA0/AN0
3 RA1/AN1
4 RA2/AN2/VREF-/CVREF
6 RA4/T0CKI/C1OUT
7 RA5/AN4/SS/C2OUT
9 OSC1/CLKIN
10 OSC2/CLKOUT
RC1/T1OSI/CCP2 12
RC2/CCP1 13
RC3/SCK/SCL 14
RB7/PGD 28
RB6/PGC 27
RB5 26
RB4 25
RB3/PGM 24
RB2 23
RB1 22
RB0/INT 21
RC7/RX/DT 18
RC6/TX/CK 17
RC5/SDO 16
RC4/SDI/SDA 15
5 RA3/AN3/VREF+
RC0/T1OSO/T1CKI 11
1 MCLR/Vpp/THV
U1
PIC16F876A
1 1 1 1 14 3 2 1 0 9 8 7 D D D D D D D D 7 6 5 4 3 2 1 0
6 5 4 E R RWS
1 V SS
2 V DD
3 V EE
LCD1
LM016L
Activité N°2 (Clavier)
Ecrire un programme qui permet d’afficher sur la première ligne et la première colonne
La touche est :
Et en 2éme ligne et 1ére colonne Touche : le code de la touche appuyé du clavier à la
colonne 10
program clavier_ex1;
var
while true do
begin
kp:=0;
while kp=0 do
begin
kp:=keypadkp:byte;
var keypadPORT:byte at PORTC;
var LCD_RS:sbit at RB2_bit;
var LCD_EN:sbit at RB3_bit;
var LCD_D4:sbit at RB4_bit;
var LCD_D5:sbit at RB5_bit;
var LCD_D6:sbit at RB6_bit;
var LCD_D7:sbit at RB7_bit;
var LCD_RS_direction:sbit at TRISB2_bit;
var LCD_EN_direction:sbit at TRISB3_bit;
var LCD_D4_direction:sbit at TRISB4_bit;
var LCD_D5_direction:sbit at TRISB5_bit;
var LCD_D6_direction:sbit at TRISB6_bit;
var LCD_D7_direction:sbit at TRISB7_bit;
begin
lcd_init();
Keypad_Init();
lcd_cmd(_lcd_clear);
lcd_cmd(_lcd_cursor_off);
lcd_out(1,1,’La touche est:’);
lcd_out(2,1,’Touche:’);16 RA7/OSC1/CLKIN
RB0/INT 6
RB1/RX/DT 7
RB2/TX/CK 8
RB3/CCP1 9
RB4 10
RB5 11
RB6/T1OSO/T1CKI 12
RB7/T1OSI 13
RA0/AN0 17
RA1/AN1 18
RA2/AN2/VREF 1
RA3/AN3/CMP1 2
RA4/T0CKI/CMP2 3
15 RA6/OSC2/CLKOUT
4 RA5/MCLR
U1
PIC16F628A
1 2 3
4 5 6
7 8 9
0 #
1 2 3
A B C D
R1
220R
R2
220R
LEDR
LEDV
R3
2k2
Q1
2N2222
RL1
5V
D3
1N4148
LS1
SOUNDER
KM1
R4
220R
? ? ? ?
R A0
R A1
R A2
R A3
Activité N° 3 (Clavier) « serrure codé »
Pour accéder à un immeuble, l’utilisateur doit saisir un mot de
passe
à l’aide d’un clavier matriciel 12 touches installé à l’entrée.
Si le mot de passe est correct, l’ouverture de la porte est assurée
par un relais qui doit rester alimenté avec le témoin vert pendant 2
secondes.
Si le mot de passe est incorrect, un témoin rouge s’allume
durant une seconde, la porte reste fermée et l’utilisateur doit
saisir à nouveau le mot de passe.
L’appui sur la touche * valide le mot de passe saisi, l’appui
sur la touche  permet d’initialiser le système pour un e
nouvelle lecture du code d’accès.
La serrure est munie d’un haut-parleur piézoélectrique
«Sounder» qui émet un bip sonore à chaque appui sur un e
touche du clavier.
Schéma du montage :1°) Saisir le programme ci-dessous et simuler le fonctionnement et déduire le rôle du
programme.
program serrure;
var keypadPort : byte at PORTB; // le clavier est relié au port B
var kp : byte; // kp est une variable de type octet
begin
trisa:=0; // Le portA est configuré en sortie
porta:=0; // Initialiser le port a
CMCON:=$07; // désactiver les comparateurs, porta numérique
Keypad_Init();// initialiser le clavier
while true do
begin
kp := Keypad_Key_Click(); // Lecture de code de la touche (1,,16). Si aucune clef n’est
cliquetée, renvoie 0
if kp <> 0 then porta:=kp;
end;
end.Le but de ce programme est de coder chaque touche
2°) Pour chaque touche appuyée, retrouver le code correspondant en décimal.
3°) Saisir le programme ci-dessous et simuler le fonctionnement :
program serrure2;
var keypadPort : byte at PORTB; // Clavier est relié au PORTB
var kp,a : byte ;
code_serrure : word;
begin
trisa:=0 ; // PORTA sortie
porta:=0 ; // Initialiser le PORTA
CMCON:=$07 ; // désactiver les comparateurs PORTA numérique
code_serrure :=0 ;
a:=0; // Initialiser les variables
kp:=0;
Keypad_Init(); // Initialiser le port pour travailler avec le clavier
sound_init(porta,3); // Initialiser le module « piezo-haut-parleur » qui est affecté à
la broche RA3
while true do // boucle infinie
begin
kp := Keypad_Key_Click(); // lecture du code de la touché
if kp <> 0 then // si une touche est enfoncée
begin
sound_play(1000,100); // produire un son de fréquence 1000hz qui dure 100ms
Touche 1 2 3 4 5 6 7 8 9 * 0 #
Code en décimal 1 2 3 5 6 7 9 10 11 13 14 15case kp of // selon la valeur de kp « selon la touche enfoncée » la variable a
reçoit…. :
1: a := 1 ;
2: a := 2 ;
3: a := 3 ;
5: a := 4 ;
6: a := 5 ;
7: a := 6 ;
9: a := 7 ;
10: a := 8 ;
11: a := 9 ;
13: a := ‘*’ ; // a reçoit le code ASCII du caractére *
14: a := 0 ;
15: a := ‘#’ ; // a reçoit le code ASCII du caractére #
end;
if a <> ‘*’ then code_serrure := code_serrure *10 + a ; // s’il n’ya pas d’action sur
la touche * alors :
if a = ‘#’ then code_serrure :=0; // si on actionne la touché # on initialise le
code à 0
if a = ‘*’ then // si on actionne la touche * on valide le code
begin
if code_serrure = 1978 then // si le code est correcte ici code=1978
alors
begin
porta.1:=1; // on allume le témoin verte
porta.2:=1; // on ouvre la porte
delay_ms(2000); // temporisation de 2 secondes
end
else // si non
begin
porta.0:=1; // on allume le témoin rougedelay_ms(1000); // temporisation de 1seconde
end;
code_serrure :=0; // initialiser le code à 0
end;
end;
porta:=0; // Initialiser le porta
end;
end.
4°) déduire à chaque fois la valeur de la variable code_serrure lorsque l’utilisateur
appuie sur les touches données dans le tableau suivant :
Touche appuyé Valeur en décimal de la variable
code_serrure= code_serrure *10 + a
Porte
ouverte
Témoin
rouge
Témoin
verte

0 non non non

4 0 + 4 = 4 non non non
7 410 + 7 = 47 non non non 8 4710+8 = 478 non non non
1 478*10 +1= 4781 non non non

  • Validation 4781  1978 après 1seconde 0 Non Oui (1s) non
    1 1 non non non
    9 19 non non non
    7 197 non non non
    8 1978 non non non
  • Validation 1978 =1978 après 2seconde 0 oui (2s) non oui (2s)

0 non non non

5 5 non non non
4 54 non non non

  • Validation 54  1978 après 1seconde 0 non Oui (1s) non5°) Quel est le code qui permet d’ouvrir la porte, justifier votre réponse en soulignant
    dans le programme précédent la ligne d’instruction qui teste ce code
    1978
    6°) Compiler le programme précédent et simuler le fonctionnement de la serrure codéeFONCTION CONVERSION :
    L’électronique peut se partager en deux grands chapitres : L’analogique et le numérique.
    En numérique, on raisonne sur des bits portant l’information sous forme d’états logique
    1 ou 0.
    En analogique, on raisonne sur des courants ou des tensions.
    Néanmoins, on est souvent amené à convertir une donnée analogique en donnée
    numérique afin de leur apporter un traitement numérique ou inversement.
    Exemple : Régulation de température par calculateur.
    Dans cette partie on s’intéresse à étudier le C.A.N avec certains microcontrôleurs
    SYSTEME
    PHYSIQUE
    Température
    T
    Capteur
    analogique
    Actionneur
    analogique
    C.A.N
    C.N.A
    CALCULATEUR
    Traitement
    Numérique
    u
    N
    N’
    u’
    Grandeur analogique  N Grandeur numérique
    #
    Symbole
    Tension ou NombreLes microcontrôleurs PIC 16F876 et 16F877 possédèrent un convertisseur analogique
    numérique sur 10 bits, ce dernier permet de convertir une tension analogique comprise
    entre Vref- et Vref+ en une valeur numérique comprise entre 0 et 1023.
    Pour exploiter ce convertisseur il est nécessaire de configurer certains registres dans le
    microcontrôleur,
    Dans notre cas on intéresse au registre ADCON1
    Registre ADCON1 :
    Bit 6, bit 5 et bit 4 : Bits non implantés.
    Bit 3,bit 2,bit 1 et bit 0 :PCFG3, PCFG2, PCFG1 et PCFG0 : bits de contrôle de la
    configuration des ports :
    Ces bits permettent de choisir le partage entre entrées analogiques et digitales sur les
    ports A et E .
    ADFM – – – PCFG3 PCFG2 PCFG1 PCFG0
    bit 7 bit 6 bit 3 bit 2 bit 1 bit 0Ils permettent également de choisir pour Vref+ entre Vdd et RA3 et pour Vref- entre Vss
    et RA2 selon le tableau suivant :
    A : entrée analogique D : entrée numérique VDD =VCC= 5V ; VSS =
    GND = 0 V
    Au reset ADCON1 = 00000000 : cela signifie que les 5 bits de port A et les 3 bits de
    Port E sont configurés en entrées analogiques.
    PIC 16F876
    Tensions
    De références
    4 bits PCFG
    PIC 16F877
    PORTE PORTA
    PCFG0 PCFG0 PCFG0 PCFG0 AN7/RE2 AN6/RE1 AN5/RE0 AN4/RA5 AN3/RA3 AN2/RA2 AN1/RA1 AN0/RA0 Vref+ Vref-
    0 0 0 0 A A A A A A A A VDD VSS
    0 0 0 1 A A A A Vref + A A A RA3 VSS
    0 0 1 0 D D D A A A A A VDD VSS
    0 0 1 1 D D D A Vref + A A A RA3 VSS
    0 1 0 0 D D D D A D A A VDD VSS
    0 1 0 1 D D D D Vref + D A A RA3 VSS
    0 1 1 X D D D D D D D D VDD VSS
    1 0 0 0 A A A A Vref + Vref – A A RA3 RA2
    1 0 0 1 D D A A A A A A VDD VSS
    1 0 1 0 D D A A Vref + A A A RA3 VSS
    1 0 1 1 D D A A Vref + Vref – A A RA3 RA2
    1 1 0 0 D D D A Vref + Vref – A A RA3 RA2
    1 1 0 1 D D D D Vref + Vref – A A RA3 RA2
    1 1 1 0 D D D D D D D A VDD VSS
    1 1 1 1 D D D D Vref + Vref – D A RA3 RA2Pour récupérer les 5 bits du port A et les trois bits du port E en tant que I/O
    numériques (digitales) il faut écrire la valeur ’0 6’ dans ADCON1
    N.B : On s’intéressera uniquement au cas où Vref- = VSS = 0 et Vref+=VDD = 5V cas
    des lignes coloriées en rose dans le tableau.
    Bit 7 : ADFM
    Le convertisseur C.A.N fournit un nombre binaire naturel de 10 bits (B9 B8 B7 B6 B5
    B4 B3 B2 B1 B0)
    Deux registres (2 X 8 bits) sont nécessaire pour stocker le résultat de la conversion. Ce
    sont les registres :
    ADRESH
    ADRESL
    Deux formats sont disponibles suivant la valeur du bit ADFM :
    ADFM =1 :le résultat de la conversion est justifié à droite :ADRESH ne contient que les
    2 MSB du résultat . Les 6 MSB de ce registre sont lus comme des « 0 »
    ADFM =0 :le résultat de la conversion est justifié à gauche :ADRESL ne contient que
    les 2 LSB du résultat . Les 6 LSB de ce registre sont lus comme des « 0 »
    0 0 0 0 0 0 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0
    ADRESH ADRESL
    10 bits du résultat
    B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 0 0 0 0 0 0
    ADRESH ADRESL
    10 bits du résultat2 RA0/AN0
    3 RA1/AN1
    4 RA2/AN2/VREF-/CVREF
    6 RA4/T0CKI/C1OUT
    7 RA5/AN4/SS/C2OUT
    9 OSC1/CLKIN
    10 OSC2/CLKOUT
    RC1/T1OSI/CCP2 12
    RC2/CCP1 13
    RC3/SCK/SCL 14
    RB7/PGD 28
    RB6/PGC 27
    RB5 26
    RB4 25
    RB3/PGM 24
    RB2 23
    RB1 22
    RB0/INT 21
    RC7/RX/DT 18
    RC6/TX/CK 17
    RC5/SDO 16
    RC4/SDI/SDA 15
    5 RA3/AN3/VREF+
    RC0/T1OSO/T1CKI 11
    1 MCLR/Vpp/THV
    U1
    PIC16F876A
    40%
    RV1
    1k
    C.A.N.
    ? ? ? ? ? ? ? ? ? ?
    +88.8
    Volts
    2 2 2 2 2 2
    9 8
    2 2 2 2
    7 6 5 4 3 2 1 0
    SORTIE NUMERIQUE
    ENTREE
    ANALOGIQUE
    Instructions spécifique au compilateur Mikropascal pro pour le module conversion
    ADC_Init() ; // Initialise le module convertisseur et le configurer avec les réglages
    suivants:
    Vref-=0 ;Vref+ = 5V , Utilisation de l’horloge interne pour la conversion.
    N : word // déclaration d’une variable de type word
    N := ADC_Get_Sample(1) // lecture de la valeur lue par le convertisseur sur le
    canal 1
    N := ADC_Read (2) // lecture après initialisation et démarrage de la conversion
    sur le canal 2
    Activité N°1 (conversion) :
    Convertir une tension comprise entre 0 et 5V fournit par un potentiomètre branché sur
    RA3, et afficher le résultat sous forme binaires avec des LEDs. (Justification à droite)
    Ue A.D.C N
    Canal 3
    Ue N
    5V 1023
    N=
    1023
    5
    Ue1°) Configurer les entrées /sorties :
    2°) Configurer le registre ADCON 1
    3°) Compléter puis saisir le programme ci-contre puis simuler et vérifie le
    fonctionnement :
    program activite_1_convertisseur;
    var N : word; // déclaration d’une variable N de type mot sur 16bits car le résultat de
    conversion est sur 10 bits
    begin
    ADCON1:=%10000000; // Configuration des entrées du portA comme entrées
    analogiques y compris RA3
    // Et justification des 10 bits à droite
    TRISA := $FF; // PORTA Entrées
    TRISB := 0; // PORTB Sorties
    TRISC := 0; // PORTC Sorties
    while true do
    begin
    N := ADC_Read(3); // lecture de la valeur lue par le convertisseur sur le canal 3
    1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    TRISA TRISB TRISC
    ADFM – – – PCFG3 PCFG2 PCFG1 PCFG0
    1 0 0 0 0 0 0 0PORTB:=ADRESL; PORTC:=ADRESH;
    end;
    end.
    N.B. Autre solution : PORTB := N; // Les 8 bits de plus faibles poids sont aux
    PORTB
    PORTC := N shr(8); // Afficher les 2 bits de fort poids sur
    RC0 et RC1
    LE MODULE MLI (PWM): PULSE WIDTH MODULATION
    La modulation de largeur d’impulsion M.L.I est une technique qui consiste à générer un
    signal à période constante mais à rapport cyclique variable. Cette technique est
    largement utilisée pour faire varier la vitesse des moteurs à courant continu.
    La variation de vitesse d’un moteur à courant continu par M.L.I consiste à alimenter ce
    moteur de façon discontinue avec un hacheur et faire varier la tension moyenne entre
    ses bornes.
    Le signal de commande du transistor est :
    Plusieurs microcontrôleurs possèdent des sorties capables de générer automatiquement
    des signaux M.L.I
    généralement appelées sortie PWM notées CCP1 et CCP2 (CCP : Capture Compare
    Pwm)
    M
    uD
    iD
    E iB u
    iC VCE
    I
    Commande
    T
    D
    Source de Hacheur
    tension
    Moteur
    T T
    ON
    t
    TON
    T
    t
    Le rapport cyclique  = …=
    Le rapport cyclique  = … =
    CCP1/RC2 et CCP2/RC1 RC1 et RC2 sont les sortiesInstructions spécifique au compilateur Mikropascal pro pour le module PWM
    PWMx_Init(1000) // Initialise le module PWM de la sortie CCPx à la fréquence
    1000Hz:
    PWMx_start() // Démarrage du module PWM et sortie du signal sur la broche CCPx
    PWMx_Set_duty(N) // Change le rapport cyclique  du signal sortant sur la broche
    CCPx avec
    N variant de 0 à 255
    PWMx_stop // Arrêter le module PWM de la sortie CCPx
    Activité N° 1 (MLI):
    MCLR/VPP
    RA0/AN0
    RA1/AN1
    RA2/AN2/VREF-/CVREF
    RA3/AN3/VREF+
    RA4/T0CKI/C1OUT
    RE0/ RD/AN5
    RA5/AN4/SS/C2OUT
    RE2/ CS/AN7
    RE1/ WR/AN6
    VDD
    VSS
    OSC1/CLKIN
    OSC2/CLKOUT
    RC0/T1OSO/T1CKI
    RC1/T1OSI/CCP2
    RC2/CCP1
    RD0/PSP0
    RC3/SCK/SCL
    RD1/PSP1
    1 2 3 4 5 6 7 8 9
    RB0/ INT
    VDD
    VSS
    RD4/PSP4
    RC7/RX/DT
    RC6/TX/CK
    RC5/SDO
    RD3/PSP3
    RC4/SDI/SDA
    RD2/PSP2
    RD5/PSP5
    RD6/PSP6
    RD7/PSP7
    RB1
    RB2
    RB3/ PGM
    RB4
    RB5
    RB6/ PGC
    RB7/ PGD
    PIC16F874A/877A
    255
    N
    α S
    2 RA0/AN0
    3 RA1/AN1
    4 RA2/AN2/VREF-/CVREF
    6 RA4/T0CKI/C1OUT
    7 RA5/AN4/SS/C2OUT
    9 OSC1/CLKIN
    10 OSC2/CLKOUT
    RC1/T1OSI/CCP2 12
    RC2/CCP1 13
    RC3/SCK/SCL 14
    RB7/PGD 28
    RB6/PGC 27
    RB5 26
    RB4 25
    RB3/PGM 24
    RB2 23
    RB1 22
    RB0/INT 21
    RC7/RX/DT 18
    RC6/TX/CK 17
    RC5/SDO 16
    RC4/SDI/SDA 15
    5 RA3/AN3/VREF+
    RC0/T1OSO/T1CKI 11
    1 MCLR/Vpp/THV
    U1
    PIC16F876A
    D1
    1N4148
    M1
    Q1
    2N2222
    R1
    2k2
    ACTIVITE N°1_MLI
    0 0 0 0
    M1(+)
    VALUE=24
    S
    Ecrire un programme qui permet de
    commander un moteur à courant
    continu avec 4 vitesses
    Sortie sur RC2 fréquence de MLI
    (1000Hz)
    program activite_1_MLI;
    begin
    TRISB:=$FF;
    PWM1_Init(1000);
    Entrées Rapport
    cyclique N
    PORTB =0  = 0 N = 0
    PORTB =1  = 0,25 N = 64
    PORTB =3  =0,5 N =127
    PORTB =7  =0,75 N =192
    PORTB =15  =1 N =255PWM1_Start;
    while true do
    begin
    if PORTB=0 then PWM1_Set_duty(0);
    if PORTB=1 then PWM1_Set_duty(64);
    if PORTB= 3 then PWM1_Set_duty(127);
    if PORTB= 7 then PWM1_Set_duty(192);
    if PORTB= 15 then PWM1_Set_duty(255);
    end;
    end.Activité N°2 (conversion et MLI):Ventilateur sur un
    concentrateur USB:
    Le système présenté est un concentrateur USB appelé en anglais
    « USB – HUB » muni d’un petit ventilateur de bureau. Le système est
    autoalimenté via l’alimentation 5V de l’USB d’un micro-ordinateur.
    L’hélice du ventilateur est entraînée en rotation par un moteur à courant continu de très
    faible puissance (5V, 200mW).
    L’utilisateur a la possibilité de varier la vitesse de rotation du ventilateur via un
    potentiomètre rotatif « RV1 » placé à l’avant du concentrateur USB.
    1°) Donner le rôle du transistor Q1 :
    Le rôle du transistor Q1 est le pilotage du moteur. C’est un commutateur électronique.
    2°) Quelle est la technique utilisée pour faire varier la vitesse du moteur M? Justifier
    le choix de la sortie RC2/CCP1 du microcontrôleur PIC16F876A :
    Schéma du montage:
    PIC16F876A
    2 RA0/AN0
    3 RA1/AN1
    RA2/AN2/VREF-/CVREF
    4
    RA4/T0CKI/C1OUT
    6
    RA5/AN4/SS/C2OUT
    7
    OSC1/CLKIN
    9
    OSC2/CLKOUT
    10
    RC1/T1OSI/CCP2
    12
    RC2/CCP1 13
    RC3/SCK/SCL
    14
    RB7/PGD
    28
    RB6/PGC
    27
    RB5
    26
    RB4
    25
    RB3/PGM
    24
    RB2
    23
    RB1
    22
    RB0/INT
    21
    RC7/RX/DT
    18
    RC6/TX/CK
    17
    RC5/SDO
    16
    RC4/SDI/SDA
    15
    RA3/AN3/VREF+
    5
    RC0/T1OSO/T1CKI
    11
    MCLR/Vpp/THV
    1
    U1
    50%
    RV1
    1k
    5V
    D1

1N4148

Q1
2N2222
R1
2k2
24V
MC’est la technique MLI ou en anglais PWM le microcontrôleur dispose de 2 sorties
PWM RC1 ou RC2
on utilise par exemple RC2.
3°) Quel est le type du signal présent sur l’entrée RA0/AN0? Justifier le choix de cette
entrée.
C’est un signal analogique variable de 0 à 5V. Il faut choisir alors une entrée analogique
(RA0/AN0)
4°) Déduire la valeur du registre ADCON1 :
5°) N étant le nombre lu par le module convertisseur CAN du microcontrôleur et
« K » étant le paramètre à passer à la fonction PWM1_set_duty(K), retrouver la relation
entre N et K
Lorsque V varie de 0V à 5V K varie de 0 à 255 (α est le rapport cyclique  = K/255)
varie de 0 à 1
N varie de 0 à 1023
Règle de trois :
6°) Compléter le programme suivant puis simuler et vérifier le fonctionnement.
program ventilateur;
var
ADFM – – – PCFG3 PCFG2 PCFG1 PCFG0
1 0 0 0 0 0 0 0
N K
1023 255
K = 255
1023
NK : byte;
N : word ;
begin
PWM1_init(250); // Initialiser le module PWM1 et choix de la fréquence de PWM1=
250 Hz
ADCON1:=$80; // Configuration des entrées du porta comme entrées analogiques y
compris RA0
PWM1_start; // démarrage du module PWM1
while true do // boucle infinie
begin
N:= adc_read(0); // lecture de la conversion
K := ; // calcul
PWM1_set_duty ( K ); // changement du rapport cyclique : le rapport cyclique  = K/
255
end;
end.
N 42éme méthode
program activite2_MLI_conversion_bis;
var
K : byte;
N : word ;
S1 :real ;
begin
PWM1_init(250); // Initialiser le module PWM1 et choix de la fréquence de PWM1=
250 Hz
ADCON1:=$80; // $8E Configuration des entrées du porta comme entrées analogiques
y compris RA0
PWM1_start; // activation du module PWM1
while true do // boucle infinie
begin
N:= adc_read(0); // lecture de la conversion
S1 := 255* N/1023; // calcul
K := byte(S1) ; // transformation du résultat de calcul en octet
PWM1_set_duty ( K ); // changement du rapport cyclique : le rapport cyclique  = K/
255
end;
end.Thanks for all

كلمة سر فك الضغط : books-world.net
The Unzip Password : books-world.net

تحميل

يجب عليك التسجيل في الموقع لكي تتمكن من التحميل

تسجيل | تسجيل الدخول