1-
L’architecture RISC
La
technologie RISC consiste à déplacer les complexités majeures du
hardware vers le software, ce qui est le contraire exact de la
technologie CISC (Complex Instruction Set Computer). Dans
l’architecture CISC les concepteurs ont misé sur la réduction du
nombre d’instructions nécessaires pour exécuter le programme, en
concevant des instructions très puissantes, ce qui a l’inconvénient
de devoir augmenter moyennement le nombre de cycles machine
nécessaires pour compléter une instruction. Dans ce cas, la
fréquence de travail du système est réduite car il faut introduire
une phase d’interprétation du code machine à travers des
microcodes. Par contre, dans l’architecture RISC, on mise beaucoup
sur la minimisation du nombre des cycles machine et l’on rend la
majeure partie des instructions exécutables en un seul cycle
d’horloge, ce qui permet d’augmenter la fréquence de travail du
système. Ceci est possible en éliminant la phase d’interprétation
grâce à la simplicité des instructions qui peuvent être décodées
et exécutées directement par une simple unité de contrôle câblée.
La simplification des unités de contrôle des machines de type RISC
est particulièrement avantageuse pour la réalisation de la CPU sur
un seul chip VLSI. L’économie d’espace obtenue permet, à zone
de silice égale, d’augmenter sensiblement le nombre de registres
internes et/ou d’intégrer directement sur le chip la mémoire
cache pour exploiter au maximum la vitesse du microprocesseur.
Malheureusement, la technologie RISC a aussi des défauts. En effet,
le nombre réduit d’instructions fait que le software résultant, à
fonctions à accomplir égales, occupe plus de mémoire que celui
d’une machine CISC, aussi bien statiquement que dynamiquement.
Toutes les machines RISC utilisent la technique du “pipelining”
pour augmenter leurs prestations en terme d’instructions exécutées
dans l’unité de temps.
La
famille AVR à 8 bits
Vous
trouverez dans les tableaux 1 et 2 la
liste des principales ressources internes de la famille des
microcontrôleurs AVR.
Tableau
1 : Mémoire et prestations.
Ce
qui différencie les divers microcontrôleurs est le nombre
d’instructions Assembleur disponibles, la quantité de mémoire
SRAM présente et surtout le nombre de lignes d’entrées/sorties
(E/S ou I/O pour Input/Output), ainsi que la présence ou l’absence
de périphériques tels que le UART, le timer,le convertisseur A/D,
etc. Par exemple le AT90S1200 est un microcontrôleurs qui possède
89 instructions Assembleur, 1 kilobyte de mémoire programme, 15
lignes de I/O, 64 bytes de EEPROM et 32 registres d’utilisation
générale. Ce qui unie la famille entière est l’architecture avec
laquelle ces microcontrôleurs sont réalisés, le jeu d’instruction
et les différentes méthodes de placement de la mémoire et des
registres.
Tableau
2 : Ressources internes.
L’architecture
se base, en particulier, sur le concept d’accès rapide aux
registres. Les registres, comme vous le savez, sont des zones de
mémoire utilisées pour communiquer avec les périphériques
disponibles à l’intérieur du microcontrôleur comme les
compteurs, les timers, les convertisseurs A/D et les ports d’I/O.
Certains registres peuvent être utilisés comme des pointeurs à
placement indirect à 16 bits pour communiquer avec de la mémoire :
ces registres à 16 bits sont appelés registres X, Y, Z. Une autre
caractéristique commune est le mode par lequel le microcontrôleur
exécute les instructions. On l’appelle instruction “pipelining”
(chaîne de montage). Le “pipelining” consiste à exécuter une
instruction et à aller chercher simultanément l’instruction
suivante.
Le
microcontrôleur ATMEL AT90S8515
Cette
brève introduction vous permet de comprendre qu’en apprenant la
structure de n’importe quel microcontrôleur AVR, vous serez
automatiquement en mesure de travailler avec la famille entière.
C’est la raison pour laquelle tout le cours est basé sur un seul
modèle de microcontrôleur. Le choix s’est porté logiquement vers
le type le plus courant, c’est-à-dire le AT90S8515 dont le schéma
synoptique est donné en figure
1.
Ce microcontrôleur, contenu dans un boîtier à 40 pattes, fournit
un jeu de 118 instructions Assembleur, 8 kbytes de mémoire
programme, 512 bytes de EEPROM, 512 bytes de SRAM et 32 lignes de
I/O. Le dispositif exécute de puissantes instructions en un seul
cycle d’horloge, il est capable de traiter 1 MIPS par MHz (ceci en
théorie). Parmi ses autres caractéristiques, signalons la présence
de 32 registres pour des opérations de I/O et 32 registres
d’utilisation générale, des interruptions internes ou externes,
un UART programmable par interconnexions sérielles, un watchdog
timer programmable avec oscillateur interne, un port sériel SPI,
deux états à basse consommation que vous pouvez sélectionner via
software et un timer/ counter. Les deux états de basse consommation
sont appelés respectivement “idle mode” et “power down mode”.
Le premier arrête le CPU mais permet à la SRAM, au timer/counter,
au port sériel SPI et aux systèmes d’interruption de continuer à
fonctionner, alors que dans le second mode, le contenu des registres
est sauvé et l’oscillateur est “gelé” ; toutes les autres
fonctions du chip sont désactivées jusqu’à ce que l’on
intervienne avec une interruption externe ou en effectuant un RESET
du CPU. Comme nous venons de le dire, le microcontrôleur AT90S8515
est disponible en version 40 broches (voir
figure 2).
Nous allons les décrire une par une.
Figure
1 : Schéma synoptique interne du microcontrôleur ATMEL AVR
AT90S8515.
La
description des broches
Figure
2 : Brochage du AT90S8515.
Vcc :
Patte d’alimentation positive (broche 40).
GND :
Masse d’alimentation (broche 20).
Port
A (PA7…PA0) :
C’est un port de I/O bidirectionnel. Toutes les pattes du port ont
des résistances internes de pull-up. Le buffer de sortie est en
mesure de fournir jusqu’à 20 mA de courant, suffisant pour piloter
un afficheur à Led. Les pattes sont en haute impédances quand une
condition de reset devient active, ou bien lorsque l’horloge n’est
pas active. Ce port est utilisé comme multiplexer d’entrée/
sortie pour les données et les adresses quand une SRAM externe est
reliée (broches 32 à 39).
Port
B (PB7…PB0) :
C’est un port de I/O bidirectionnel. Toutes les pattes du port ont
des résistances internes de pull-up. Le buffer de sortie est en
mesure de fournir jusqu’à 20 mA de courant. Les pattes du port
sont en haute impédance quand une condition de RESET devient active,
ou bien quand l’horloge n’est pas active (broches 1 à 8).
Port
C (PC7…PC0) :
C’est un port de I/O bidirectionnel. Toutes les pattes du port ont
des résistances internes de pull-up. Le buffer de sortie est en
mesure de fournir jusqu’à 20 mA de courant. Les broches sont en
haute impédance quand une condition de RESET devient active, ou bien
quand l’horloge n’est pas active. Lorsqu’on branche de la SRAM
externe, ce port est utilisé comme bus adresses en sortie vers la
SRAM (broches 21 à 28).
Port
D (PD7…PD0) :
C’est un port de I/O bidirectionnel. Toutes les pattes du port ont
des résistances internes de pull-up. Le buffer de sortie est en
mesure de fournir jusqu’à 20 mA de courant. Les broches sont en
haute impédance quand une condition de RESET devient active, ou bien
quand l’horloge n’est pas active (broches 10 à 17).
RESET (actif
bas) : La broche de RESET est une entrée. Elle est activée par un
niveau logique bas qui doit avoir une durée opportune.
Habituellement, le temps de RESET tourne autour de 50 ns. Des temps
plus courts n’assurent pas la génération du RESET (broche 9).
XTAL2 et XTAL1 :
Ce sont les broches auxquelles est connecté le quartz de 4 à 8 MHz.
En plus du quartz, deux condensateurs externes sont requis comme le
montre le schéma de lafigure
3 (broches
18 et 19). ICP : C’est une broche d’entrée pour la fonction de
“timer/ counter input capture”. (broche 31).
Figure
3 : Raccordement du quartz et des condensateurs
externes aux broches XTAL2 et XTAL1 du microcontrôleur.
externes aux broches XTAL2 et XTAL1 du microcontrôleur.
OC1B :
C’est une broche de sortie pour la fonction de “timer/counter1
compare B”. (broche 29).
ALE :
C’est l’abréviation de “Address Latch Enable” qui est
utilisé lorsque de la mémoire externe est connectée au
microcontrôleur. En fait, la broche génère une impulsion de
référence qui est utilisée pour commencer une liaison entre un
microcontrôleur et la mémoire (broche 30).
La
programmation “in-system”
Vous
pouvez noter que le microcontrôleur dispose d’une grande quantité
de mémoire programme. Dans notre cas, nous disposons de 8 kbytes de
mémoire Flash. Ce type de mémoire peut être programmé
“in-system”, c’est-à-dire que vous laissez le microcontrôleur
sur le circuit sur lequel il doit travailler et qu’avec une
connexion opportune au PC, vous le programmez selon vos propres
exigences. La programmation “in system” évite l’inconvénient
de devoir continuellement extraire le microcontrôleur de son support
pour l’insérer dans le programmateur. On évite également, de
cette façon, de l’endommager, en tordant par exemple une patte ou
en cassant carrément une pendant les manoeuvres continues
d’insertion et d’extraction du composant. Le seul inconvénient
est la nécessité de devoir réaliser une liaison entre le circuit
en conception et le PC.
Architecture
interne
Ce
microcontrôleur dispose d’une grande capacité de mémoire
programme : 8 kilobytes de mémoire Flash, en plus de laquelle nous
retrouvons les 32 registres pour utilisation générale qui vont de
l’adresse mémoire $0000 à $001F, les 64 registres d’I/O (on
utilise indifféremment I/O = Input/Output ou E/S = Entrées/Sorties)
qui vont de l’adresse $0020 à $005F, la mémoire SRAM interne (512
bytes) qui va de l’adresse $0060 à l’adresse $025F et, enfin,
nous avons de l’espace pour placer une mémoire SRAM externe pour
un total de 64 kilobytes (adresses de $0260 à $FFFF). Observons le
schéma synoptique interne de l’AT90S8515 (figure
4).
Au centre du schéma se trouve l’unité logique arithmétique l’ALU
(Aritmetic Logic Unit) qui forme avec le bloc des registres le coeur
du microcontrôleur. Le coeur communique, au moyen d’un bus de
données (Data Bus) de 8 bits, avec toutes les ressources
implémentées : tout d’abord avec les registres de contrôle qui,
vus apparemment comme une zone de mémoire particulière, forment en
réalité des interfaces entre le programme et les périphériques
implémentés. Puis nous trouvons l’unité d’interruptions
(Interrupt Unit) c’est-à-dire un dispositif qui s’occupe de
gérer et de trier les différentes interruptions que les
périphériques peuvent envoyer au CPU.
Figure
4 : Schéma synoptique du microcontrôleur AT90S8515.
Le
concept d’interruption Nous verrons plus tard que le CPU ne fait
que lire et exécuter séquentiellement, rigoureusement l’une après
l’autre, les instructions contenues dans la mémoire programme. En
pratique, le CPU lit le code opérateur “l’opcode” de la
première instruction en mémoire, l’interprète en le transformant
en une commande et l’exécute. Puis il répète le même processus
sur l’opcode disponible dans le byte suivant de la mémoire
programme et ainsi de suite. En réalité, cette séquentialité est
confiée au “Program Counter” qui, par définition, pointe
l’adresse du byte de mémoire programme qui contient l’opcode de
la prochaine instruction que le CPU doit exécuter. Une machine à
états ainsi élaborée ne permet cependant pas de gérer des
événements en temps réel. C’est la raison pour laquelle on a
inventé les interruptions. Les périphériques internes peuvent, sur
la base d’événements internes ou externes particuliers, générer
une interruption du cycle normal du programme. Dans la pratique, cela
consiste à forcer le “Program Counter” à pointer l’adresse
d’une zone de mémoire définie (vecteur d’interruption). Donc,
en activant, par exemple, l’interruption du périphérique UART,
nous obtiendrons, en correspondance avec la fin de la réception des
données, que le microcontrôleur aille exécuter l’instruction
contenue à l’adresse $009 (vecteur d’interruption de la
réception UART). Nous pouvons alors insérer une série
d’instructions consacrées à cet événement. Par exemple, nous
pouvons lire la valeur que l’UART a reçue et l’écrire dans une
variable. Ces opérations sont effectuées par une sous-routine
appelée “routine de réponse à l’interruption”. La routine
terminera avec une instruction qui fera l’opération opposée par
rapport à l’interruption : c’est-à-dire qui forcera le “Program
Counter” à pointer l’adresse contenant l’instruction suivante
la dernière exécutée avant l’interruption. L’AT90S8515 dispose
de 13 vecteurs d’interruption. Revenons maintenant au schéma
synoptique interne. Nous voyons que les autres périphériques
disponibles sont
- La “SPI Unit”, interface sérielle synchrone à 3 fils en mesure de travailler en mode “Master” (maître) ou “Slave” (esclave),
- Le “Serial UART” (Serial Universal Asynchronous Receiver and Transmitter),
- Un “Timer/ Counter” 8 bits et un “Timer/Counter” 16 bits, un “Watchdog Timer”,
- Un comparateur analogique et 32 lignes d’entrée/sortie avec lesquelles le dispositif échange les données en niveau TTL avec le monde extérieur.
Pour
communiquer avec les différents périphériques énumérés
ci-dessus, une série de registres, définis selon le tableau
3,
appelés “I/O Register” sont disponibles. Dans ce tableau, vous
trouverez la liste des adresses mémoire où ils sont disponibles et
les sigles mnémotechniques qui les identifient.
Le
plan mémoire
Comme
tous les microcontrôleurs, l’AT90S8515 dispose aussi de deux zones
de mémoire spécifique internes : la “Program Memory” et la
“Data Memory”. La “Program Memory” ou mémoire programme,
contient le programme c’està- dire l’opcode des instructions que
le CPU devra exécuter l’une après l’autre quand le
microcontrôleur sera alimenté. La mémoire programme est de type
Flash et peut être écrite et effacée plus de 1 000 fois. Sa
capacité est de 4 kilobytes x 16 et ses adresses vont de $000 à
$FFF. La “Data Memory” peut être décomposée en deux parties
significatives : l’une contient les données et l’autre est
destinée aux registres. Nous verrons que le déroulement d’un
programme requiert l’utilisation des constantes mais aussi des
variables. Le terme “variable” sert à indiquer tous les
paramètres numériques qui peuvent varier pendant l’exécution
d’un programme.
Figure
5a : L’illustration
montre que les adresses qui vont de $0000 à $001F
servent aux registres d’utilisation générale, alors que les adresses $0020 à $0005F contiennent les registres d’I/O.
De la position $0060 jusqu’à la $025F nous trouvons la SRAM interne du microcontrôleur,
alors que de l’adresse $0260 jusqu’à $FFFF nous avons l’espace utilisable pour ajouter au microcontrôleur de la mémoire SRAM externe.
servent aux registres d’utilisation générale, alors que les adresses $0020 à $0005F contiennent les registres d’I/O.
De la position $0060 jusqu’à la $025F nous trouvons la SRAM interne du microcontrôleur,
alors que de l’adresse $0260 jusqu’à $FFFF nous avons l’espace utilisable pour ajouter au microcontrôleur de la mémoire SRAM externe.
Notre
microcontrôleur dispose de 512 octets internes de mémoire (de
l’adresse $0060 à $025F) dans lesquelles il est possible de
mémoriser des variables. Observons le plan mémoire de données :
nous pouvons noter que les adresses $0260 à $FFFF sont prévues pour
une RAM externe. Ce qui veut dire que la structure hardware et les
ressources software du AT90S8515 permettent de brancher une mémoire
externe SRAM de 64 kilobytes (maximum). Les adresses $0000 à $005F
contiennent, quant à elles, les registres qui, comme nous l’avons
dit précédemment, sont des positions utilisées pour communiquer
avec les périphériques ou utiles au travail de l’ALU. Les
registres dont les adresses vont de $0000 à $0001F sont appelés
“General Purpose Working Register”. Ce sont les registres de
travail, ceux qui sont utilisés pour faire des opérations
mathématiques ou pour diriger le programme vers des adresses
déterminées. Nous étudierons ces registres lors de l’analyse du
jeu d’instructions. Nous vous rappelons, de toute façon, que sur
les 32 registres d’utilisation générale, 6 peuvent être utilisés
comme pointeurs d’adressage indirect à 16 bits pour travailler
avec la mémoire. Ces registres de 16 bits sont appelés registres X,
Y et Z. A chaque registre est associée une adresse unique, ce qui a
permis de faire le plan mémoire de l’adresse $00 à l’adresse
$1F en distinguant les 32 adresses à utiliser.
Figure
5b : A
chaque registre est associée une adresse unique. On a ainsi fait
le plan mémoire de l’adresse $00 à l’adresse $1F en distinguant 32 positions à utiliser comme espace de données. Les registres qui vont de l’adresse $1A à l’adresse $1F peuvent être associés deux par deux pour obtenir des registres de 16 bits, nommés registres X, Y et Z.
le plan mémoire de l’adresse $00 à l’adresse $1F en distinguant 32 positions à utiliser comme espace de données. Les registres qui vont de l’adresse $1A à l’adresse $1F peuvent être associés deux par deux pour obtenir des registres de 16 bits, nommés registres X, Y et Z.
L’ALU
à hautes prestations de l’AVR communique avec les 32 registres
d’utilisation générale, et est en mesure d’exécuter, en un
seul cycle d’horloge, des opérations entre les deux registres. Les
adresses de $0020 à $005F contiennent, par contre, les registres
d’I/O (voir
le tableau 3).
Il s’agit de 64 adresses à travers lesquelles il est possible de
donner des ordres, ou encore d’envoyer des commandes aux différents
périphériques et de les recevoir. Nous décrirons mieux chaque
registre d’I/O lors de l’analyse du périphérique auquel ils
sont destinés. Limitons-nous, pour l’instant, à dire que les
adresse d’I/O, ou encore la partie de mémoire qui contient les
registres d’I/O, sont accessibles à travers les instructions de
“IN” et de “OUT” qui transfèrent les données entre les 32
registres d’utilisation générale et l’espace d’I/O.
La
mémoire EEPROM
La
SRAM interne n’est pas la seule zone possible pour la mémorisation
des données. En effet 512 autres octets, dans lesquels vous pouvez
écrire ou lire des données, sont implémentés. Il s’agit de la
mémoire EEPROM. Cette zone de mémoire peut être considérée comme
une RAM à la différence près que les données insérées sont
conservées, même en l’absence d’alimentation. Pour écrire ou
lire des données en EEPROM, il est cependant nécessaire d’utiliser
trois registres spécifiques. Cette mémoire permet un maximum de 100
000 cycles d’écriture/lecture.
Tableau
3 : Pour communiquer avec les différents périphériques, une série
de registres, appelés “I/O Register”, sont
disponibles. Dans ce tableau son listées les adresses mémoire où ils sont disponibles et les sigles mnémotechniques qui les identifient.
disponibles. Dans ce tableau son listées les adresses mémoire où ils sont disponibles et les sigles mnémotechniques qui les identifient.
Le
registre d’état
Ce
registre sert à contrôler si des événements particuliers, dus à
l’exécution de certaines instructions, comme les instructions
logiques ou mathématiques, se vérifient. Chaque bit de ce registre
a une fonction particulière.
I
|
T
|
H
|
S
|
V
|
N
|
Z
|
C
|
- Bit 7 – I – Global Interrupt Enable Ce bit est mis à la valeur logique haute (c’est-à-dire 1) pour activer l’utilisation des interruptions. Ce bit est mis à la valeur logique basse (c’est-à-dire 0) après une demande d’interruption. Il est remis à 1 par l’instruction RETI au retour d’une routine d’interruption.
- Bit 6 – T – Bit Copy Storage Les instructions de copie des bits (BLD, bit lu et BST, bit emmagasiné) utilisent le bit T comme source et destination dans les opérations effectuées sur chaque bit d’un registre. Un bit d’un registre peut être copié dans le bit T par l’instruction BST alors que le bit T peut être copié dans un autre registre à travers l’instruction BLD.
- Bit 5 – H – Half Carry Flag Ce bit indique qu’une opération arithmétique a généré une retenue ou un dépassement.
- Bit 4 – S – Sign Bit Le bit S est donné par un OR exclusif entre le flag négatif N et celui complémenté à 2 du flag V. Il indique le signe de la donnée après avoir exécuté une opération arithmétique.
- Bit 3 – V – Overflow flag Ce bit contient le résultat d’overflow et est en complément à deux. Traduit littéralement, overflow veut dire débordement. C’est une condition dans laquelle une opération arithmétique fournit un résultat de grandeur supérieure au maximum qu’un registre ou une position de mémoire peut contenir.
- Bit 2 – N – Negative flag
- Bit 1 – Z – Zero flag
- Bit 0 – C – Carry flag Ces trois bits indiquent, respectivement, au terme d’une opération mathématique ou logique, si le résultat est négatif, si le résultat est égal à 0, si l’opération a donné lieu, en plus du résultat, à une retenue. Le registre d’état (Status Register) n’est pas automatiquement sauvegardé lorsque l’on appelle une routine d’interruption.
chapitre
3
Le
microcontrôleur AT90S8515 dispose de quatre ports d’I/O
(Input/Output) de 8 bits appelés port A, port B, port C et port D.
Ces ports d’entrées/sorties permettent au microcontrôleur de
communiquer avec le monde extérieur. Par exemple, si vous voulez
connecter un convertisseur A/D (Analogique/Digital), il faudra que le
micro dispose de quelques broches afin que vous puissiez effectuer le
branchement au dispositif à commander.
Chacun
de ces ports d’I/O est constitué de 8 bits chacun et certains sont
“programmables”. Ce terme signifie que des broches particulières
du port peuvent être utilisées dans des buts spécifiques. Le port
B, par exemple, dispose d’une interface sérielle (SPI) à quatre
fils. Si le microcontrôleur est programmé de façon correcte, la
logique interne s’occupera d’utiliser les broches en question du
port d’I/O pour exécuter une interconnexion sérielle à quatre
fils avec un autre périphérique qui utilise le même protocole de
communication. Les quatre bits restants du port d’I/O peuvent être
utilisés dans n’importe quel autre but. Chaque port d’I/O est
piloté à travers l’utilisation de trois registres qui sont
appelés “Data Register”, “Data Direction Register” et “Input
Pins Address”. Pour utiliser le port A, comme pour les autres,
trois adresses de mémoire d’I/O sont assignées, une pour chaque
registre. On donne un nom mnémotechniqueà chacune de ces adresses.
Le registre des données est appelé “PORTA” (adresse
hexadécimale 3BH), le registre qui indique la direction de la
donnée, In (entrée) ou Out (sortie), est appelé “DDRA”
(adresse 3AH), et le registre “Input Pins Address” est appelé
“PINA” (adresse 39H). Ces noms (“PORTA”, “DDRA” et
“PINA”) sont utilisés lorsque l’on programme en assembleur. En
effet, si l’on veut écrire dans le registre “DDRA”, il suffira
d’utiliser les instructions :
LDI
r16, 0xff
OUT
DDRA, r16
Elles
donnent au registre “r16” la valeur hexadécimale “FF” et le
transfèrent dans le registre “DDRA”. De cette façon, le port A
a été sélectionné comme port de sortie. En résumé, le registre
“PORTA” sert à envoyer en sortie des données, le registre
“PINA” sert à les acquérir alors que le registre “DDRA”
sert à indiquer la direction de la donnée, ou mieux, la direction
que peut prendre chaque bit du port. Vous trouverez le schéma
électrique d’une broche du port A en figure
6.
Figure
6 : Schéma électrique d’une broche du port A.
En
ce qui concerne le port B, le nombre de registres est le même mais
leur emplacement à l’intérieur de la mémoire d’I/O change
(voir
tableau 4).
Les registres se programment en assembleur de la même façon que le
port A à la différence près que certains bits peuvent être
utilisés dans des buts particuliers. Le
tableau 5 montre
bien les fonctions que l’on peut assigner au port B dont nous avons
parlé précédemment.
Tableau
4 : Adresses hexadécimales des ports d’I/O.
Tableau
5 : Port B.
Notez
que, dans ce cas, le schéma de chaque bit du port est différent, ce
qui veut dire que le schéma de circuit pour la broche PB0 du port B
sera différent du schéma de circuit de la broche PB1 et ainsi de
suite en raison, justement, des caractéristiques différentes de
chaque broche. Pour se rendre compte de cela, il suffit de consulter
la note technique. Le port C est identique au port A, alors que le
port D a, lui aussi, des broches programmables dans des buts
particuliers liés à l’utilisation de l’UART, de la mémoire et
des interruptions externes (tableau
6).
Tableau
6 : Port D.
Tableau
7 : Configuration
du prédiviseur avec le compteur 8 bits.
du prédiviseur avec le compteur 8 bits.
Les
compteurs A l’intérieur du microcontrôleur AT90S8515 se trouvent
deux compteurs intégrés, l’un de 8 bits et l’autre de 16 bits.
En réalité, la logique permet de les configurer soit en compteur
soit en temporisateur. Cela veut dire que, si le composant est
configuré comme compteur, il est alors en mesure d’accepter des
impulsions externes et d’interrompre le programme principal après
un certain nombre d’impulsions établies par le programmeur (en
pratique, s’il y a eu une demande d’interruption du compteur). Ou
bien, il peut être utilisé comme temporisateur et est donc en
mesure de compter des impulsions d’horloge du système et de donner
un signal d’interruption après un nombre prédéterminé
d’impulsions d’horloge. Chaque compteur peut bénéficier d’une
logique interne qui sert de “PRESCALER”, c’est-à-dire de
diviseur de fréquence. Le circuit se présente comme le montre le
schéma synoptique des compteurs 8 et 16 bits de la figure
7.
Figure
7 : Schéma synoptique des compteurs 8 et 16 bits.
Dans
le circuit, on remarque le “prescaler” et deux multiplexeurs
nécessaires pour apporter le signal, soit au compteur 8 bits (TCK0),
soit au compteur 16 bits (TCK1). Les deux multiplexeurs sont
programmables en utilisant les trois bits CS00, CS01 et CS02. Le
tableau 7 montre
la correspondance entre les valeurs logiques des trois bits et le
type de signal appliqué au compteur. On peut sélectionner l’horloge
interne en exécutant ou non le prescaler, ou bien un signal externe
présent sur la broche “T0”. Sur le signal “T0”, on peut
choisir d’être actif sur le front montant ou bien sur le front
descendant du signal. Le
tableau 7 est
valable pour le compteur 8 bits.
Figure
8 : Schéma du circuit du compteur 8 bits.
Pour
le compteur 16 bits, c’est la même chose, seules changent les
broches de sélection (CS00, CS01 et CS02 deviennent CS10, CS11 et
CS12). Ces bits de sélection sont mémorisés par le programmeur à
l’intérieur d’un registre 8 bits dont on utilise seulement les
trois bits de poids faibles. Ce registre s’appelle “TCCR0”.
Vous noterez que le compteur de 8 bits est un “upcounter” et que
la valeur de comptage est mémorisée dans le registre “TCNT0”.
L’analyse du schéma du circuit du compteur (figure
8)
montre les deux registres de 8 bits “TIMSK” et “TIFR”. Ces
registres servent à gérer les événements d’interruption du
compteur. En ce qui concerne le compteur 8 bits, on utilise le bit 1
du registre “TIMSK”. Lorsque celui-ci est au niveau logique haut,
avec le bit 1 du “Status Register”, l’interruption de
débordement (overflow) du compteur a été activée et, par
conséquent, s’il y a débordement de la part du compteur, la
routine correspondante (qui se trouvera à l’adresse 007H) sera
exécutée. Du registre “TIFR”, on utilise le bit 1. Celui-ci va
au niveau logique haut quand un overflow se produit et est remis à 0
par le hardware dès que la routine correspondantà la demande
d’interruption a été exécutée. Le compteur 16 bits est, par
contre, plus complexe que le précédent et il permet par conséquent
de réaliser plus de fonctions. L’une d’entre elles est la
modulation PWM (Pulse Width Modulation), et peut être réalisée à
8, 9 ou à 10 bits. Comme le compteur 16 bits est de type “up/down”
et peut donc aussi bien compter que décompter, vous pouvez générer
un signal triangulaire (voir
la figure 9),
obtenu en faisant monter le compteur jusqu’à sa valeur maximale,
et toujours à intervalles de temps constants, le faire décompter
jusqu’à ce qu’il arrive à zéro pour, ensuite, recommencer
l’incrémentation. Cette caractéristique est utilisée pour
générer la modulation PWM, qui consiste à changer le rapport
cyclique (Duty Cycle) d’un signal carré sur la base d’un signal
modulant représenté par la valeur de comparaison (Compare Value).
Pour en comprendre le fonctionnement, revoyez la
figure 9 .
A chaque fois que le signal triangulaire se trouve sous la valeur de
référence (la ligne en pointillés) un changement de front est
généré sur le signal “OC1X”. La forme d’onde triangulaire
représente donc la marche dans le temps du compteur. Il est donc
clair qu’en changeant la valeur du seuil, vous pourrez changer la
durée de l’impulsion en sortie et, donc, en continuant à faire
varier le seuil, vous générez une forme d’onde PWM. Le seuil doit
être modifié avant qu’il ne rencontre le signal triangulaire
(voir la figure 4) sous peine de générer un “Glitch” qui
représente un dérangement non désiré.
Figure
9 : Modulation PWM réalisée avec le compteur 16 bits.
Le
watchdog
Le
watchdog est un temporisateur particulier qui est utilisé dans les
systèmes à microprocesseur comme sécurité pour éviter que le
programme n’aille dans une impasse et donc que le système ne se
bloque dans une situation non prévue par le programmeur. En
pratique, le watchdog intervient et effectue le reset du
microcontrôleur si celui-ci n’est pas effectué par l’instruction
“WDR” (WatchDog Reset) dans le temps établi par les broches 0, 1
et 2 du registre “WDTCR”. Le watchdog des microcontrôleurs AVR
est temporisé par une horloge interne à 1 MHz, ce qui nous permet
de comprendre qu’il peut fonctionner également en l’absence de
l’horloge du système car il est indépendant de celui-ci. Le
dispositif est programmé à travers le registre “WDTCR” grâce à
l’utilisation des cinq premiers bits. Essayons maintenant d’en
comprendre le fonctionnement en les analysant de façon détaillée.
Les
bits 0, 1, et 2, comme nous l’avons déjà remarqué, servent à
établir le temps qui doit s’écouler avant que le watchdog
effectue le reset du micro. Ce temps dépend également de
l’alimentation du micro et peut varier d’environ 15 ms (WDP0 = 0,
WDP1 = 0, WDP2 = 0 et alimentation Vcc = 5 V) jusqu’à environ 6 s
(WDP0 = 1, WDP1 = 1, WDP2 = 1 et alimentation Vcc = 3 V). Le bit 4
(WDTOE = Watch Dog Turn Off Enable) et le bit 5 (WDE) servent à
désactiver la fonction de watchdog. Etant donné qu’il s’agit
d’un système de sécurité, il serait trop risqué d’utiliser un
seul bit de validation/inhibition vu que l’on ne peut pas savoir
comment se comporte un programme en cas de dysfonctionnement. Donc,
pour éviter des inhibitions involontaires, il est nécessaire de
suivre une séquence précise de désactivation du watchdog. Il faut
d’abord mettre au 1 logique aussi bien “WDTOE” que “WDE”
et, ensuite, pour les quatre cycles d’horloge suivants, effectuer
le reset de “WDE”. De cette façon le watchdog est désactivé.
Le schéma du Watchdog (figure
10)
met en évidence l’oscillateur indépendant de 1 MHz, un
“prescaler” et un multiplexeur. Les trois bits de contrôle vont
justement agir sur le multiplexeur pour sélectionner les
temporisations pour le reset.
Figure
10 : Schéma du circuit du watchdog et tableau du prescaler
correspondant.
0 commentaires:
Enregistrer un commentaire