Vous êtes sur la page 1sur 65

Universit Joseph Fourier

Polytech Grenoble

Filire Informatique Industrielle et Instrumentation

1re Anne

Cours de
Microcontrleurs

Bas sur lutilisation du HCS12 (Motorola)

Christophe Durand
Anne universitaire 2009-2010
2
Document crit par JP Perrin.
Merci pour sa contribution.

3
PRAMBULE

Objectifs pistmologiques

Le but de cet enseignement est de vous familiariser avec le fonctionnement et lutilisation des
microcontrleurs, qui sont devenus aujourdhui des composants lectroniques cl et
incontournables pour tous systmes automatiss. Cet enseignement est compos de cours
thoriques (9 sances), de sances de travaux dirigs (10 sances) et de travaux pratiques (8
scances). En fin danne, la ralisation dun systme embarqu rpartie sur 7 sances
vous permettra de mettre en uvre et dapprofondir vos connaissances la fois en
microcontrleurs et en lectronique. Ce sera aussi loccasion de vous mettre en situation de
projet , situation comparable votre futur mtier dingnieur, o vous devrez faire preuve
dorganisation, de travail en quipe, de crativit et de professionnalisme.

A lissu de cet enseignement, vous serez capable de :


- Connatre le fonctionnement logiciel et matriel dun microcontrleur,
- De programmer un microcontrleur partir de diffrents niveaux de langage
pour quil ralise une succession dtapes logiques et complexes,
- Dintgrer un microcontrleur dans des applications spcifiques.

Support et plan du cours

Les microcontrleurs sont des composants intgrs qui contiennent dans un mme botier un
microprocesseur, de la mmoire, et des priphriques courants, tels que timer, liaison srie
asynchrone, liaison srie synchrone, ports dentre sortie logiques, contrleur de bus CAN,
convertisseur analogique numrique, etc. Il en existe de nombreuses versions, qui diffrent
suivant les priphriques installs. Nous avons choisi comme support du cours le
microcontrleur Motorola MC9S12DP256B, construit autour dun microprocesseur HCS12.
Lensemble est mont sur une carte de dveloppement (appele HCS12 T-Board) qui peut
communiquer avec un PC de diffrentes faons. Motorola propose plusieurs microcontrleurs
autour du mme microprocesseur comme les marques automobiles proposent plusieurs
options de carrosserie autour du mme moteur. Le modle choisi est plutt haut de gamme et
comporte un grand choix de priphriques internes.

Dans une premire partie, on sintressera principalement aux aspects logiciels du


microcontrleur HCS12 (registres, programmation squentielle, ruptures de squence).
Dans une seconde partie, on passera aux aspects matriels de la communication avec les
priphriques internes ou non (bus dadresse et de donnes, timing des changes).
Dans une troisime partie, on tudiera certains contrleurs de priphriques (pas tous, il y en a
trop !) et on utilisera cette programmation pour piloter ces contrleurs.

Nous travaillerons essentiellement en langage dassemblage (assembleur), le but tant de


comprendre comment sy prend un microcontrleur pour raliser des instructions structures.

4
5
COURS n1

Du microprocesseur au microcontrleur

Comparaison anthropomorphique : Le cerveau sapparente-t-il un microprocesseur ?


Voir prsentation

Un microprocesseur muni de mmoire peut tre, dans une premire approche, considr
comme un cerveau capable deffectuer des oprations diverses (oprations arithmtiques,
logiques) et de les enchaner dans un processus cohrent. Tel quel, un microprocesseur (on
parle aussi du CPU : Central Processing Unit) na aucune utilit puisquil ne peut
communiquer avec le milieu extrieur. Pour pouvoir tre efficace, un microprocesseur doit
disposer dorganes dentre-sortie (clavier, souris, cran, haut-parleur), comme le cerveau qui
dispose dorganes dentre (oreilles, yeux, toucher) et de sortie (paroles, gestes). Nous
appelons micro ordinateur cette structure micro processeur + priphriques + liens.

contrl mmoire
de masse

contrl.clavier contrl.cran

contrl.souris contrl.son
CPU
capt.logique entre logique sortie logique act. logique

capt.analog conv. ana/num conv. num/ana act.analog

Du microprocesseur au microcontrleur

La partie principale dun micro-ordinateur est la carte mre sur laquelle sont monts le
microprocesseur, les contrleurs de priphriques et les lignes qui les connectent entre eux
sous forme de circuit imprim. Avec les progrs de la miniaturisation, et la gnralisation de
lutilisation des ordinateurs, les besoins les plus courants se sont standardiss et on a pu
disposer toute une carte mre au sein dune seule et mme puce, appele microcontrleur.
Lusage de microcontrleurs est actuellement en plein dveloppement dans toute
linformatique industrielle, et tous les degrs de complexit (de 8 pattes prs de 200
pattes).

6
Un systme informatique complet regroupe autour d'un microcontrleur un ensemble de
composants qui lui permettent de fonctionner (essentiellement mmoires) et de communiquer
avec le milieu extrieur (contrleurs de priphriques). Le fonctionnement du processeur
consiste excuter un programme, c'est dire une suite d'instructions pointes par le
compteur ordinal (pointeur de programme).

Logiciellement, les composants extrieurs au processeur sont vus comme des adresses avec
lesquelles il communique par des oprations d'criture (processeur composant) ou de
lecture (composant processeur). L'excution du programme comporte les phases suivantes :
- Lire en mmoire l'octet dont l'adresse est contenue dans le compteur ordinal,
- Analyser l'octet pour trouver le nombre d'octets qui compltent l'instruction,
- Incrmenter le compteur ordinal et lire ces octets,
- Interprter le code et excuter l'instruction, qui peut ou non comporter une lecture et
une criture une adresse.
Il y a donc sans cesse communication entre le processeur et les composants priphriques.

Physiquement, le processeur utilise pour cette communication :


- Le bus de donnes, qui vhicule l'information (sous forme de mots dans le HC12),
- Le bus d'adresses, qui permet, aprs dcodage, d'activer le chip select appropri,
- Des lignes de contrle qui permettent d'assurer les changes d'information selon des
protocoles temporels prcis (chronogrammes) spcifiques au microcontrleur. Les lignes
principales sont la ligne R/ W qui indique le sens de transfert des donnes, et la ligne E,
horloge interne du processeur, qui cadence toutes les oprations.

La conception d'un systme complet se dcompose schmatiquement en plusieurs phases :


- Choix de composants compatibles avec le processeur (signaux et chronogrammes).
Les fabricants de processeurs proposent en gnral une famille de composants priphriques
directement adaptables leur processeur. Si on choisit ailleurs, il n'est pas rare d'avoir besoin
d'une mise en forme des signaux pour avoir des changes corrects.
- Choix de la carte mmoire du systme. Il s'agit d'attribuer une adresse ou une zone
d'adresses chaque composant, et de raliser les dcodages d'adresse correspondants.
- Ralisation matrielle du systme : implantation des divers composants, des alims,
des logiques de dcodage et des bus sur un support matriel (routage).
- Mise au point des liaisons matrielles pour un fonctionnement correct de la carte.

Ces oprations reprsentent un investissement lourd en temps et en matire grise. En outre, on


constate que les systmes se ressemblent et utilisent les mmes types de composants :
- De la mmoire ROM et RAM au moins pour implanter le programme de gestion et
tenir jour ses variables et ses donnes.
- Un moyen de communication logiciel avec l'extrieur en entre et en sortie (transfert
de donnes, tlchargement de programmes ou de paramtres de gestion), trs souvent liaison
srie asynchrone ou synchrone.
- Les autres priphriques varient suivant la tche excuter, mais on retrouve trs
souvent des entres et sorties logiques, des entres et sorties analogiques et une gestion du
temps (timer et horloge temps rel).

7
Il est donc naturel qu'on ait cherch conomiser du temps de mise au point en ralisant des
cartes standard rpondant des demandes standard elles aussi. Il existe depuis longtemps dj
dans les catalogues une grande varit de cartes d'entres-sorties adaptables une grande
varit de matriels avec une grande varit de destinations et de performances.

Les progrs de l'intgration des circuits permettent actuellement de raliser toute une carte de
dveloppement sur un seul composant. Cette ide est l'origine de tous les microcontrleurs.

Notions de microcontrleur

Le principe de base des microcontrleurs repose sur linclusion dans le mme botier du
microprocesseur et de divers priphriques, de manire avoir un composant autonome. Les
bus de donnes et dadresses sont internes au composant, ainsi que les dcodages dadresse
relatifs chaque priphrique interne . Les registres de contrle des priphriques sont
regroups dans la zone dadresse registres du microcontrleur . On trouve galement dans
cette zone divers registres de personnalisation du microcontrleur. Les pattes du composant se
rduisent alors essentiellement des lignes dentre-sortie tant logiques quanalogiques.

L'tude d'un tel composant est beaucoup plus longue et donc beaucoup plus coteuse que celle
d'une carte. Pour tre rentable, le produit doit rpondre aux besoins du plus grand nombre
pour un prix le plus modeste possible. Les fabricants proposent en gnral toute une gamme
de microcontrleurs construits partir du mme microprocesseur. De plus on peut
personnaliser chaque microcontrleur par programmation de registres internes pour encore
plus de flexibilit. Toutes les fonctions ne sont pas disponibles la fois, on aura toujours
affaire un compromis.

Les avantages dun microcontrleur sont les mmes que ceux des cartes toutes faites qu'on
trouve dans le commerce : une utilisation quasi immdiate, sans problme de conception, de
ralisation et de mise au point. On peut y ajouter son faible encombrement, son prix modr et
une plus grande fiabilit du fait que les lignes de contrle sont toutes internes.

Les inconvnients sont ceux du tout compris . On doit travailler avec les priphriques
grand public choisis par le fabricant, qui ne donnent pas toujours la souplesse d'utilisation
souhaite. Les microcontrleurs proposent en gnral une option qui permet un interfaage
par bus externe, comme avec les microprocesseurs. On peut ainsi rajouter au microcontrleur
un ou plusieurs composants tout en continuant utiliser certains de ses composants internes.
Bien entendu, on retrouve alors les problmes de ralisation pratique d'une carte.

8
Reprsentation schmatique du microcontrleur 9S12DG256B
PS7
PS6
VSSX PM0 PS5
VDDX PM1 VREGEN PS4
PK PM2 PS3
PP7 PM6
PP6 PM3 PS2 PM7
PM4 PJ6 PS1
PP5 PJ7 VSSA
PP4 PM5 PS0 VRL
112 85
PP3 1 84 VRH
PP2 VDDA
PP1 PAD15
PP0 ATD ECT CRG PIM PAD7
PK3 convertisseur timer clock & reset gestion des PAD14
PK2 analog/num ECT_16B8C generator ports PAD6
PK1 t PAD13
PK0 PAD5
PT0
PT1 EETS CPU SCI
PAD12
PAD4
PT2 -processeur PAD11
EEPROM HCS12 commun. srie
PT3 4K asynchrone PAD3
VDD1 PAD10
VSS1 PAD2
PT4
PT5
MICROCONTROLEUR PAD9
PAD1
PT6
PT7
FTS SPI PAD8
PAD0
PK5
PK4
Mmoire
Flash 256K 9S12DG256B commun. srie
synchrone
VSS2
VDD2
PJ1 PA7
PJ0 PA6
BKGD PA5
PB0 CAN PWM Autres priph. PA4
PB1 Gestion des modulation de BDLC, IIC, VREG PA3
PB2 bus CAN largeur pulse PA2
PB3 PA1
PB4 28 57 PA0
29 56
PB5 PH7 PE7 PH0 PE0
PB6 PH6 PE6 PH1 PE1
PB7 PH5 PE5 PH2 PE2
PH4 PE4 PH3 PE3
VSSR TEST
VDDR XTAL
RESET XFC EXTAL
VDDPLL VSSPLL

Le microcontrleur 9S12DG256B qui quipe les kits dvaluation de la salle de TP runit


autour dun microprocesseur HCS12 4K dEEPROM, 16K de RAM et 256K de mmoire
Flash, ainsi que des priphriques parmi lesquels des ports dentre-sortie logiques (PIM), un
timer (ICT), deux convertisseurs analogiques numriques 10 bits 8 voies (ATD0 et ATD1),
deux interfaces srie asynchrones (SCI0 et SCI1), trois interfaces srie synchrones (SPI0,
SPI1 et SPI2). Il contient encore dautres priphriques, qui ne seront pas abords dans ce
cours, faute de temps. Le microcontrleur dispose galement de possibilits dextension de
bus 8 ou 16 bits vers lextrieur.

Pour communiquer avec lextrieur, le microcontrleur dispose en tout et pour tout de 112
pattes. Cest beaucoup trop peu pour rpondre aux besoins de tous les modules priphriques,
qui ne sont pas tous disponibles simultanment. Lorganisation du microcontrleur comprend

9
tout un arsenal de techniques pour choisir la configuration qui correspond le mieux au
traitement dun problme donn. Pour commencer, on va faire le tour du propritaire pour
savoir prcisment de quoi on dispose.

Description physique des pattes


Alimentations : Les alimentations utilisent 15 pattes.
- Six dentre elles groupes en trois couples, [VDDR, VSSR], [VDDX, VSSX], et [VDDA,
VSSA] se partagent lalimentation des modules du microcontrleur.
- Six autres pattes [VDD1, VSS1], [VDD2, VSS2] et [VDDPLL, VSSPLL] alimentent le cur
du micro (CPU et son environnement immdiat). Ces tensions proviennent soit du rgulateur
interne, soit dalimentations externes.
- La patte VREGEN valide ou non le rgulateur interne.
- Les pattes VRH et VRL sont les rfrences de tension du convertisseur A/N.

Sur la carte de TP, toutes les masses sont connectes, les trois alimentations VDDR, VDDX et
VDDA, sont relies VDD = 5V. VREGEN est 5V, ce qui valide le gnrateur interne. Les
rfrences du convertisseur sont relies VDD (pour VRH) et la masse (pour VRL).

Le tableau ci-dessous rcapitule les pattes dalimentation


Nom patte N patte Tension Description
(/112) Nominale
VDD1 13, 65 2.5 V Alimentations internes gnres par le rgulateur interne
VDD2
VSS1 VSS2 14, 66 0V et masses associes
VDDR 41 5V Alimentation externe des drivers de pattes et du rgulateur
VSSR 40 0V et masse associe
VDDX 107 5V Alimentation externe des drivers de pattes
VSSX 106 0V et masse associe
83 5V Alimentation externe et masse pour les convertisseurs
VDDA
analogique numriques et rfrence du rgulateur interne
86 0V Permet de court circuiter lalimentation des convertisseurs
VSSA
A/N indpendamment
VRL 85 0V Tension de rfrence haute des convertisseurs A/N.
VRH 84 5V Tension de rfrence basse des convertisseurs A/N.
VDDPLL 43 2.5 V Fournit la tension et la masse ncessaires au PLL. Cela
permet de court circuiter lalimentation du PLL
45 0V indpendamment. Alimentation et masse gnres par le
VSSPLL
rgulateur interne.
VREGEN 97 5V Validation/dvalidation du rgulateur interne

Horloge : Trois pattes sont rserves lhorloge


- XTAL et EXTAL : Ces lignes permettent la connexion avec un quartz pour le contrle de
loscillateur interne gnrateur de l'horloge E.
- XFC qui permet, en conjonction avec VDDPLL et VSSPLL dactiver le PLL pour gnrer
une frquence dhorloge plus leve.

Sur la carte de TP, loscillateur interne fournit une horloge 8 MHz. Lutilisation du PLL
permet de travailler avec une horloge 24 MHz. Pour plus de dtails, se reporter au manuel
du module CRG (Clock Reset Generator).

10
Trois pattes inclassables
- RESET ligne de la demande dinterruption CPU du mme nom,
- BKGD ligne de gestion du debugging en arrire plan
- TEST qui ne sert rien sauf aux tests en usine.

Les autre pattes, au nombre de 91, peuvent toutes servir dentres-sorties logiques dusage
gnral (ports). Elles ont presque toutes plusieurs affectations et leur dnomination varie
gnralement selon cette affectation, ce qui est une cause de confusion. Pour viter cela, on
sefforcera de leur conserver leur nom de port. La plupart sont bidirectionnelles, cest dire
quelles peuvent fonctionner en entre ou en sortie. Seules les pattes PAD0 PAD15 et les
pattes PE0 (=XIRQ) et PE1 (=IRQ) ne fonctionnent quen entre.

Modes de fonctionnement
Le microcontrleur peut fonctionner selon 8 modes diffrents. Le choix de ce mode se fait au
reset, suivant les niveaux de trois pattes ce moment : MODA (autrement dit PE5), MODB
(autrement dit PE6), et MODC (autrement dit BKGD). La slection des modes est donc
matrielle, bien quon puisse dans une certaine mesure la modifier par logiciel, comme le
montre le tableau suivant.

MODC MODB MODA Mode Possibilit dcrire dans MODx


0 0 0 Special Single Chip Toujours dans MODC, B, A mais pas 110
0 0 1 Emulation Narrow Jamais
0 1 0 Special Test Toujours dans MODC, B, A mais pas 110
0 1 1 Emulation Wide Jamais
1 0 0 Normal Single Chip MODC jamais, MODB, A une fois (pas 110)
1 0 1 Normal Expanded Jamais
Narrow
1 1 0 Special Peripheral Jamais
1 1 1 Normal Expanded Jamais
Wide

Seuls trois modes nous concernent en pratique : les modes dits normaux.

Dans le mode Single Chip, le MCU fonctionne comme un microcontrleur pur, sans bus
externe de donnes ou d'adresses. Ce mode permet une disponibilit maximum des lignes de
priphriques (91), l'activit des bus se passant l'intrieur du microcontrleur. La carte de
TP est prvue pour fonctionner dans ce mode.

Dans les deux modes tendus, le microcontrleur libre des pattes pour assurer les changes
de donnes avec lextrieur : ports A et B pour le bus mixte dadresses et de donnes, port E
pour les lignes de contrle et port K pour grer lextension des adresses au del de 64K. Les
deux modes diffrent par la taille des donnes changes, le mode narrow utilisant un bus
de donnes de 8 bits, tandis que le mode wide utilise un bus de donnes 16 bits.

11
L'organisation mmoire et les registres de contrle
Dans un mode donn, les options de fonctionnement ainsi que les paramtres des diffrents
modules sont essentiellement logiciels et passent par les registres de contrle du
microcontrleur (A et B, X et Y, SP, PC et PCR). Les registres de contrle occupent les
adresses mmoires basses. La place qui leur est rserve va de 0 $3FF, bien que certaines
adresses ne soient pas occupes. Suivant le mode dans lequel on travaille on na pas besoin
des mmes registres et la carte mmoire des registres en est modifie. Les implantations
mmoire elles mmes sont paramtrables par des registres, et il nest pas question ici dentrer
dans tous les dtails.

A chaque module est associ un bloc de registres contigus dans le plan mmoire. Le tableau
ci-dessous indique la rpartition mmoire des registres par module pour le microcontrleur
qui quipe la carte de TP.

Taille
Adresse Module
(octets)
0000-0017 CORE (Ports A, B, E, Modes, Inits, Test) 24
0018-0019 Rserv 2
001A-001B PARTID Device ID register 2
001C-001F CORE (MEMSIZ, IRQ, HPRIO) 4
0020-0027 Rserv 8
0028-002F CORE (Background Debug Mode) 8
0030-0033 CORE (PPAGE, Port K) 4
0034-003F CRG Clock and Reset Generator (PLL, RTI, COP) 12
0040-007F ECT Enhanced Capture Timer 16-bit 8 channel 64
0080-009F ATD0 Analog to Digital Converter 10-bit 8 channel N0 32
00A0-00C7 PWM Pulse Width Modulator 8-bit 8 channel 40
00C8-00CF SCI0 Serial Communications Interface N0 8
00D0-OOD7 SCI1 Serial Communications Interface N1 8
00D8-00DF SPI0 Serial Peripheral Interface N0 8
00E0-00E7 IIC Inter IC Bus 8
00E8-00EF BDLC Byte Data Link Controller 8
00F0-00F7 SPI1 Serial Peripheral Interface N1 8
00F8-00FF SPI2 Serial Peripheral Interface N2 8
0100-010F FTS Flash Control Register 16
0110-011B EETS EEPROM Control Register 12
011C-011F Rserv 4
0120-013F ATD1 Analog to Digital Converter 10-bit 8 channel N1 32
0140-017F CAN0 Motorola Scalable Can N0 64
0180-01BF CAN1 Motorola Scalable Can N1 64
01C0-01FF CAN2 Motorola Scalable Can N2 64
0200-023F CAN3 Motorola Scalable Can N3 64
0240-027F PIM Port Integration Module 64
0280-02BF CAN4 Motorola Scalable Can N4 64
02C0-03FF Rserv 320

Le module central, appel cur (core), regroupe autour du CPU (Central Processing Unit)
quelques sous modules : MEBI (Multiplexed External Bus Interface), BKP (Breakpoints),
INT (Interrupt), MMC (Module Mapping Control), BDM (Background Debug Module) qui
grent lorganisation de lensemble du microcontrleur autour du processeur. Les $40
premires adresses lui sont rserves.

12
Les principaux modules quon abordera dans ce cours sont les ports dentres sorties logiques
(PIM), le timer (ECT), le convertisseur analogique numrique (ATD) et les liaisons srie
asynchrone (SCI) et synchrone (SPI).

La carte mmoire du microcontrleur est la suivante (bien entendu, les registres ont la priorit
sur lEEPROM entre 0 et $3FF) :

0000-0FFF EEPROM Array 4096


1000-3FFF RAM Array 12288
Fixed Flash EEPROM Array
4000-7FFF 16384
incl 0.5K, 1K, 2K or 4K Protected Sector at start
8000-BFFF Flash EEPROM Page Window 16384
Fixed Flash EEPROM array
C000-FFFF incl 0.5K, 1K, 2K or 4K Protected Sector at end 16384
and 256 bytes of Vector Space at $FF80-$FFFF

13
COURS n2

Le codage de linformation

Gnralits

On distingue dans la communication et le traitement de l'information deux techniques trs


gnrales : analogiques et numriques. Les techniques analogiques traduisent l'information
par des grandeurs continues (dplacement d'une aiguille, valeur d'une tension, etc.), alors que
les techniques numriques la traduisent par des valeurs discrtes (nombres).
Exemples : Montre analogique ( aiguilles) ou numrique,
Voltmtres analogiques ou numriques,
Disque analogique (vinyle) ou numrique (laser).

Les perceptions des organes des sens sont de nature analogique, et il peut sembler plus naturel
et plus simple de traiter l'information sous forme analogique. Actuellement, dans presque tous
les domaines, les techniques numriques prennent le pas sur les techniques analogiques pour
des raisons de facilit de manipulation et de traitement.

Les units de base de l'information numrique

Le quantum (quantit la plus petite) d'information est reprsent par un systme deux tats
(haut/bas, vrai/faux, ouvert/ferm, allum/teint, etc.). Toute information numrique peut tre
reprsente par un ensemble de quanta d'information. On a dvelopp diverses technologies
pour reprsenter l'information numrique. Les calculatrices mcaniques utilisaient des
systmes 10 tats pour reprsenter les nombres entre 0 et 9.

A l'heure actuelle toute l'information numrique est dcrite partir de systmes 2 tats
(logique binaire), les plus faciles raliser et les plus fiables. L'unit associe est le bit
(abrviation de l'anglais BInary digIT : chiffre binaire). Un des tats est reprsent par le
chiffre 0 et l'autre par le chiffre 1. En micro lectronique, le 0 est souvent associ une
tension nulle et le 1 une tension 5V (standard TTL).

Pour dcrire une information non lmentaire, on a besoin de plusieurs bits. Actuellement, ils
sont regroups au moins par 4, et le plus souvent par 8 ou des multiples de 8. Un ensemble de
4 bits est parfois appel quartet (nibble en anglais). On appelle octet (byte en anglais) un
ensemble de 8 bits, et mot (word en anglais) un ensemble de 16 bits. L'octet constitue l'unit
pratique de base du traitement de l'information, plus riche que le bit tout en restant d'un
maniement commode.

Les codages de l'information par des octets

Un bit pouvant prendre 2 valeurs, un ensemble de 8 bits pourra prendre 28 configurations


diffrentes. Il existe donc 256 octets diffrents, qui constituent l'alphabet de codage de toute
information. On a l'habitude de numroter les bits de 0 7 et de droite gauche. Le bit le plus
gauche est appel bit de poids fort ou MSB (Most Significant Bit), tandis que le bit le plus
droite est appel le LSB (Least Significant Bit) ou bit de poids faible.

14
1 0 0 0 1 0 0 1
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
(MSB) (LSB)

Que peut reprsenter l'octet 10001001 ?


- 8 voyants (allum, teint, teint, teint, allum, teint, teint, allum),
- 8 commandes d'appareils (on, off, off, off, on, off, off, on),
- le caractre '' dans le codage ASCII tendu,
- le nombre non sign 137,
- le nombre sign -119,
- un doigt sur un instrument de musique (piano ou flte),
- l'instruction ADCA en mode d'adressage immdiat,
- etc..

De mme qu'il est impossible de comprendre le mot 'four' si on ignore si le texte est anglais
ou franais, on ne peut interprter un octet indpendamment du contexte. Un bon exemple est
celui dun diteur de texte : l'diteur interprte les octets du fichier comme des caractres et
les affiche comme tels l'cran. Si le fichier a t prvu pour a (fichier texte), on obtient un
rsultat lisible. Dans le cas contraire, on a un texte incomprhensible.

La notation hexadcimale

Il existe, on l'a dit, 256 octets diffrents, qui constituent l'alphabet de base de la micro-
informatique. Il s'agit de leur donner tous un nom facilement manipulable. Le nom
'unzrozrozrounzrozroun' est peu pratique manipuler car trop long et trop monotone
l'oreille. On pourrait au contraire choisir un nom diffrent pour chaque octet : cette fois, ce
serait trop long de mmoriser 256 noms et leur correspondance binaire.

On a choisi de donner un nom chaque quartet :


0000 = 0 0001 = 1 0010 = 2 0011 = 3 0100 = 4 0101 = 5 0110 = 6 0111 = 7
1000 = 8 1001 = 9 1010 = A 1011 = B 1100 = C 1101 = D 1110 = E 1111 = F
De sorte que tout octet est reprsent par deux symboles. Ainsi l'octet cit plus haut s'crira 89
dans cette notation, appele hexadcimale car elle fait appel 16 symboles.

Il faut bien remarquer qu'il ne s'agit l que d'une notation permettant des changes humains
plus faciles, mais qu'il n'existe pas au niveau du processeur deux niveaux diffrents
(hexadcimal et binaire). Lutilisateur n'a besoin de mmoriser que le tableau des 16 quartets
pour reconstituer un octet binaire partir de sa notation hexadcimale. Ainsi l'octet 35 s'crira
0011 0101, et l'octet BC s'crira 1011 1100.

Le codage des caractres

La typographie utilise les lettres de l'alphabet (26 majuscules et 26 minuscules), les chiffres
(10), les ponctuations et les signes opratoires (24). Le total tant compris entre 64 et 128,
on arrive la conclusion qu'il suffit de 7 bits pour reprsenter les caractres, du moins dans
les pays anglo-saxons qui ignorent les accents, les trmas et autres variations sur les
caractres.

En l'absence de critre objectif, on a cr dans le pass diffrents codes de reprsentation des


caractres. A lheure actuelle, seul le code ASCII (American Standard for Communication &

15
Information Interchange) a survcu. Ce codage utilise les 96 octets de 20 7F pour coder les
caractres, chiffres, lettres et symboles divers doprations et de ponctuation. Les chiffres sont
cods de 30 39, les majuscules de 41 5A et les minuscules de 61 7A.

0 1 2 3 4 5 6 7 8 9 A B C D E F
0 NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI
1 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
2 ! " # $ % & ' ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ \ ] ^ _
6 ` a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { | } ~

Les codes de 00 1F ont t rservs des usages spciaux (caractres non imprimables)
dont les plus connus sont :
08 : Back Step (BS). Touche de retour en arrire (et souvent d'effacement).
0A : Line Feed (LF). Descente d'une ligne.
0D : Carriage Return (CR). Retour en dbut de ligne.
1B : Escape (ESC). Touche d'chappement.

Extensions du code ASCII


- Certains des codes non imprimables ont t prvus pour des utilisations qui sont aujourd'hui
totalement dsutes. C'est pourquoi on les affecte de nouveaux caractres (as de pique,
cur, carreau, trfle, etc.) plus ou moins bien pris en compte par les logiciels.
- Le codage sur 7 bits des caractres laisse un bit libre dans l'octet qui les reprsente. On
utilise parfois ce bit pour des contrles dchanges de caractres (bit de parit).
- On peut aussi utiliser le 8e bit pour coder jusqu 128 autres caractres (lettres accentues,
caractres graphiques, caractres spciaux). Les codes ASCII tendus existent sous plusieurs
formes et ne reprsentent pas un standard unique lheure actuelle.

Reprsentation ASCII dun quartet. Comme on peut le constater, les codes des caractres de
0 9 vont de 30 39, mais ceux des caractres A F ne les suivent pas immdiatement
puisquils vont de 41 46. Il y a un trou de 7 octets entre les deux sries de codes. Cest un
dfaut du code ASCII dont il faut tenir compte chaque fois quon veut extraire dun quartet le
code du caractre hexadcimal qui le dcrit.

Le codage des nombres : Nombres non signs

Le codage le plus naturel des nombres par des octets est de considrer la reprsentation
binaire dun octet comme son criture en base 2. La place du bit dans l'octet reprsente la
puissance de 2 correspondante. Ainsi, l'octet B5 est l'criture en base 2 de :
B5 = 10110101 = 127 + 026 + 125 + 124 + 023 + 122 + 021 + 120
= 1128 + 064 + 132 + 116 + 08 + 14 + 02 + 11 = 181
En base 2, table daddition et table de multiplication ont toutes deux une simplicit
lmentaire :
+ 0 1 0 1
0 0 1 pour laddition, et 0 0 0 pour la multiplication,
1 1 10 1 0 1

16
La table daddition se concrtise par un demi additionneur logique deux entres A et B et
deux sorties S (chiffre des units binaires) et R (chiffre des dizaines ).
Pour pouvoir enchaner une addition sur plusieurs chiffres binaires ou non, il est ncessaire de
prvoir le report dune retenue sur le chiffre suivant. Llectronique logique propose un
additionneur rpondant la question. Il comporte trois entres A, B et la retenue C, et deux
sorties E et le report R, avec le table de vrit ci-contre : A B C S R
A B 0 0 0 0 0
Additionneur 0 0 1 1 0
A+B+C 0 1 0 1 0
+ C 0 1 1 0 1
2R+S 1 0 0 1 0
1 0 1 0 1
R S 1 1 0 0 1
1 1 1 1 1
On ralise un additionneur 2 octets en chanant 8 additionneurs :
A7 A6 A5 A4 A3 A2 A1 A0
B7 B6 B5 B4 B3 B2 B1 B0
? + + + + + + + + ?
S7 S6 S5 S4 S3 S2 S1 S0
On remarque quil subsiste une indtermination sur le bit de report en entre et en sortie. Ce
bit porte le nom de Carry (report ou retenue). Il permet une grande souplesse dutilisation.

Avec cette convention, un octet reprsente un entier de 0 (00) 255 (FF). Le nombre 256
s'crit en base 2 : 1 0000 0000 et n'est donc pas reprsentable sur un octet. Pour reprsenter
des nombres plus grands, on doit ncessairement utiliser des bits supplmentaires. Un mot
(deux octets, ou 16 bits) permet lextension des nombres plus grands. Il y a 216 = 65536
mots diffrents, ce qui permet une reprsentation des entiers de 0 65535.

Remarque 1 : on peut crire un octet en base 2 en regroupant les termes comme ci-dessous
bit727 + bit626 + bit525 + bit424 + bit323 + bit222 + bit121 + bit020 =
[bit723 + bit622 + bit521 + bit420] 16 + [bit323 + bit222 + bit121 + bit020]
Le premier crochet [bit723 + bit622 + bit521 + bit420] reprsente un nombre entre 0 et
15, de mme que le second [bit323 + bit222 + bit121 + bit020], de sorte quon a crit
loctet en. base 16. Si on appelle 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F les chiffres dcrivant les
nombres de 0 15 dans cette base, on retrouve la notation hexadcimale dun octet..
L'avantage de lhexadcimal est de fournir directement l'expression binaire de l'octet, (8=1000
et 9=1001), et sa valeur dcimale (816 + 9 = 137). Alors quen dcimal, pour retrouver le
binaire de 137, il faut le dcomposer soit en 128+8+1, soit par des divisions successives par 2.
1372=68 reste 1(bit 0); 682=34 reste 0(bit 1); 342=17 reste 0(bit 2);172=8 reste 1(bit 3);
82=4 reste 0(bit 4); 42=2 reste 0(bit 5); 22=1 reste 0(bit 6); et 12=0 reste 1((bit 7).

Remarque 2 : L'octet not 23 reprsente le nombre dcimal 35, et le nombre hexadcimal 23.
Pour viter toute confusion, on convient de faire prcder lexpression de la valeur numrique
en base 16 du signe '$'. On crira donc $23 = 35, ou $C8 = 200. Dans la suite, on confondra la
reprsentation hexadcimale dun octet avec lexpression en base 16 du nombre quil
reprsente, cest dire quon abandonnera lcriture en caractres gras au profit du signe $.
En langage C, on crit 0x23 pour prciser quon sexprime en hexadcimal.

17
Arithmtique sur les octets. Indicateur C (Carry)
Pour ajouter deux octets, on utilisera ladditionneur 8 bits ci-dessus en mettant 0 lindicateur
C. A la fin de laddition, le Carry est 0 sil ny a pas eu dbordement et 1 sinon.
Exemple 1 : Tout se passe bien, pas de retenue sur le bit 0 0 1 1 0 1 1 0 ($36=54)
7. L'indicateur C de retenue est 0. + 0 1 1 1 1 0 1 1 ($7B=123)
1 0 1 1 0 0 0 1 ($B1=177)
Exemple 2 : Le rsultat exact dpasse la capacit de
l'octet. Le rsultat rduit l'octet est donc tronqu ($5D = 1 0 0 1 1 0 0 1 ($99=153)
93) et l'indicateur C de retenue est 1. + 1 1 0 0 0 1 0 0 ($C4=196)
1 0 1 0 1 1 1 0 1 ($15D=349)
Exemple 3 : Cet exemple prcise le prcdent. On tourne 1 1 1 1 1 1 1 1 ($FF=255)
en rond sur 256 valeurs, le successeur de 255 tant 0. + 0 0 0 0 0 0 0 1 ($01=1)
L'indicateur C est bien sr 1. 1 0 0 0 0 0 0 0 0 ($100=256)
Si on reprsente les nombres sur un octet, et si on veut
respecter la loi d'addition binaire, tous les nombres gaux modulo 256 sont reprsents par le
mme octet. Dans la convention des nombres non signs, les octets reprsentent les entiers de
0 255, et le carry fournit un contrle de droulement correct des oprations arithmtiques.

Le codage des nombres : Nombres signs (avec signe)

Le dernier exemple ci-dessus fait apparatre la lacune de la reprsentation prcdente : les


nombres ngatifs ne sont pas reprsents. On remdie cela en prenant comme intervalle de
dfinition l'intervalle symtrique (ou presque) de 256 entiers successifs (reprsentation en
nombres signs) : [-128 127].
Oppos de n : c'est le nombre qui ajout n donne 0 :
0 1 1 0 0 1 1 1 ($67=103) 0 1 1 1 1 1 1 1 ($7F=127) 0 0 0 0 0 0 0 1($01=1)
+ 1 0 0 1 1 0 0 1 ($99=-103) + 1 0 0 0 0 0 0 1 ($81=-127) + 1 1 1 1 1 1 1 1($FF=-1)
1 0 0 0 0 0 0 0 0 ($00=0) 1 0 0 0 0 0 0 0 0 ($00=0) 1 0 0 0 0 0 0 0 0($00=0)

On remarque que le bit 7 des nombres ngatifs est 1 et celui des nombres positifs 0. C'est
pourquoi on appelle le bit 7 bit de signe. On note aussi que l'oppos de -128 ($80) est -128, ou
plutt que 128 et -128, qui diffrent de 256, sont reprsents par le mme octet.

En nombres signs, l'indicateur C n'est pas significatif. Cette convention a besoin dun autre
indicateur (V : dbordement) qui signale une anomalie au sens des nombres signs.

Exemple 1 0 1 0 1 1 0 1 0 ($5A) En nombres non signs : 90+143=233 OK


1 0 0 0 1 1 1 1 ($8F) En nombres signs : 90+(-113)= -23 OK
1 1 1 0 1 0 0 1 ($E9) C=0 V=0
Exemple 2 0 1 0 0 1 1 0 0 ($4C) En nombres non signs :76+241=61
1 1 1 1 0 0 0 1 ($F1) En nombres signs : 76+(-15)=61 OK
0 0 1 1 1 1 0 1 ($3D) C=1 V=0
Exemple 3 0 1 0 0 1 1 0 0 ($4C) En nombres non signs : 76+88=164 OK
0 1 0 1 1 0 0 0 ($58) En nombres signs : 76+88=-92
1 0 1 0 0 1 0 0 ($A4) C=0 V=1
Exemple 4 1 1 0 0 0 1 0 1 ($C5) En nombres non signs : 197+179=120
1 0 1 1 0 0 1 1 ($B3) En nombres signs : (-59)+(-77)=120
0 1 1 1 1 0 0 0 ($78) C=1 V=1

18
Remarque : Le mcanisme de fonctionnement de l'addition de deux octets est indpendant de
la convention choisie (nombres signs ou non), de mme que le positionnement des
indicateurs. Suivant le cas, on tiendra compte de C ou de V pour la validit des rsultats.

Dcalages doctets

On ralise en lectronique des registres dcalage qui permettent une translation dun octet
vers la droite ou vers la gauche, cest dire une recopie simultane de chacun des bits de
loctet sur son voisin de droite ou de gauche. Bien sr un problme se pose pour les deux bits
extrmes, le premier qui na pas de prcdent et dont il faut choisir ltat arbitrairement, et le
dernier dont linformation nest pas conserve dans loctet.
>>
dcalage droite ? ?
<<
dcalage gauche ? ?

Cest encore le carry qui sert dintermdiaire pour grer le bit entrant ou sortant du dcalage
doctet. Lorsque les octets reprsentent des nombres, un dcalage vers la droite correspond en
gros une division par 2 et un dcalage gauche une multiplication par 2.

Le HCS12 a plusieurs instructions de dcalage selon le choix des octets du bout. Ce sont :
- Les dcalages logiques droite ou gauche (LSR et LSL : Logical Shift Right ou Left) dans
lesquels loctet qui sort va dans le Carry et loctet qui rentre est un 0.
LSR LSL
0 C C 0

- Les dcalages arithmtiques droite et gauche (ASR et ASL : Arithmetic Shift). Ils sont
faits pour respecter la reprsentation des nombres signs quand cest possible. ASL et LSL
sont identiques (mmes codes) tandis que ASR recopie le bit 7 sur lui mme pour conserver le
signe dans une division par 2.
ASR ASL
C C 0

- Les dcalages circulaires droite et gauche (ROR et ROL : Rotate right ou left).
Curieusement, le HC12 ne propose pas de permutation circulaire simple, mais rajoute
systmatiquement le Carry dans la ronde, ce qui donne :
ROR ROL
C C C C

Oprations logiques sur les octets.

Un bit reprsente parfaitement une variable boolenne. On dfinit sur ces variables l'opration
unaire 'non' et les trois oprations binaires 'et', 'ou' et 'ou exclusif ' (eor) dont les tables de
vrit figurent ci-dessous.
non ou 0 1 et 0 1 eor 0 1
0 1 0 0 1 0 0 0 0 0 1
1 0 1 1 1 1 0 1 1 1 0

19
On peut considrer un octet comme un ensemble de 8 variables binaires, et dfinir entre octets
les quatre oprations non, et, ou, eor qui ralisent l'opration logique indique sur chacun de
leurs bits homologues.

A7 A6 A5 A4 A3 A2 A1 A0

R=A non non non non non non non non


R7 R6 R5 R4 R3 R2 R1 R0

A7 A6 A5 A4 A3 A2 A1 A0 et 0 1
B7 B6 B5 B4 B3 B2 B1 B0 0 0 0
R = A et B et et et et et et et et
1 0 1
Table de
R7 R6 R5 R4 R3 R2 R1 R0 vrit

A7 A6 A5 A4 A3 A2 A1 A0 ou 0 1
B7 B6 B5 B4 B3 B2 B1 B0 0 0 1
R = A ou B ou ou ou ou ou ou ou ou
1 1 1
Table de
R7 R6 R5 R4 R3 R2 R1 R0 vrit

A7 A6 A5 A4 A3 A2 A1 A0 0 1
B7 B6 B5 B4 B3 B2 B1 B0 0 0 1
R = A eor B eor eor eor eor eor eor eor eor
1 1 0
Table de
R7 R6 R5 R4 R3 R2 R1 R0 vrit

par exemple non 10101100 = 01010011 non $AC = $53


10101100 et 11110000 = 10100000, $AC et $F0 = $A0
10101100 ou 11110000 = 11111100, $AC ou $F0 = $FC
10101100 eor 11110000 = 01011100 $AC eor $F0 = $5C

Les oprations logiques servent souvent agir sur un seul bit d'un octet.
Pour mettre le bit 3 d'un octet 1 sans toucher les autres, on fait un 'ou' de l'octet avec 8 :
XXXX XXXX ou 0000 1000 = XXXX 1XXX
Pour le mettre 0, toujours sans toucher les autres, on fait un 'et' avec $F7 :
XXXX XXXX et 1111 0111 = XXXX 0XXX
Pour le changer de valeur, toujours sans toucher les autres, un 'eor' avec 8 :
XXXX XXXX eor 0000 1000 = XXXX X XXX

On a souvent tester l'tat d'un bit d'un octet. On ralise pour cela un 'masque' qui ne laisse
'passer' que le bit en question, par un 'et' logique : Ainsi, pour tester le bit 5 de l'octet X, on
masquera l'octet X par $20, c'est dire qu'on testera si (X et $20) est nul ou pas.
XXXX XXXX et 0010 0000 = 00X0 0000

20
COURS n3

Les Aspects Logiciels du microcontrleur


Programmation en assembleur
Prsentation du matriel

Comme on la indiqu en prambule ce cours, on va tudier le microprocesseur HCS12


contenu dans le microcontrleur MC9S12DP256B. A lintrieur du microcontrleur, il est
connect de la mmoire, un timer, des contrleurs de liaison srie synchrone et asynchrone,
des ports dentre-sortie logiques, un convertisseur analogique numrique, etc.

Le HCS12 (on parle aussi du CPU : Central Processing Unit, pour la partie centrale) est de la
famille Motorola. Pour les travaux pratiques on dispose dune carte de dveloppement
(appele HCS12 T-Board) qui peut communiquer avec un PC dau moins deux faons
diffrentes. Lutilisation dun moniteur (D-BUG12) rsidant dans le composant, et
lutilisation dun debugger en ligne BDM.

On ne sintresse dans ce chapitre quau fonctionnement logiciel du microcontrleur, cest


dire quon dira le C ajoute , le C compare , le C range en mmoire , le C lit
en mmoire , le C se branche ladresse... , sans se proccuper pour linstant du
mcanisme lectronique de chacune de ces oprations.

Les registres du microcontrleur

Un microcontrleur utilise en permanence un certain nombre de registres pour contrler et


traiter son information. On peut considrer ces registres comme des mmoires internes au
CPU plus ou moins spcialises par le jeu dinstructions qui leur sont attaches. Le nombre,
les noms et les rles des registres sont spcifiques un microcontrleur donn. Toutefois, on
retrouve toujours, sous des noms diffrents et avec des modes dutilisation variables, les
mmes types de registres dans tous les microcontrleurs courants. Dans le cas du HCS12, les
registres sont les suivants :

Registres du microprocesseur HCS12


Accumulateur A Accumulateur B
ou Double Accumulateur D

Registre dindex X

Registre dindex Y

Pointeur de pile SP

Compteur Ordinal PC

Registre de contrle CCR S X H I N Z V C

21
Les accumulateurs A et B : deux registres de 8 bits utiliss systmatiquement ou presque
dans toutes les oprations de transfert mmoire, et la plupart des oprations arithmtiques et
logiques. Les oprations daddition par exemple se font suivant le schma suivant :
A A + valeur ou B B + valeur,
Il en est de mme pour toutes les oprations deux oprandes, ce qui explique le nom
daccumulateurs quon leur donne.

Laccumulateur D est le registre de 16 bits constitu par la juxtaposition des deux


accumulateurs A et B (A poids fort et B poids faible) pour lequel il existe des instructions
spcifiques. Il faut bien prciser que le registre D nest pas distinct des registres A et B, mais
une commodit qui permet de grer A et B comme un seul registre 16 bits.

Les registres dindex (ou dindice) X et Y : deux registres de 16 bits utilisables en tant que
tels et spcialiss comme pointeurs de mmoire. Ils jouent un rle fondamental dans la gestion
des boucles par le mcanisme dadressage index quon tudiera plus tard.

Le pointeur de pile SP (Stack Pointer, pile se disant stack en anglais), registre de 16 bits
rserv la pile. La pile est une structure fondamentale dans toute linformatique, et son
importance est croissante avec la complexit des langages. On ltudiera en temps voulu.
Le pointeur de programme PC (Program Counter) appel aussi compteur ordinal, registre
de 16 bits qui contient ladresse de la prochaine instruction excuter. Ds quil est sous
tension, le microcontrleur excute des instructions de programme. Avant dexcuter une
instruction, le microcontrleur calcule ladresse de linstruction suivante et met jour le PC.
Son initialisation la mise sous tension est le problme du RESET. Bien que cette mise jour
soit transparente, il ne faut pas perdre de vue que le CPU excute sans cesse des instructions
tant quil est sous tension.

Le registre de contrle CCR (Code Condition Register). Registre de 8 bits, il constitue le


tableau de bord du fonctionnement du microcontrleur. Les bits 7, 6 et 4 sont des commandes,
et les cinq autres des indicateurs (flags)
7 6 5 4 3 2 1 0
S X H I N Z V C
Stop Disable Report (Carry)
Masque de XIRQ Dbordement (oVerflow)
Masque de IRQ Zro (Zero)
Ngatif (Negative)
Demi report (Half carry)
Les indicateurs

- Bit 0 : Carry . Positionn par la plupart des oprations arithmtiques et logiques, il permet
notamment de tenir compte danomalies dans le rsultat dadditions et de soustractions.
- Bit 1 : oVerflow . Positionn par certaines oprations arithmtiques et logiques, V permet de
tenir compte danomalies dans les additions et soustractions en nombres signs.
- Bit 2 : Zro . Positionn par la plupart des oprations arithmtiques et logiques, il indique
(quand il est 1 !) que le rsultat de lopration est 0
(quand il est 0 !) que le rsultat de lopration est 0
- Bit 3 : Ngatif . Positionn par la plupart des oprations arithmtiques et logiques, il recopie
le bit 7 du rsultat qui, en nombres signs, traduit le signe du rsultat (+= 0, -= 1).
- Bit 5 : Half Carry . Utilisation trs spcifique dans les calculs BCD.

22
Les instructions de programmation

Le HCS12 est muni dun certain nombre dinstructions de programmation. Ces instructions,
codes sur un ou plusieurs octets, sont ranges squentiellement en mmoire et constituent un
programme. Il faut bien noter que les octets de programme (ou octets de code) nont rien de
particulier, et peuvent tre placs nimporte o dans la mmoire. Ils ne deviennent octets de
code quau moment o le registre PC, en pointant sur eux, lance leur excution.

On regroupe classiquement les instructions en trois familles (plus une pour les inclassables) :
- les oprations daffectation (transfert de donnes),
- les oprations arithmtiques et logiques,
- les oprations de branchement,
- les oprations diverses.
Ecrire un programme consiste donc traduire un algorithme (ou organigramme) en octets de
programme et ranger ces octets squentiellement en mmoire. On lance lexcution du
programme en faisant pointer le PC sur le premier octet du code programme.

Pour faciliter cette criture, on crit un texte en utilisant un langage informatique


intermdiaire dot dune syntaxe rigoureuse (langage symbolique ou dassemblage) o
chaque instruction a un nom mnmonique. Le texte obtenu (programme source) est ensuite
traduit en octets de code (assemblage) qui constituent le programme binaire. Cet assemblage
peut se faire la main partir de la liste des instructions (notations symboliques et codes)
quon trouve dans le manuel de rfrence du HCS12. Par la suite on utilise un logiciel
(assembleur) qui gnre automatiquement un fichier binaire de code excutable partir du
texte source.

Les modes dadressage

Une instruction se compose en gnral de plusieurs parties : une partie (oprateur) indique
lopration effectuer (addition, comparaison, branchement, etc), et une seconde partie,
ventuellement vide, indique le ou les oprandes sur lesquels va travailler linstruction.

Exemple : laddition du nombre constant n au contenu de la mmoire N AD1 peut se faire de


deux manires quivalentes par la succession de trois instructions :
1/ AD1 AD1 + n
a - Charger laccumulateur A (ou B) avec le contenu de AD1 (variable)
b - Additionner laccumulateur A (ou B) le nombre n (constante),
c - Ranger le contenu de laccumulateur A (ou B) dans la mmoire AD1
2/ AD1 n + AD1
a - Charger laccumulateur A (ou B) avec le nombre n (constante),
b - Additionner laccumulateur A (ou B) le contenu de AD1 (variable),
c - Ranger le contenu de laccumulateur A (ou B) dans la mmoire AD1

Linstruction a- charge laccumulateur. Dans le cas N1, avec le contenu dune mmoire (une
variable) et dans le cas N2 par un nombre (une constante).
Linstruction b- additionne une valeur au contenu de laccumulateur. Dans le cas N1, il sagit
dun nombre (une constante) et dans le cas N2 du contenu dune mmoire (une variable).
Linstruction c- range dans les deux cas le contenu de laccumulateur dans la mmoire AD1
(affecte le rsultat de laddition la variable).

23
De mme que laddition et les transferts mmoire, beaucoup de commandes on besoin
daccder une ou plusieurs oprandes. En gnral, comme dans lexemple prcdent, il
existe plusieurs manires de dsigner le mode daccs la (ou les) oprande(s). On les appelle
modes dadressage. Le codage des instructions se fait de la manire suivante : pour une mme
instruction, loctet de code diffre suivant le mode dadressage, et loctet ou les octets
suivant(s) prcise(nt) comment dfinir loprande. Le HCS12 distingue 7 modes dadressage :
inhrent, immdiat, direct, tendu, relatif, index, multiple.

Ladressage inhrent est le plus vident : il ny a pas doprande, et donc aucun adressage.
Linstruction est code sur un (ou deux) octet(s). Exemple :
mettre A 0 scrit CLRA et se code 87
A A+B scrit ABA et se code 18 06

Ladressage immdiat est celui dune constante. Cest le cas des commandes 1,b- et 2,a-.
Linstruction est traduite par un octet et la constante par 1 ou 2 octets suivant quil sagit dun
octet ou dun mot. Le langage symbolique traduit ladressage immdiat par un # prcdant
loprande. Exemples :
charger A avec loctet $30 scrit LDAA #$30 et se code 86 30
charger X avec le mot 5000 scrit LDX #5000 et se code CE 13 88

Ladressage tendu est celui dune (ou deux) cases mmoire dont on spcifie ladresse dans
loprande, sur 2 octets. Cest le cas des commandes 1,a- et 2,b-. Exemple :
charger A avec loctet dadresse $1000 scrit : LDAA $1000 et se code B6 10 00
charger X avec le mot dadresse $1000 scrit : LDX $1000 et se code FE 10 00
Il faut noter que lors du chargement dun registre 16 bits, deux octets sont concerns. Dans le
cas prcdent, loctet dadresse $1000 est rang dans le poids fort de X, et loctet dadresse
$1001 dans le poids faible de X.

Ladressage direct est un cas particulier de ladressage tendu quand ladresse est infrieure
$100. En rduisant loprande un seul octet, cet adressage limite la taille et le temps
dexcution du code. Dans un premier temps on peut lignorer.

Ladressage relatif nest utilis que par les instructions de branchement et sera tudi dans le
chapitre suivant (Ruptures de squence).

Ladressage index fait lobjet du paragraphe suivant o on prcisera ses diffrentes


possibilits dutilisation.

Quant ladressage multiple, il concerne des instructions plusieurs oprandes ayant chacun
son propre mode dadressage.

Les deux exemples choisis en dbut de paragraphe donnent lieu aux programmes suivants (en
supposant AD1 = $1000 et n = $45)
B6 10 00 LDAA $1000 ;tendu 86 45 LDAA #$45 ;immdiat
8B 45 ADDA #$45 ;immdiat BB 10 00 ADDA $1000 ;tendu
7A 10 00 STAA $1000 ;tendu 7A 10 00 STAA $1000 ;tendu
cas N1 cas N2
On remarque que loctet de code diffre suivant le mode dadressage choisi.

24
Table 3-1. Sommaire des modes dadressage du HCS12
Adressage Format source Abrviation Description
INST
Inhrent (pas doprande INH Les oprandes ventuels sont les registres CPU
exterieur)
INST #opr8i
Loprande est inclus dans le flux dinstructions
Immdiat ou IMM
Taille 8 ou 16 bits suivant le contexte
INST #opr 16i
Direct Loprande est les 8 bits poids faibles dune adresse
INST opr 8a DIR
dans la zone $0000 $00FF
Etendu INST opr16a EXT Loprande est une adresse 16 bits.
INST rel 8
Linstruction fournit un offset 8 ou 16 bits
Relatif ou REL
relatif au PC
INST rel 16
Index Offset sign constant 5 bits
INST oprx5,xysp IDX
(5 bits doffset) par rapport X, Y, SP ou PC
Index
INST oprx3,-xys IDX Pr dcrment automatique de X,Y,SP de 1 8
(pr-dcrment)
Index
INST oprx3,+xys IDX Pr incrment automatique de X,Y,SP de 1 8
(pr-incrment)
Index
INST oprx3, xys- IDX Post dcrment automatique de X,Y,SP de 1 8
(post-dcrment)
Index
INST oprx3, xys+ IDX Post incrment automatique de X,Y,SP de 1 8
(post-incrment)
Index Index avec un offset accumulateur 8 bits (A ou B)
INST abd, xysp IDX
(offset accum) ou 16 bits (D) par rapport X, Y, SP ou PC
Index Offset sign constant 9 bits / X, Y, SP ou PC
INST oprx9,xysp IDX1
(9 bits doffset) (les 8 bits faibles doffset dans un octet dextension)
Index Offset sign constant 16 bits / X, Y, SP ou PC
INST oprx16,xysp IDX2
(16 bits doffset) (les16 bits doffset dans deux octets dextension)
On trouve le pointeur sur loprande un offset
Index indirect
INST [oprx16,xysp] [IDX2] constant de 16 bits par rapport X, Y, SP ou PC
(16 bits doffset)
(Offset 16 bits dans deux octets dextension)
Index indirect On trouve le pointeur sur loprande
INST [D,xysp] [D,IDX]
(offset accu D) X, Y, SP ou PC plus la valeur dans D

Les adressages indexs

Ds que lon veut dcrire et utiliser une variable structure, parcourir un tableau, on a besoin
dun oprande dadresse variable. Les registres dindex ont t crs pour cela, et leur
utilisation la plus simple, pour une instruction de chargement par exemple, peut se dfinir
comme suit : charger A avec le contenu de la mmoire dadresse X

La richesse de langage dun microcontrleur se mesure en partie la varit de ses modes


dadressage indexs. Le HCS12 est bien pourvu de ce ct l et propose un grand choix. Un
des points forts est que tous les registres de 16 bits (X, Y, mais aussi SP et PC) peuvent servir
de base dadressage index de manire (presque) interchangeable. On va simplement dcrire
les possibilits offertes, le dtail de lutilisation de tous les modes tant une affaire de
pratique.

Adressage avec offset constant : supposons quon veuille charger A avec le contenu de
ladresse $1041, et que X ait la valeur $1000. On utilise alors linstruction : LDAA $41,X, qui
signifie charger A avec le contenu de la mmoire N X+$41 . $41 est appel offset. Avec

25
le HCS12, Motorola propose trois types doffset constant :
sur 5 bits, sign, de -16 +15, qui assure le maximum de rapidit,
sur 9 bits, sign, de -256 +255
sur 16 bits, qui assure une porte maximum

Adressage avec offset accumulateur : Il est souvent trs utile davoir un offset variable, et le
HCS12 dispose dadressages indexs avec A, B ou D comme offset. Exemple : LDAA D, SP

Adressage avec auto incrmentation ou auto dcrmentation : Lorsque lon dcrit un tableau,
on a souvent besoin dincrmenter rgulirement le pointeur. Exemple : LDD 2,X+ signifie
charger D avec la mmoire dadresse X (en fait, les deux mmoires dadresses X et X+1),
puis incrmenter X de 2.

Adressage indirect index : cest le plus perfectionn, et le plus dlicat, des modes
dadressage. On comprendra son fonctionnement sur un exemple : LDAA [20,X] signifie : lire
ladresse crite en X+20, X+21 et charger A avec le contenu de cette adresse.
Le tableau suivant prcise les dtails et les codages de tous les modes indexs.
Table 3-2. Sommaire des oprations indexes
Syntaxe
Code xb Commentaires
du code
(Post octet) rr ; 00=X, 01=Y,10=SP, 11=PC
source
,r Offset constant 5 bits n=-16 +15
rr0nnnnn n,r r peut spcifier X, Y, SP ou PC
-n,r
Offset constant (9 ou 16 bits signs)
z- 0 = 9 bits avec signe dans LSB du post-octet -256n255
n,r 1 = 16 bits -32768n32767
111rr0zs
-n,r si z = s = 1, indirect index 16 bits doffset (voir plus bas)
r peut spcifier X, Y, SP ou PC
Indirect index 16 bits doffset
111rr011 [n,r]
rr peut spcifier X, Y, SP ou PC -32768n32767
pr-dcrment, pr-incrment, post- incrment, post-dcrment automatique
p = pre-(0) ou post-(1), n = -8 -1, +1 +8
r peut spcifier X, Y, SP. (PC nest pas un choix valide)
n,-r n,+r +8 = 0111
rr1pnnnn n,r- ...
n,r+ +1 = 0000
- 1 = 1111
...
- 8 = 1000
Offset accumulateur (8 bits ou 16 bits non signs)
aa - 00 = A
A,r
01 = B
111rr1aa B,r
10 = D (16 bits)
D,r
11 = voir offset indirect index sur laccumulateur D
r peut spcifier X, Y, SP ou PC
Offset indirect index sur laccumulateur D
111rr111 [D,r]
r peut spcifier X, Y, SP ou PC

Les oprations daffectation gnrales


Ces oprations affectent une valeur un registre ou une mmoire. Lorigine de cette valeur
peut tre diverse et dpend du mode dadressage, mais lexception des instructions MOVB
et MOVW qui passent directement dadresse adresse, toutes ces instructions passent par un
registre du CPU.

26
CLR,CLRA,CLRB Mise 0
LDAA,LDAB,LDD,LDS,LDX,LDY,LEAS,LEAX,LEAY Chargement
STAA,STAB,STD,STS,STX,STY Rangement
MOVB,MOVW Transferts mmoire
SEX,TAB,TBA,TAP,TFR,TPA,TSX,TSY,TXS,TYS Transferts de registres
EXG,XGDX,XGDY Echanges de registres
Tous les modes dadressage ne sont pas disponibles pour toutes les instructions. Chaque
instruction a sa syntaxe propre quon trouvera dans la notice dtaille.

Oprations arithmtiques et logiques

Les oprations arithmtiques addition et soustraction se font toujours sur un accumulateur (A,
B ou D). Il y a deux types daddition et de soustraction, suivant quon tient compte ou non de
la retenue (carry). Elles positionnent pratiquement toutes les indicateurs.

ADCA,ADCB,ADDA,ADDB,ADDD Addition
SBCA,SBCB,SUBA,SUBB,SUBD Soustraction

Les multiplications et les divisions sont sans oprande (voir mode demploi dtaill) de mme
que lincrmentation (+1) la dcrmentation (-1) et quelques oprations entre registres.

MUL,EMUL,EMULS,EMACS Multiplication
EDIV,EDIVS,FDIV,IDIV,IDIVS Division
DEC,DECA,DECB,DES,DEX,DEY Dcrmentation
INC,INCA,INCB,INS,INX,INY Incrmentation
ABA,ABX,ABY,SBA Diverses

Les dcalages ont une importance fondamentale car ils reprsentent soit une multiplication
par 2 ( gauche), soit une division par 2 ( droite). Il y a deux indterminations : que devient
le bit qui sort et quelle valeur a celui qui entre. Cest la raison pour laquelle il existe trois
types de dcalage sur le HCS12 : rotation, arithmtique et logique (voir mode demploi
dtaill).

ASL,ASLA,ASLB,ASLD Arithmtique gauche


ASR,ASRA,ASRB,ASRD Arithmtique droite
LSL,LSLA,LSLB,LSLD Logique gauche
LSR,LSRA,LSRB,LSRD Logique droite
ROL,ROLA,ROLB Rotation gauche
ROR,RORA,RORB Rotation droite

Les oprations logiques se font presque exclusivement sur les accumulateurs A et B ( part la
complmentation qui peut tre directement sur une mmoire). Ce sont les oprations :

ANDA,ANDB,ANDCC,ORAA,ORAB,ORCC,EORA,EORB Et,Ou,Ouexclusif
NEG,NEGA,NEGB Ngation
COM,COMA,COMB Complmentation

27
Certaines oprations servent exclusivement positionner les indicateurs sans modifier les
registres sur lesquels elles ralisent des oprations logiques fictives.

BITA,BITB Test de bits


CMPA,CMPB,CPD,CPS,CPX,CPY,CBA Comparaison
TST,TSTA,TSTB Test (comp 0)

Notions sur la programmation en Assembleur

Le mot assemblage signifie traduction d'un programme source (en langage mnmonique)
en un programme objet (une squence d'octets) interprtable par le microprocesseur. Cette
traduction est trs gnralement bijective, et on appelle dsassemblage la fonction inverse qui
interprte une squence d'octets comme un programme dont elle reconstitue le mnmonique.
Ces oprations peuvent se pratiquer la main, en utilisant comme dictionnaires les tables de
codage du langage de programmation du microprocesseur.

Assembleurs dsassembleurs en ligne.


L'assemblage et le dsassemblage sont des fonctions facilement automatisables, et il existe
des programmes lmentaires capables de raliser ces fonctions, gnralement incorpors aux
moniteurs de mise au point (Buffalo pour le kit HC 11). Un dsassembleur a pour entre une
suite d'octets et fournit en sortie, quand c'est possible, un texte constitu de mnmoniques
d'instructions. Un assembleur en ligne, lui, reoit en entre des chanes de caractres dcrivant
l'instruction en langage mnmonique (codes mnmoniques et leurs oprandes qui sont soit des
nombres, soit des adresses suivant le mode d'adressage), et, aprs analyse de la chane
fabrique la suite d'octets correspondants. Qui dit analyse de chane dit obligatoirement
syntaxe, syntaxe qu'il faut respecter dans l'criture de la chane sous peine d'incomprhension
de l'assembleur en ligne.

Assembleurs
La pratique de l'assembleur en ligne met vite en vidence un certain nombre de dfauts
impossibilit d'insrer simplement une ligne oublie et manque d'tiquettes formelles sont les
deux principaux.(Il est plus lisible d'crire qu'on divise la mmoire NUMERATEUR par la
mmoire DENOMINATEUR plutt que la mmoire $543B par la mmoire $235F). Ces
notions, qui peuvent trs bien se manipuler lors de l'assemblage la main, ne passent pas avec
un assembleur en ligne. On utilise alors des outils plus volus, un diteur de texte qui prpare
les chanes assembler, avec les mmes facilits d'criture qu'un diteur normal, et un
assembleur qui, partir du fichier texte cr (fichier source, souvent not ASM), fabrique la
squence d'octets de code dans un autre fichier (fichier objet, souvent not S19).

Nouveauts par rapport au langage d'assemblage : essentiellement l'introduction


d'identificateurs ou d'tiquettes, et l'utilisation de directives d'assemblage.

Syntaxe d'une ligne de texte destin l'assembleur. Chaque instruction occupe une ligne. On
distingue quatre champs dans la ligne, tous facultatifs. Ce sont :
Champ tiquette : commence la premire colonne Une tiquette commence par une lettre
Champ instruction : spar de la fin de l'tiquette par au moins un espace ou un ':'
Champ oprande : spar du champ instruction par au moins un espace. Un oprande peut tre
une constante, une adresse ou une expression qui sera value lors de l'assemblage.
Champ commentaire : commence par un point virgule. Toute la partie droite de la ligne est un
commentaire; Est galement commentaire une ligne commenant gauche par une '*'

28
Etiquette Instruction Oprande Commentaire

DEBUT LDAA #$45 ;ACCA = $45 (chargement de A immdiat)


STAA COMPT ;COMPT = ACCA (rangement de A l'adresse
COMPT)
CLRA
*Les trois lignes prcdentes constituent des exemples possibles de lignes d'assembleur

Ncessit de pseudo-instructions, ou directives d'assemblage.


Le choix des emplacements mmoire des octets ne posait pas de problme lors d'un
assemblage en ligne. C'est l'oprateur qui allait lui mme implanter ses octets ou bon lui
semblait. Il doit maintenant communiquer les adresses d'implantation choisies l'assembleur
sous forme de la directive (ou pseudo-instruction) ORG, installe dans une ligne part dans
le champ instruction et suivie en oprande de l'adresse choisie.
Pour des raisons de confort, on veut donner un nom une constante qui revient souvent dans
un programme (par exemple l'octet $IB, code ASCII de la touche d'chappement). Cela se fait
l'aide de la directive EQU, dans le champ instruction, prcde de l'tiquette ESC et suivie
de l'oprande $IB
Enfin si dans un problme on a besoin de variables nommes, par exemple une variable
MASQUE d'un octet, une variable TEMPO de deux octets, la faon habituelle de procder est
de choisir une origine pour la zone des donnes, et d'y rserver 1 octet sous le nom de
MASQUE et deux octets sous le nom de TEMPO, selon le schma
ORG $1000
MASQUE DS.B 1 ;Rservation d'un octet de mmoire
TEMPO DS.W 1 ;Rservation de deux octets de mmoire

Cela consiste prvenir l'assembleur que l'identificateur MASQUE = $1000 et l'identificateur


TEMPO = $1 001 pour tout l'assemblage. La diffrence avec
MASQUE EQU $1000
TEMPO EQU $1 001
ne saute pas toujours aux yeux. L'utilisation de la seconde criture ne nous assure pas d'une
indpendance des adresses, et on peut accidentellement avoir deux tiquettes au mme nom
char MASQUE
int TEMPO
Ces variables peuvent tre initialises, comme en C. On utilisera alors les directives DC.B et
DC.W

Exemples

Ex N1 Ajouter le nombre de 32 bits contenu dans les adresses $1100, $1101, $1102 et
$1103 au nombre contenu dans les adresses $1200, $1201, $1202 et $1203. On range le
rsultat aux adresses $1300, $1301, $1302 et $1303. Autrement dit, effectuer laddition
suivante :
[$1100] [$1101] [$1102] [$1103]
+[$1200] [$1201] [$1202] [$1203]
=[$1300] [$1301] [$1302] [$1303]

29
Rsolution technique
Oprations successives Instruction HC12
[$1103]+[$1203] = [$1303] avec carry0 ADDA
[$1102]+[$1202]+carry0 = [$1302] avec carry1 ADCA
[$1101]+[$1201]+carry1 = [$1301] avec carry2 ADCA
[$1100]+[$1200]+carry2 = [$1300] avec carry3 ADCA

Programmation HC12
Code instruction Mnmonique Description de laction
1000 B6 1103 LDAA $1103 ;Aoctet dadresse $1103
1003 BB 1203 ADDA $1203 ;A=A+ octet dadresse $1203
1006 7A 1303 STAA $1303 ;A rang ladresse $1303
1009 B6 1102 LDAA $1102 ;Aoctet dadresse $1102
100C B9 1202 ADCA $1202 ;A=A+C+octet dadresse $1202
100F 7A 1302 STAA $1302 ;A rang ladresse $1302
1012 B6 1101 LDAA $1101 ;Aoctet dadresse $1101
1015 B9 1201 ADCA $1201 ;A=A+C+octet dadresse $1201
1018 7A 1301 STAA $1301 ;A rang ladresse $1301
101B B6 1100 LDAA $1100 ;Aoctet dadresse $1100
101E B9 1200 ADCA $1200 ;A=A+C+octet dadresse $1200
1021 7A 1300 STAA $1300 ;A rang ladresse $1300

Ex N2 Le tableau de notes des lves est constitu de la manire suivante : pour chaque
lve, les notes des quatre preuves figurent dans quatre cases mmoires successives. Une
cinquime case est prvue pour y inscrire la moyenne finale. Si X contient ladresse de la
premire case mmoire dun lve, crire le programme qui calcule et range la moyenne dans
le tableau.

Rsolution technique
On initialise une variable somme 0. On y ajoute ensuite les diffrentes notes de llve
pointes par X, X+1, X+2 et X+3. On divise le rsultat par 4 laide de deux dcalages
droite, ce qui donne la moyenne (par dfaut !) quon range dans la mmoire X+4.

Programmation HC12
Code instruction Mnmonique Description de laction
1000 87 CLRA ;Au dpart, Somme nulle
1001 AB 00 ADDA 0,x ;A=A+premire note
1003 AB 01 ADDA 1,x ;A=A+seconde note
1005 AB 02 ADDA 2,x ;A=A+troisime note
1007 AB 03 ADDA 3,x ;A=A+p quatrime note
1009 47 ASRA ;A = A/2
100A 47 ASRA ;A = A/2
100B 6A 04 STAA 4,x ;Moyenne dans le tableau

Ex N3 : La notation hexadcimale associe un caractre chaque quartet. Elle est dfinie par
un tableau de 16 octets, codes ASCII des 16 caractres hexadcimaux. Ce tableau H figure en
mmoire partir de ladresse $1100 :
1100 30 31 32 33-34 35 36 37-38 39 41 42-43 44 45 46
0123456789ABCDEF
Ecrire un programme qui on communique dans A un nombre de 0 15 et qui retourne le
caractre correspondant, toujours dans A
LDX #$1100 ;X pointe sur le dbut du tableau H
LDAA A,X ;AH[A]. A est charg avec llment N A du tableau

30
COURS n4

Les ruptures de squence logicielles


Gnralits
Habituellement les programmes du microcontrleur sexcutent de manire squentielle. Plus
prcisment, le compteur ordinal PC contient ladresse du premier octet de linstruction
excuter. Le microcontrleur dcode linstruction, value le nombre doctets de code qui la
constituent et fait pointer le PC sur la prochaine instruction du programme. Il termine alors
linterprtation et lexcution de linstruction en cours avant de passer linstruction suivante.

On dit quil y a rupture de squence si ladresse de linstruction suivante nest pas celle
calcule au cours du dcodage. Lorigine dune telle rupture peut tre logicielle (cest
linstruction elle mme qui modifie le contenu du compteur ordinal) ou matrielle (en gnral
un changement dtat dune ligne logique) auquel cas on parle dinterruption (voir chapitre
sur les Interruptions).

On distingue trois types de ruptures de squence logicielles :


- Ruptures inconditionnelles : la modification du contenu du PC est systmatique.
- Ruptures conditionnelles : la modification du PC est soumise des conditions, exprimes
par les bits dtat du registre de contrle CCR.
- Appel et retour de sous-programmes : la modification est systmatique comme dans un
branchement inconditionnel, mais avec mmorisation de l'adresse de retour.

Instructions de rupture inconditionnelle

Le HCS12 possde trois instructions de rupture inconditionnelle de squence :


- JMP suivi d'une adresse, qui charge cette adresse dans le PC.
- BRA suivi d'un dplacement (offset) sur un octet, qui ajoute ce dplacement l'adresse
contenue dans le PC. L'addition se fait en nombres signs. On dit que le branchement est
relatif, car l'adresse de destination n'est pas absolue comme dans le cas de JMP. C'est un
branchement faible porte, puisqu'il ne peut dplacer le PC que de $80.
- LBRA suivi d'un dplacement (offset) sur deux octets, qui ajoute ce dplacement l'adresse
contenue dans le PC. Il sagit encore dun branchement relatif, mais longue porte, puisqu'il
peut dplacer le PC sur tout lespace adressable de 0 $FFFF.

Exemple : On trouve l'adresse $1000 les octets $20 (code de BRA) et $35. Quelle est l'adresse
de destination ? Lorsque le PC pointe sur $1000, le microcontrleur lit le code $20, reconnat
que c'est un code 2 octets et met jour le PC $1002. Puis il excute l'instruction et ajoute
$35 au PC, qui contiendra donc en fin d'instruction, $1037. Si le second octet avait t $C2
par exemple, la mme opration aurait conduit l'adresse $FC4.
$1000 $20 $35 BRA $1037 $1000 $20 $C2 BRA $FC4

Remarque 1 : linstruction de saut JMP est absolue et permet une rupture de squence une
adresse fixe. Les instructions BRA et LBRA sont relatives. Elles gnrent du code translatable,
cest dire pouvant fonctionner tel quel indpendamment de son implantation.
Remarque 2 : linstruction LBRA de branchement une adresse relative lointaine est
quivalente un saut une adresse indexe sur le registre PC :

31
LBRA Adresse JMP Adresse, PCR

Instructions de rupture conditionnelle

Les ruptures conditionnelles nexistent dans le HCS12 que sous forme de branchement (long
ou court), c'est dire qu'elles sont relatives. Elles fonctionnent de la faon suivante : si la
condition est ralise, le branchement a lieu (ajout du dplacement au PC), sinon, l'instruction
est ignore (pas d'ajout au PC qui pointe sur l'instruction suivante).

Les branchements conditionnels sont dclenchs par les quatre indicateurs fondamentaux du
registre dtat CCR : carry C, dbordement V, zro Z et signe N. Il existe 8 instructions de
branchement conditionnel sur l'tat (1 ou 0) de chacun des quatre indicateurs. Il faut y ajouter
6 branchements plus complexes relatifs aux nombres signs et dclenchs par certaines
combinaisons des diffrents indicateurs. Les 14 instructions de branchement conditionnel se
groupent deux par deux, dclenches par des conditions contraires : Ex :
BCC : Branch if Carry Clear : branchement si le Carry est nul (0)
BCS : Branch if Carry Set : branchement si le carry est 1 (1).

La plupart des instructions arithmtiques et logiques positionnent les indicateurs. Dans la


mesure du possible, on sefforce de placer linstruction qui positionne les indicateurs actifs
pour le branchement juste avant linstruction de branchement. Si on a besoin dinsrer une ou
plusieurs instructions entre linstruction dclenchante et le branchement, il est fondamental
de s'assurer que ces instructions ne modifient pas les indicateurs concerns.

En gnral, les instructions qui positionnent les indicateurs (instructions arithmtiques ou


logiques) modifient galement le contenu des registres. Pour les positionner sans modifier les
registres, le HCS12 dispose de trois familles dinstructions :
- Les comparaisons (CMPA,CMPB,CPD,CPX,CPY,CBA) positionnent les indicateurs comme une
soustraction de loprande sans effectuer la soustraction.
- Les tests (TST,TSTA,TSTB) positionnent les indicateurs comme une comparaison 0.
- Les tests de bits (BITA,BITB) positionnent les indicateurs comme un et logique avec
loprande sans effectuer lopration.

Exemple : crire un programme qui on donne dans A la valeur n dun quartet et qui retourne
le caractre hexa qui lui correspond, toujours dans A. (exercice trait au chapitre prcdent
avec un tableau). Ici, on nutilise pas de tableau et on calcule le code ASCII en distinguant
deux cas : n < 10 et le code est gal n+$30, ou le n 10 et le code est gal n + $37
CMPA #10 ;effectue fictivement la soustraction A=A-10. Positionne N
BLO PLUS ;Si lindicateur N est mis (A<10), on saute
ADDA #7 ;sinon (A10), A = A+7
PLUS ADDA #$30 ;De toute faon, on ajoute $30
ICI BRA ICI ;Le programme boucle sur lui mme

Le programme associe aux nombres 0 9 les codes ASCII $30 $39 (caractres 0 9), et
aux nombres 10 15 les codes ASCII de $41 $46 (caractres A F)

32
Droulement dun programme lu par le microcontrleur

La suite ci-dessous reprsente un programme :


1000 79 20 04 B6 - 20 00 7A 20 - 05 87 C7 74 - 20 01 24 03
1010 F3 20 04 78 - 20 05 75 20 - 04 F7 20 01 - 26 ED 7C 20
1020 02 20 FE
On se propose de suivre son excution partir du moment o PC = $1000.

PC = 1000 [PC]=79 : code sur 3 octets


Lecture des 2 octets restants (20 04) et mise jour de PC
dcodage et excution : mmoire N2004 0 (CLR $2004)
PC = 1003 [PC]=B6 : code sur 3 octets
Lecture des 2 octets restants (20 00) et mise jour de PC
dcodage et excution : ACCA mmoire 2000 (LDAA $2000)
PC = 1006 [PC]=7A : code sur 3 octets
Lecture des 2 octets restants (20 05) et mise jour de PC
dcodage et excution : ACCA mmoire 2005 (STAA $2005)
PC = 1009 [PC]=87 : code sur 1 octet
Mise jour de PC : PC = 100A
dcodage et excution : ACCA 0 (CLRA)
PC = 100A [PC]=C7 : code sur 1 octet
Mise jour de PC : PC = 100B
dcodage et excution : ACCB 0 (CLRB)
PC = 100B [PC]=74 : code sur 3 octets
Lecture des 2 octets restants (20 01) et mise jour de PC
dcodage et excution : dcalage droite de 2001 (LSR $2001)
PC = 100E [PC]=24 : code sur 2 octets
Lecture de loctet restant (03) et mise jour de PC : PC = 1010
dcodage et excution : si Carry = 0, PC PC + 3 (BCC $1013)
Si carry
PC = 1010 [PC]=F3 : code sur 3 octets
Lecture des 2 octets restants (20 04) et mise jour du PC
dcodage et excution : D D + mmoires 2004 et 2005 (ADDD $2004)
PC = 1013 [PC]=78 : code sur 3 octets
Lecture des deux octets restants (20 05) et mise jour du PC
dcodage et excution : dcalage gauche de 2005 (ASL $2005)
PC = 1016 [PC]=75 : code sur 3 octets
Lecture des deux octets restants (20 04) et mise jour du PC
dcodage et excution : dcalage gauche de 2004 avec Carry (ROL 2004)
PC = 1019 [PC]=F7 : code sur 3 octets
Lecture des deux octets restants (20 01) et mise jour du PC
dcodage et excution : positionnement des flags suivant $2001 (TST $2001)
PC = 101C [PC]=26 : code sur 2 octets
Lecture de loctet restant (ED) et mise jour du PC : PC = 101E
dcodage et excution : si Z = 0 , PC PC + ED =000B (BNE $000B)
Si Z
PC = 101E [PC]=7C : code sur 3 octets
Lecture des 2 octets restants (20 02) et mise jour du PC

33
dcodage et excution : D mmoires 2002 et 2003 (STD $2002)
PC = 1021 [PC]=20 : code sur 2 octets
Lecture de loctet restant (FE) et mise jour du PC
dcodage et excution : PC PC + FE = $1021 (BRA $1021)

La pile et le pointeur de pile SP

Compte tenu du nombre rduit de registres, il arrive frquemment que l'on ait besoin dans un
calcul de mmoriser des valeurs intermdiaires. Le programmeur doit choisir pour cela des
mmoires auxiliaires, dont il assure la gestion. Cette gestion devient vite fastidieuse et
complexe si on veut utiliser au mieux lespace mmoire. Cest entre autres pour rpondre ce
besoin quon a imagin la structure de pile, qui existe et fonctionne de la mme faon sur tous
les microcontrleurs.

La pile est une zone de mmoire quelconque, pour laquelle on a prvu un pointeur spcial SP
(Stack Pointer) et des instructions d'accs rapides (Push et Pull). Les instructions Push (PSHA,
PSHB, PSHC, PSHD, PSHX, PSHY) servent ranger les registres dans la pile alors que les
instructions Pull (PULA, PULB, PULC, PULD, PULX, PULY) permettent de les rcuprer.
Toute l'astuce de la structure vient de ce qu'on n'a pas besoin de prciser l'adresse de
rangement, automatiquement gre par le microcontrleur avec le pointeur de pile SP. On
utilise parfois pour dcrire la pile le terme LIFO (Last In First Out), pour bien prciser que le
premier terme sortir de la pile est le dernier entr.

Dtail des instructions PUSH d'empilement (Avant l'instruction, SP pointe sur la valeur SP0).
-1 octet : PSHA SP = SP-1 dcrmentation du pointeur de pile SP(SP0 - 1)
STAA [SP] rangement de A l'adresse N SP (SP0 - 1)
-1 mot : PSHX SP = SP-2 dcrmentation du pointeur de pile SP (SP0 - 2)
STX [SP] rangement de X ladresse N SP (SP0-2, SP0-1)

Dtail des instructions PULL de dpilement (Avant l'instruction, SP pointe sur la valeur SP0).
-1 octet : PULA LDAA [SP] chargement de A avec le contenu de SP (SP0)
SP = SP+1 incrmentation du pointeur de pile SP (SP0+1)
-1 mot : PULX LDX [SP] chargement de X avec [SP0, SP0+1]
SP = SP+2 incrmentation du pointeur de pile SP (SP0+2)

Remarque : Tout programme doit initialiser le pointeur de pile une valeur choisie. Si on
utilise un moniteur rsident, cette initialisation est assure par le moniteur et on finit par
loublier, car le mcanisme est transparent au programmeur qui se contente dutiliser la zone
de pile en mmoire. Il lui faut simplement tenir soigneusement la comptabilit de sa pile pour
tre sr de rcuprer les bonnes donnes. En cas de branchements conditionnels, il arrive
frquemment que la pile ne soit pas correctement gre dans tous les cas. Cest une source
derreurs redoutables dtecter quand certaines ventualits se produisent trs rarement.

Exemples dutilisation de la pile :


Linstruction TFR X,Y de transfert de X dans Y et linstruction EXG X,Y dchange des deux
registres nexistent pas sur le HC11. On les ralise laide de la pile selon le schma suivant :
PSHX
PSHX PSHY
TFR X,Y EXG X,Y
PULY PULX
PULY

34
Ces exemples illustrent le fonctionnement de la pile, mais il sagit dutilisations marginales.
Cette structure trouve sa pleine signification avec les appels de sous-programmes. On verra
aussi plus tard quelle joue un rle dterminant dans le passage des paramtres aux fonctions
et la dfinition de variables locales ces fonctions.

Les appels de sous-programme

Le HCS12 dispose de deux instructions d'appel de sous-programme :


- JSR (Jump to SubRoutine), instruction dappel une adresse absolue,
- BSR (Branch to SubRoutine), instruction dappel une adresse relative proche,
Ces instructions fonctionnent de manire analogue aux instructions JMP et BRA, sauf qu'elles
mmorisent avant le branchement l'adresse d'o l'appel est donn. Il existe bien sr une
instruction permettant la rcupration de cette adresse : RTS (retour de sous programme),
place en fin de sous-programme.

La mmorisation de ladresse de retour se fait par la pile : la fin du dcodage de l'instruction


dappel, PC pointe sur l'instruction suivante. L'instruction d'appel effectue deux actions :
l'empilement de la valeur du PC et le saut l'adresse demande. A la fin du sous-programme,
l'instruction RTS se borne rcuprer dans la pile l'adresse sauvegarde.
On peut dcrire JSR, BSR, et RTS l'aide des instructions fictives suivantes :
JSR Adresse PUSH PC + JMP Adresse
BSR Adresse PUSH PC + BRA Adresse
RTS PULL PC

Remarque 1 : un sous-programme peut a priori tre appel toute tape du programme, et


donc dans n'importe quel contexte (tat des registres) du CPU. Si on veut ne pas perturber ce
contexte, on sauvera au pralable les valeurs des registres utiliss, et il faudra les restituer en
fin de sous-programme. La pile est l pour a. Remarque : il sagit dune possibilit,
nullement dune obligation. On peut aussi ne rien prserver. Cest le programme appelant qui
le fait.

Remarque 2 : linstruction dappel une adresse relative lointaine, quivalente LBRA, qui
pourrait tre LBSR comme cela existe sur dautres processeurs Motorola, nexiste pas. Elle est
remplace par un appel index sur le registre PC :
LBSR Adresse JSR Adresse, PCR
Pour tre complet, il existe galement une instruction CALL dappel de sous-programmes en
mmoire tendue, associe linstruction RTC (retour de Call). On nen parle pas ici.

Exemple 1 : Temporisation logicielle fixe : Il sagit dattendre un temps fix en dcrmentant


le registre IX de $1000 0. Le sous-programme est install ladresse 1100 :

1100 34 PSHX ;Mise labri du contenu de IX dans la pile


1101 CE 10 00 LDX #$1000 ;IX=1000
1104 09 DEX ;IX=IX-1 (positionne lindicateur Z)
1105 26 FD BNE $01104 ;Bouclage si non Z (X 0)
1107 30 PULX ;Sinon, cest fini, on rcupre IX en pile
1108 3D RTS ;Retour linstruction suivant lappel

35
Exemple 2 : Sous programme de temporisation logicielle paramtrable : on peut rutiliser le
programme ci-dessus, en supprimant les deux instructions PSHX et PULX, et en utilisant la
valeur initiale de X comme paramtre. Lappel du sous-programme se fait en deux temps :

1000 CE 12 34 LDX #$1234 ;Passage de la dure de la tempo par IX


1003 BD 01 00 JSR $1100 ;Appel du sous programme de temporisation
1006 ........ ... ... ;Et cetera

1100 09 DEX ;IX=IX-1 (positionne lindicateur Z)


1101 26 FD BNE 1100 ;Bouclage si non Z (X 0)
1103 39 RTS ;Retour linstruction suivant lappel

Dans la mesure o le X utilis par le sous-programme vient du programme principal, on se


dispense en gnral de le sauvegarder en entre du sous-programme pour le rcuprer en
sortie, en laissant ce soin au programme appelant, sil le dsire.

Exemple 3 : crire un sous-programme OCTHEX qui extrait dun octet la chane de deux
caractres hexadcimaux qui le dcrivent. En entre, loctet est dans A, et X pointe sur
ladresse de rangement.

On veut pouvoir lutiliser de la manire suivante


LDAA #$B4 ;A contient loctet 10110100
LDX #$2000 ;et X ladresse de la chane $2000
BSR OCTHEX ;Appel du sous programme OCTHEX
... ...

OCTHEX PSHA ;Mise labri de loctet traiter


ANDA #$F ;Extraction du quartet faible
BSR CARQ ;Caractre hex dcrivant le quartet faible
TFR A,B ;rang dans B
PULA ;Rcupration de loctet initial
LSRA ;|
LSRA ;|Extraction du quartet fort
LSRA ;|
LSRA ;|
BSR CARQ ;Caractre hex dcrivant le quartet fort
STD 0,X ;Rangement des deux caractres aux adresses X et X+1
RTS
CARQ CMPA #10 ;|
BLO PLUS ;|
ADDA #7 ;|Voir plus haut dans ce chapitre
PLUS ADDA #$30 ;|
RTS ;|

36
Le sous-programme CARQ a dj t tudi dans ce chapitre et dans le prcdent. Si on
prend la version utilisant un tableau, le sous-programme CARQ va utiliser le pointeur X et
donc perdre la valeur affecte X lappel du sous-programme OCTHEX. Dans ce cas, elle
doit tre sauvegarde
- Soit au dbut de OCTHEX, pour tre rcupre avant linstruction STD 0,X
- Soit dans CARQ qui prend alors lallure suivante :

PSHX ;Mise labri du X du programme appelant


LDX #$1100 ;X pointe sur le dbut du tableau H
LDAA A,X ;AH[A]. A est charg avec llment N A du tableau
PULX ;Rcupration de la valeur prserve
RTS ;

Imbrication des sous-programmes

La gestion de la pile permet dimbriquer des sous-programmes les uns dans les autres. La
seule prcaution prendre est de sassurer que la valeur du pointeur de pile est la mme au
moment dexcuter le RTS quau moment o on est entr dans le sous-programme. A titre
dexemple, on a suivi lvolution de la pile au cours de lexcution du programme ci-dessous :

org $1000 PC SP0-4 SP0-3 SP0-2 SP0-1 A B SP


1000 LDAA #03 xx xx xx xx xx xx SP0
main ldaa #3 1002 LDAB #04 xx xx xx xx 03 xx SP0
ldab #4
bsr addi 1004 BSR 1008 xx xx xx xx 03 04 SP0
bra * 1008 ABA xx xx 10 06 03 04 SP0-2
100A BSR 100D xx xx 10 06 07 04 SP0-2
addi aba 100D ASLA 10 0C 10 06 07 04 SP0-4
bsr addi2 100E ABA 10 0C 10 06 0E 04 SP0-4
rts
1010 RTS 10 0C 10 06 0E 04 SP0-4
addi2 asla 100C RTS 10 0C 10 06 0E 04 SP0-2
aba 1006 BRA 1006 10 0C 10 06 0E 04 PILI
rts
Le tableau de droite trace lexcution du programme. SP0 est la
valeur de dpart du pointeur de pile, reprsent par un trait vertical gras dans la pile [SP0-4,
SP0]

Ecriture dun sous-programme

On part presque toujours dun programme qui fournit le rsultat recherch. En gnral, si ce
programme nexiste pas on prend le temps de lcrire. Ensuite, il sagit de partager ce
programme en deux parties : le programme appelant , qui accdera au sous programme par
un JSR ou un BSR, et le sous-programme appel qui se conforme la syntaxe de lappelant.

On peut considrer lappelant comme un client et le sous-programme comme le travail dun


sous-traitant. Dans ce type de relations, cest le client qui a toujours raison et cest au sous-
traitant de se plier ses exigences. La difficult est que le programmeur est souvent son
propre client et quil modifie la syntaxe de lchange pour faciliter son travail. La mthode
recommande est donc de rechercher le maximum de commodit dans le rle du client,
dtablir un cahier des charges et ensuite de sy tenir dans le rle du sous-traitant.

Une fois le sous-programme crit, mis au point et test, il reste le documenter (paramtres
en entre, en sortie, profondeur de pile ncessaire, registres modifis) car le client ne veut pas
entrer dans le dtail de lcriture du sous-programme. Cest sur cette documentation et sur elle
seule quil sappuiera pour dvelopper son ou ses programmes appelants.

37
COURS n5

Les ports dEntre/Sortie logiques

Gnralits
On la vu dans le chapitre prcdent, sur les 112 pattes du microcontrleur, 91 peuvent servir
dentres sorties dusage gnral. Ces pattes, regroupes par ports, sont gres par trois
modules diffrents :

Port A, Port B, Port E et Port K sont grs par le module MEBI, partie du cur du
microcontrleur. Les ports PAD ne fonctionnent que comme entres. Ils sont grs par les
modules ATD. Enfin le reste des ports (Port H, Port J, Port M, Port P, Port S et Port T) sont
grs par le module spcifique des entres / sorties logiques PIM.

Le nombre de pattes disponibles (91) ntant pas un multiple de 8, certains ports ont moins de
8 bits : Port K en a 7 et Port J en a 4. Malgr toutes ces diffrences, les lignes dentre
logiques ont un certain nombre de points communs quon va maintenant prciser.

Proprits communes des ports

La philosophie de Motorola en ce qui concerne les entres sorties logiques dusage gnral est
de leur accorder une large autonomie par rapport leurs voisines. Ds lors, leur regroupement
en ports est plutt dordre administratif que purement logique. Cela permet dassocier un
groupe de 8 pattes des groupes de 8 bits qui dfinissent chacun une proprit de la patte
correspondante.

Registre de direction de donne : (DDR) Chacun de ses bits permet de choisir la direction de
transfert dune patte : 0, en entre, 1 en sortie.

Registre dentre-sortie de donnes : (IOR)


Si la patte est programme en sortie, le bit correspondant fixe son niveau.
Si la patte est programme en entre, le bit correspondant traduit son niveau.

Registre dentre de donnes : (IR) Chacun de ses bits reflte le niveau de la patte associe,
quelle que soit la direction programme dans le registre de direction de donnes, et quil y ait
ou non un module connect.

Registre de rduction de sortance : (RDR) Un bit 1 dans ce registre diminue la puissance


maximum que peut sortir la patte associe dans un rapport 3 environ. Ce bit na de sens
que si la patte est programme en sortie. Il est ignor dans le cas contraire.

Registre de validation de pull : (PE) Un bit 0 laisse la patte correspondante en lair . Sil
est 1, il valide le choix dune rsistance de tirage, pour fixer son niveau logique dans tous
les cas. Ce bit est utilis pour une patte programme en entre. Un pull-up (ou pull-down)
tant gnralement inutile en sortie.

38
Registre de choix de polarit du pull : (PS) Ce registre nest utile que si le prcdent a choisi
une rsistance de tirage. A 0, il sagit dun pull-up, et 1, il sagit dun pull-down. Le schma
ci-dessous rappelle les schmas pull-up et pull-down.
5V Pull-down

C patte
C patte

Pull-up

Diffrenciation des ports : dclenchement dinterruptions

Trois ports (H, J et P) offrent la possibilit de dclencher des interruptions sur front de
chacune des lignes dentre. Ils sont dans ce but munis dun registre PIF de huit indicateurs
(un par patte). Lindicateur passe 1 sur front actif (montant ou descendant) de lentre
associe.

Le front actif est dfini par le choix du mode de tirage. Le pull-up maintient un niveau haut en
absence de signal. Cest donc un passage au niveau bas (front descendant) qui sera le front
actif. Au contraire, le pull-down maintient un niveau bas en labsence de signal. Cest un
passage au niveau haut (front montant), qui sera lvnement actif.

Pour remettre 0 lindicateur mont 1 sur un front actif, il faut y crire un 1. Lcriture dun
0 est sans effet. Cette faon de faire droute au premier abord, mais elle permet une criture
simple des choses. Si on attend par exemple une monte du bit 5, on utilise le masque
%00100000 appliqu au registre PIF. Pour le remettre 0 sans toucher les autres, il suffit
dcrire le masque dans PIF puisque lcriture des bits nuls est sans effet.

Chacun des ports H, J et P dispose de son vecteur dinterruption. Il dispose galement dun
registre PIE de validation dinterruption calqu sur le registre dindicateurs PIF. Un bit 1 de
ce registre permet de dclencher une interruption sur monte de lindicateur correspondant.
Ainsi, si le registre PIE contient %00001000, la monte du flag 3 de PIF dclenche une
demande dinterruption du CPU. La monte des autres ne dclenche pas dinterruption.

Vue d'ensemble

PIM MEBI ATD


Registre H J M P S T A B E K Pad0 Pad
1
(IOR) Entre sortie du port + + + + + + + + + + + +
(IR) Entre du port + + + + + +
(DDR) Direction de donnes du port + + + + + + + + + +
(RDR) Rduction de sortance du port + + + + + +
(PER) Validation du pull du port + + + + + +
(PSR) Choix de polarit du port + + + + + +
(IER) Validation dinterruptions du port + + +
(IFR) Indicateurs dinterruptions du port + + +

39
Le partage des pattes

Presque toutes les pattes des ports ont plusieurs affectations possibles. Ainsi, quand on
travaille en mode tendu, Port A et Port B deviennent bus dadresses et bus de donnes
multiplexs, les lignes du Port E deviennent les lignes de gestion du bus externe et le Port K
sert grer lextension de la mmoire adressable au del de 64K.

Les pattes des deux ports PAD, qui fonctionnent uniquement en entre sont le plus souvent
utilises comme canaux dentre analogique vers les convertisseurs.

Quant aux autres ports, ils peuvent prter leurs pattes aux modules suivants (entre autres) :
Port H Liaisons srie synchrones SPI1 et SPI2
Port J Bus IIC, CAN4
Port M Bus CAN (CAN0, CAN1, CAN2, CAN3) et/ou BDLC
Port P Variateur de largeur dimpulsion (PWM)
Port S Liaisons srie synchrone et asynchrone (SPI0, SCI0 et SCI1)
Port T Timer (ECT).

La cohabitation entre ports dentre sortie logiques et modules se rgle par des registres lis
aux modules. Un principe simple, mais qui souffre peut-tre quelques exceptions, est que la
patte perd ses proprits dentre sortie logique ds quelle est affecte un module. Ainsi, le
module peut lutiliser comme sortie mme si le bit du DDR est 0. Le DDR na simplement
plus cours dans ces conditions. La figure ci-dessous prcise les relations entre registres de
ports et modules.
Le bit IR ne peut tre que lu.
Il reproduit toujours ltat
IR physique de la patte.

0 Le bit IOR reproduit ltat


physique de la patte sil est
1 en entre (DDR = 0). En
sortie (DDR = 1), il lit le
IOR 0 Patte buffer

Si module enable = 0 (pas de


1 module), et DDR = 1 (sortie),
la patte recopie IOR.

En prsence de module, IOR


DDR 0 et DDR sont court-circuits
et la patte prend la donne
1 fournie par le module. On
Data out remarque bien que le
Module Output Enable transfert de la donne depuis
Module Enable le module vers la patte se fait
mme si DDR = 0.

40
Exemples dutilisation des ports

Exemple 1 : programmer les lignes du port A en sortie sauf la ligne PA7 en entre. Afficher
en permanence en PA0 le niveau lu en PA7.

86 7F LDAA #%01111111 Programmation de la direction des lignes


5A 02 STAA DDRA Toutes en sortie sauf PA7
86 80 RECO LDAA #%10000000 Rcupration du niveau
M
94 00 ANDA PORTA de la ligne PA7
27 06 BEQ ZERO Si cest 1,
86 01 LDAA #1 On prpare le registre A
9A 00 ORAA PORTA pour crire un 1 dans PA0
20 04 BRA PLUS Si cest 0,
86 FE ZERO LDAA #%11111110 On prpare le registre A
94 00 ANDA PORTA pour crire un 0 dans PA0
5A 00 PLUS STAA PORTA Mise de PA0 au niveau sans toucher les autres
20 EC BRA RECOM Et bouclage

Exemple 2 : Compter le nombre de fronts descendants sur la patte Port H0 par scrutation.

79 2000 CLR CPT ;Compteur 0 au dpart


86 FF LDAA #$FF ;Pull-up pour tout le port H
7A 0264 STAA PERH ;(ou front descendant actif)
86 01 LDAA #1 ;test du bit 0 de PIFH
B5 0267 ATT BITA PIFH ;(attente d'une transition
27 FB BEQ ATT ;active de la ligne PH0).
72 2000 INC CPT ;Quand c'est le cas, on incrmente le compteur
7A 0267 STAA PIFH ;et on abaisse le flag (en crivant un 1 dedans)
20 F3 BRA ATT ;et on reboucle

Exemple 3 : Compter le nombre de fronts descendants sur la patte Port H0 par interruption.

79 2000 CLR CPT ;Compteur 0 au dpart


86 FF LDAA #$FF ;Pull-up pour tout le port H
7A 0264 STAA PERH ;(ou front descendant actif)
86 01 LDAA #1 ;
7A 0267 STAA PIFH ;On abaisse le flag (rien ne sest encore pass)
14 10 SEI ;Invalidation des interruptions au niveau du CPU
B5 0266 STAA PIEH ;Validation dinter sur front descendant de PH0
CE 101E LDX #ETDUN ;Installation de la tche en crivant le
7E 3E4C STX $3E4C ;vecteur dinterruption ladresse RAM
10 EF CLI ;active de la ligne PH0).
20 FE BRA * ;Programme principal

72 2000 ETDUN INC CPT ;On incrmente le compteur


86 01 LDAA #1 ;et on abaisse le flag
7A 0267 STAA PIFH ;(en crivant un 1 dedans)
20 F3 RTI ;Fin de tche

41
COURS n6

Utilisation de la Pile

La pile et le pointeur de pile SP

Compte tenu du nombre rduit de registres, il arrive frquemment que l'on ait besoin dans un
calcul de mmoriser des valeurs intermdiaires. Le programmeur doit choisir pour cela des
mmoires auxiliaires, dont il assure la gestion. Cette gestion devient vite fastidieuse et
complexe si on veut utiliser au mieux lespace mmoire. Cest entre autres pour rpondre ce
besoin quon a imagin la structure de pile, qui existe et fonctionne de la mme faon sur tous
les microcontrleurs.

La pile est une zone de mmoire quelconque, pour laquelle on a prvu un pointeur spcial SP
(Stack Pointer) et des instructions d'accs rapides (Push et Pull). Les instructions Push (PSHA,
PSHB, PSHC, PSHD, PSHX, PSHY) servent ranger les registres dans la pile alors que les
instructions Pull (PULA, PULB, PULC, PULD, PULX, PULY) permettent de les rcuprer.
Toute l'astuce de la structure vient de ce qu'on n'a pas besoin de prciser l'adresse de
rangement, automatiquement gre par le microcontrleur avec le pointeur de pile SP. On
utilise parfois pour dcrire la pile le terme LIFO (Last In First Out), pour bien prciser que le
premier terme sortir de la pile est le dernier entr.

Dtail des instructions PUSH d'empilement (Avant l'instruction, SP pointe sur la valeur SP0).
-1 octet : PSHA SP = SP-1 dcrmentation du pointeur de pile SP(SP0 - 1)
STAA [SP] rangement de A l'adresse N SP (SP0 - 1)
-1 mot : PSHX SP = SP-2 dcrmentation du pointeur de pile SP (SP0 - 2)
STX [SP] rangement de X ladresse N SP (SP0-2, SP0-1)

Dtail des instructions PULL de dpilement (Avant l'instruction, SP pointe sur la valeur SP0).
-1 octet : PULA LDAA [SP] chargement de A avec le contenu de SP (SP0)
SP = SP+1 incrmentation du pointeur de pile SP (SP0+1)
-1 mot : PULX LDX [SP] chargement de X avec [SP0, SP0+1]
SP = SP+2 incrmentation du pointeur de pile SP (SP0+2)
Remarque : Tout programme doit initialiser le pointeur de pile une valeur choisie. Si on
utilise un moniteur rsident, cette initialisation est assure par le moniteur et on finit par
loublier, car le mcanisme est transparent au programmeur qui se contente dutiliser la zone
de pile en mmoire. Il lui faut simplement tenir soigneusement la comptabilit de sa pile pour
tre sr de rcuprer les bonnes donnes. En cas de branchements conditionnels, il arrive
frquemment que la pile ne soit pas correctement gre dans tous les cas. Cest une source
derreurs redoutables dtecter quand certaines ventualits se produisent trs rarement.

42
Exemples dutilisation de la pile :
Linstruction TFR X,Y de transfert de X dans Y et linstruction EXG X,Y dchange des deux
registres nexistent pas sur le HC11. On les ralise laide de la pile selon le schma suivant :
PSHX
PSHX PSHY
TFR X,Y EXG X,Y
PULY PULX
PULY

Ces exemples illustrent le fonctionnement de la pile, mais il sagit dutilisations marginales.


Cette structure trouve sa pleine signification avec les appels de sous-programmes. On verra
aussi plus tard quelle joue un rle dterminant dans le passage des paramtres aux fonctions
et la dfinition de variables locales ces fonctions.

Les appels de sous-programme

Comme nous lavons dj vu, le HCS12 dispose de deux instructions d'appel de sous-
programme :
- JSR (Jump to SubRoutine), instruction dappel une adresse absolue,
- BSR (Branch to SubRoutine), instruction dappel une adresse relative proche,
Ces instructions fonctionnent de manire analogue aux instructions JMP et BRA, sauf qu'elles
mmorisent avant le branchement l'adresse d'o l'appel est donn. Il existe bien sr une
instruction permettant la rcupration de cette adresse : RTS (retour de sous programme),
place en fin de sous-programme.

La mmorisation de ladresse de retour se fait par la pile : la fin du dcodage de l'instruction


dappel, PC pointe sur l'instruction suivante. L'instruction d'appel effectue deux actions :
l'empilement de la valeur du PC et le saut l'adresse demande. A la fin du sous-programme,
l'instruction RTS se borne rcuprer dans la pile l'adresse sauvegarde.

On peut dcrire JSR, BSR, et RTS l'aide des instructions fictives suivantes :
JSR Adresse PUSH PC + JMP Adresse
BSR Adresse PUSH PC + BRA Adresse
RTS PULL PC

Remarque 1 : un sous-programme peut a priori tre appel toute tape du programme, et


donc dans n'importe quel contexte (tat des registres) du CPU. Si on veut ne pas perturber ce
contexte, on sauvera au pralable les valeurs des registres utiliss, et il faudra les restituer en
fin de sous-programme. La pile est l pour a. Remarque : il sagit dune possibilit,
nullement dune obligation. On peut aussi ne rien prserver. Cest le programme appelant qui
le fait.

43
Exemple dutilisation de la pile

Exemple 1 : Temporisation logicielle fixe : Il sagit dattendre un temps fix en dcrmentant


le registre IX de $1000 0. Le sous-programme est install ladresse 1100 :

1100 34 PSHX ;Mise labri du contenu de IX dans la pile


1101 CE 10 00 LDX #$1000 ;IX=1000
1104 09 DEX ;IX=IX-1 (positionne lindicateur Z)
1105 26 FD BNE $01104 ;Bouclage si non Z (X 0)
1107 30 PULX ;Sinon, cest fini, on rcupre IX en pile
1108 3D RTS ;Retour linstruction suivant lappel

Exemple 2 : Sous programme de temporisation logicielle paramtrable : on peut rutiliser le


programme ci-dessus, en supprimant les deux instructions PSHX et PULX, et en utilisant la
valeur initiale de X comme paramtre. Lappel du sous-programme se fait en deux temps :

1000 CE 12 34 LDX #$1234 ;Passage de la dure de la tempo par IX


1003 BD 01 00 JSR $1100 ;Appel du sous programme de temporisation
1006 ........ ... ... ;Et cetera

1100 09 DEX ;IX=IX-1 (positionne lindicateur Z)


1101 26 FD BNE 1100 ;Bouclage si non Z (X 0)
1103 39 RTS ;Retour linstruction suivant lappel

Dans la mesure o le X utilis par le sous-programme vient du programme principal, on se


dispense en gnral de le sauvegarder en entre du sous-programme pour le rcuprer en
sortie, en laissant ce soin au programme appelant, sil le dsire.

Imbrication des sous-programmes

La gestion de la pile permet dimbriquer des sous-programmes les uns dans les autres. La
seule prcaution prendre est de sassurer que la valeur du pointeur de pile est la mme au
moment dexcuter le RTS quau moment o on est entr dans le sous-programme. A titre
dexemple, on a suivi lvolution de la pile au cours de lexcution du programme ci-dessous :

org $1000 PC SP0-4 SP0-3 SP0-2 SP0-1 A B SP


1000 LDAA #03 xx xx xx xx xx xx SP0
main ldaa #3 1002 LDAB #04 xx xx xx xx 03 xx SP0
ldab #4
bsr addi 1004 BSR 1008 xx xx xx xx 03 04 SP0
bra * 1008 ABA xx xx 10 06 03 04 SP0-2
100A BSR 100D xx xx 10 06 07 04 SP0-2
addi aba 100D ASLA 10 0C 10 06 07 04 SP0-4
bsr addi2 100E ABA 10 0C 10 06 0E 04 SP0-4
rts
1010 RTS 10 0C 10 06 0E 04 SP0-4
addi2 asla 100C RTS 10 0C 10 06 0E 04 SP0-2
aba 1006 BRA 1006 10 0C 10 06 0E 04 PILI
rts
Le tableau de droite trace lexcution du programme. SP0 est la
valeur de dpart du pointeur de pile, reprsent par un trait vertical gras dans la pile [SP0-4,
SP0]

44
COURS n7

Les Ruptures de squences matrielles


Les Interruptions

Les ruptures de squence matrielles : interruptions

Une interruption, comme un sous programme, est une rupture temporaire de la squence
d'instructions en cours pour excuter une action dfinie, avant de reprendre la squence o on
l'avait laisse. A la diffrence dun sous-programme o la rupture est dclenche par une
instruction logicielle (BSR ou JSR), donc parfaitement prvue, la rupture de squence dune
interruption est commande par matriel (niveau ou transition d'une ligne) ou de faon interne
(interruptions du MCU). Elle peut donc se produire n'importe quel stade de droulement
dun programme.

Pour un sous-programme, l'adresse de branchement est indique dans l'appel. Pour une
interruption, cette adresse (vecteur d'interruption) figure dans une table place en haut de
mmoire, chaque ligne d'interruption ayant son adresse propre (adresse dinterruption).

Le microcontrleur dispose de trois lignes de demande dinterruptions externes :


- La ligne RESET ne peut tre masque, cest dire que toute demande dinterruption sur
cette ligne (niveau bas) parvient au processeur o elle reoit un traitement immdiat.
- La ligne XIRQ peut tre masque par le bit X du CCR, mais une fois dmasque reste active
jusquau prochain RESET. A lorigine, il sagissait dune NMI (Non Maskable Interrupt). On
a introduit le masque X pour rsoudre des conflits avec le RESET au dmarrage.
- La ligne IRQ peut tre masque par le bit I du CCR. Quand ce bit est 1, les demandes
dinterruption sur la ligne sont bloques et ne parviennent pas au microprocesseur.

En plus de ces trois lignes, le microcontrleur dispose de quelques tches dinterruption


internes qui peuvent sactiver indpendamment des lignes physiques. Ce sont notamment les
interruptions pour dfaut dalimentation ou dhorloge, linterruption de mise en route initiale,
linterruption pour code opratoire illgal, et linterruption logicielle SWI. De plus,
pratiquement tous les priphriques internes au microcontrleur disposent dau moins une
ligne dinterruption personnalise.

En fait, la ligne RESET est rserve la rinitialisation du programme de base du processeur,


et toutes les demandes dinterruption venant des priphriques externes au CPU passent par
les deux lignes IRQ et XIRQ. Le premier travail de chacune des deux tches dinterruption est
didentifier le demandeur parmi ceux connects lentre concerne, avant de saiguiller vers
le traitement spcifique. Chacun des demandeurs doit donc disposer dun indicateur de
demande dinterruption que la tche puisse tester.

Au dbut d'une tche d'interruption, tous les registres sont prservs dans la pile et le masque
I est mis pour ne pas imbriquer les interruptions. Le programmeur peut passer outre et valider
une imbrication de tches par l'instruction CLI, ses risques et prils. Linterruption tant par
nature imprvisible, cette sauvegarde du contexte est obligatoire. Cela interdit tout passage de
paramtre par les registres et oblige nutiliser que des variables globales.

45
A la fin de la tche d'interruption, la demande physique ne doit plus tre active, sinon on
repart immdiatement dans la mme tche. Il appartient donc la tche de faire le ncessaire
pour qu'il en soit ainsi (acquittement de la demande). La plupart du temps, il suffit de remettre
0 lindicateur responsable.

Points communs avec les sous-programmes : Comme pour un sous-programme, il sagit de


dtourner le programme principal pour effectuer une tche prcise (la tche dinterruption), et
dy revenir une fois la tche accomplie. Comme pour un sous-programme, on mmorise dans
la pile ladresse de retour (qui suit ladresse de linstruction interrompue) adresse que lon
dpile en fin de tche. On doit galement sauvegarder le contexte. Cette mesure est plus
radicale dans le cas dune interruption car on ignore quel endroit du programme intervient la
rupture de squence (IRQ = Interrupt ReQuest). On prserve dans la pile tous les registres en
dbut de tche, pour tous les dpiler en fin de tche.

Diffrences avec les sous-programmes : Le programmeur nest pas matre de la squence de


programme qui va tre interrompue. Il lui est donc impossible dcrire par programme
ladresse de la tche dinterruption dans le registre PC, comme ctait le cas avec les ruptures
de squence logicielles. Cette adresse doit tre prise ailleurs, par une action matrielle
dclenche par lactivation de la ligne dinterruption. Il existe dans tout microcontrleur une
zone rserve de mmoire non volatile (adresses dinterruption) qui contient les adresses des
tches associes (vecteurs dinterruption) aux diffrentes lignes de demande. Sur le HCS12,
les vecteurs dinterruption sont nots en en haut de mmoire A titre dexemple, aux trois
lignes cites plus haut sont associs les adresses :

IRQ$FFF2,$FFF3
XIRQ$FFF4,$FFF5
RESET$FFFE,$FFFF

La plupart des interruptions sont masquables, cest dire quon peut programmer le
microcontrleur pour tenir ou non compte de la demande dinterruption. Le bit I du CCR
masque linterruption IRQ ainsi que toutes les interruptions issues des priphriques internes.
Le bit X du CCR masque linterruption XIRQ.

Fonctionnement dune interruption

Prenons par exemple linterruption IRQ. Le CPU est en train dexcuter un programme, et la
ligne IRQ passe au niveau bas. Si elle nest pas masque, elle positionne un drapeau interne,
que le processeur consulte entre chaque excution dinstruction. Une fois termine lexcution
de linstruction en cours, le CPU reconnat une demande dinterruption. Il excute alors un
empilement de tous les registres, y compris le PC qui permet le retour au programme en fin de
tche. Sachant que la demande vient de IRQ, il va ensuite lire dans ladresse $FFF2,$FFF3 le
vecteur dinterruption de IRQ quil recopie dans le compteur de programme PC. La tche
dinterruption commence alors. Elle fonctionne comme un sous-programme normal, et se
termine par linstruction RTI. Comme RTS, elle permet le retour au programme courant, mais
en plus, elle dpile tous les registres empils au moment de lappel.

46
Une tche dinterruption prsente cependant quelques particularits importantes qui la
distinguent dun sous-programme :
- Elle doit prvenir le dispositif demandeur quelle a bien reconnu la demande, et faire
en sorte quil cesse de maintenir IRQ au niveau bas. En gnral, le dispositif demandeur
dispose dun bit dtat qui monte 1 pour dclencher une demande. Il appartient la
tche de remettre ce bit 0 (acquittement de linterruption).
- Elle ne peut communiquer avec le programme principal que par des variables
globales, en aucun cas par les registres qui sont automatiquement sauvegards.

Les interruptions, une fois installes, s'excutent de faon transparente pour le programmeur.
Elles sont souvent si transparentes qu'elles se font oublier. Le programmeur doit toujours
penser qu'elles existent et qu'elles prennent du temps. Il est donc fortement conseill, lors de
l'criture d'une tche d'interruption, de respecter les rgles suivantes :
- Une interruption ne doit jamais tre bloquante (attente d'un vnement)
- Une interruption doit durer le moins longtemps possible (traitement minimum des
donnes dans la tche), sinon on court le risque de ralentir considrablement le
programme principal, voire mme de le bloquer si les demandes sont rapproches.

La notion dinterruption a rencontr en informatique autant de succs que celle de pile, et elle
sy est montre tout aussi fconde. Sa fcondit a mme t si grande quil existe des
interruptions logicielles, autrement dit des interruptions dclenches par une instruction
logicielle, ou plus prcisment un sous programme ! Toutes les routines des BIOS et des OS
sur les ordinateurs compatibles PC sont ainsi structures en interruptions logicielles.

Les interruptions des priphriques internes du microcontrleur

La plupart des modules internes du microcontrleur (ports, timer, liaisons srie SCI et SPI,
convertisseurs, etc) peuvent formuler des demandes d'interruption au MCU. Ces demandes
utilisent la ligne IRQ interne (relie physiquement la patte IRQ). Comme chaque module
comporte plusieurs sources possibles dinterruption, on arrive 50 sources possibles de
demandes dinterruption internes sur la ligne IRQ. Pour ne pas perdre de temps en dbut de
tche IRQ pour identifier le demandeur, le microcontrleur rserve un vecteur chacune de
ces sources.

Au niveau du module, tout vnement demandeur est signal par la monte dun indicateur. A
chaque indicateur est associ un bit qui valide (1) ou masque (0) une demande dinterruption
sur monte du bit dtat. Comme les bits dtat sont en gnral regroups dans un registre
dtat, chaque registre dtat est associ un registre de validation de demande dinterruption.
Quelques exemples :

- Module timer : Linterruption du canal TCx sur monte du bit CxF est valide si CxI = 1
$004C C7I C6I C5I C4I C3I C2I C1I C0I TIE
$004E C7F C6F C5F C4F C3F C2F C1F C0F TFLG1
- : Linterruption sur dbordement timer (TOF) est valide si TOI = 1
$004D TOI 0 0 0 TCRE PR2 PR1 PR0 TSCR2
$004F TOF 0 0 0 0 0 0 0 TFLG2

- Module ATD0 : Linterruption sur squence complte (ASCIF) est valide si ASCIE = 1
$0082 ADPU AFFC AWAI ETRIGLE ETRIGP ETRIGE ASCIE ASCIF ATD0CTL2

47
Module SCI0 : linterruption sur donne prsente (RDRF) est valide si RIE = 1
$00CB TIE TCIE RIE ILIE TE RE RWU SBK SCI0CR2
$00CC TDRE TC RDRF IDLE OR NF FE PF SCI0SR1

Module SPI0 : Linterruption sur monte de SPIF est valide si SPIE = 1


$00D8 SPIE SPE SPTIE MSTR CPOL CPHA SSOE LSBFE SPICR1
$00DB SPIF 0 SPTEF MODF 0 0 0 0 SPISR

Module PIM (portH) Un front actif sur PHx (PIFHx = 1) dclenche une inter si PIEHx = 1
$0266 PIEH7 PIEH6 PIEH5 PIEH4 PIEH3 PIEH2 PIEH1 PIEH0 PIEH
$0267 PIFH7 PIFH6 PIFH5 PIFH4 PIFH3 PIFH2 PIFH1 PIFH0 PIFH

Ecriture dune tche dinterruption

La plupart du temps, une tche dinterruption vite une attente qui bloque le programme dans
une boucle de scrutation. Une bonne faon de procder est dcrire dabord le programme (ou
le sous-programme) de scrutation et den extraire la tche dinterruption, sa validation, et la
modification ventuelle des passages de paramtres.

Exemple : On veut quiper le microcontrleur dun compteur du nombre de tours du timer.


On va utiliser lindicateur TOF (Timer Overflow Flag) du registre TFLG2 qui passe 1 sur
dbordement du timer (passage de $FFFF 0). Le corps du programme est une boucle de
scrutation de TFLG2 qui attend la monte de TOF. Ds quelle sest produite, le programme
fait redescendre lindicateur pour pouvoir attendre le prochain dbordement et incrmente le
compteur, puis boucle indfiniment.
* Initialisations
clr cpt ;Initialisation 0
clr cpt+1 ;du compteur 16 bits
ldaa #$80 ;Lancement du compteur
staa TSCR1 ;TCNT du timer
* Boucle principale
recom ldaa #$80 ;On veut tester le bit 7
att bita TFLG2 ;Attente de sa monte
beq att ;(bit 7 = TOF)
staa TFLG2 ;Redescente de TOF
ldx cpt ;|
inx ;|Incrmentation du compteur
stx cpt ;|
bra recom ;et bouclage

Il sagit de transformer ce programme pour incrmenter le compteur par interruptions.


Lutilisation de linterruption supprime lattente, cest dire les trois lignes partir de recom.
La tche dinterruption se compose donc des lignes restantes de la boucle, suivies dun rti.
avance ldaa #$80 ;|
staa TFLG2 ;|Redescente de TOF
ldx cpt ;|
inx ;|Incrmentation du compteur
stx cpt ;|
rti

Pour quelle puisse seffectuer, il faut que :


- le vecteur dinterruption de dbordement contienne ladresse de la tche avance,
- la monte de TOF entrane une demande dinterruption du timer (bit TOI = 1),
- linterruption soit prise en compte par le MCU (bit I 0).

48
Les trois conditions sont ralises dans le programme ci-dessous :
sei ;Masquage des IRQ
ldaa #$80 ;Validation de l'inter
staa TSCR2 ;au niveau du timer
ldx #avance ;Installation de avance comme
stx $FFDE ;tche de dbordement timer
cli ;Dmasquage des IRQ

En outre, il faut maintenir les initialisations du programme prcdent.

Particularits du traitement des interruptions sous D-Bug12

Lorsquon met un microcontrleur sous tension, il va directement excuter la tche de


RESET, dont il trouve le vecteur dinterruption en $FFFE, $FFFF. Ces deux adresses doivent
imprativement correspondre une mmoire permanente (ROM ou EPROM ou encore Flash
comme cest le cas sur la carte de TP). Pour cette raison, les adresses hautes sont constitues
de mmoire permanente et la ligne
stx $FFDC ;tche de dbordement timer
est inefficace puisquon ne peut pas crire ladresse indique.

Le moniteur D-Bug12 utilis propose une redirection vers des adresses dinterruption en
RAM, de manire permettre un utilisateur de crer ses propres vecteurs dinterruption. Il
nest pas ncessaire dentrer dans tous les mandres de la redirection. On peut sans
inconvnient majeur considrer que les adresses dinterruption occupent lintervalle de $3E0C
$3E7F au lieu de lintervalle de $FF8C $FFFF. Pour que le programme dinterruption
fonctionne, il suffit de remplacer la ligne stx $FFDE par la ligne stx $3E5E
Une autre particularit du moniteur D-Bug12 est quil utilise pour sa communication avec le
microcontrleur le module de liaison srie SCI0, programm en interruptions en entre et en
sortie. Il interdit donc laccs aux interruptions de ce module.

Conclusions

On a vu jusqu prsent quelques considrations techniques pour crire correctement et


initialiser une tche dinterruption. Il est parfois plus dlicat de dcider de lopportunit de
traiter un problme avec ou sans interruption. Quelques principes de base peuvent permettre
dclairer les choix :

- Une interruption ne doit jamais tre bloquante (par exemple faire appel une entre clavier)

- Une interruption doit durer le moins longtemps possible. Eviter dy inclure des sous-
programmes longs et lents (affichages notamment sur SCI)

- Une interruption est faite pour se faire oublier. Ne pas oublier tout de mme quelle prend du
temps et quelle risque daccaparer le temps du CPU si on lappelle trop souvent.

- Lorsquon cherche une vitesse dexcution maximum, ne pas oublier quune tche
dinterruption empile, puis dpile tous les registres et quil vaut mieux souvent travailler en
scrutation.

49
COURS n8

Le Timer

Introduction
On peut rpartir les fonctions du timer en 3 catgories principales :
- Introduction de dlais, ou temporisations,
- Rptition priodique dactions intervalles prcis,
- Mesure de la dure entre des actions.
Dans la mesure o on connat exactement la priode du cycle de lhorloge E qui cadence le
processeur, ainsi que le nombre de cycles utiliss par chaque instruction, lcriture dune
boucle de programme de dure prcise ne pose (en principe) aucun problme. Par exemple,
avec une horloge E 24 MHz, le sous-programme suivant donne une tempo de 1/100e s :
[04] 34 JSR TEMPO Appel du sous programme

[02] 3C TEMPO PSHX Sauvegarde du registre IX


[02] CE EA5C LDX #59996Nombre de boucles dattente
[01] 09 ATTEN DEX Dcrmentation de IX
[03] 26 FD BNE ATTEN jusqu arriver 0
[03] 30 PULX Rcupration du registre IX
[05] 3D RTS Retour du sous programme
La dure de la boucle est de 4 cycles dhorloge. La boucle est effectue 59996 fois, ce qui
reprsente 459996 = 239984 cycles. En plus, le sous programme comprend des instructions
excutes une seule fois, qui durent 2(PSHX) + 2(LDX) + 3(PULX) + 5(RTS) = 12 cycles. Si
on inclut la dure de lappel (4), on arrive un total de 240000 cycles, soit un centime de
seconde exactement.
La question se complique si on veut effectuer une action priodique de priode prcise. En
effet, il faut dcompter de la temporisation la dure des instructions de laction. Sil sagit
dune action squentielle, le problme est facilement soluble, mais si elle prsente des
aiguillages, il faut valuer la dure de chaque chemin possible pour calculer la temporisation
lui ajouter. Cela donne des logiciels trs lourds mettre au point, et surtout pratiquement
impossibles modifier.
Si on veut mesurer logiciellement la dure coule entre deux vnements, le logiciel doit
contrler deux actions simultanment : lavance dun compteur chronomtre et la surveillance
de loccurrence de lvnement. Par exemple, pour mesurer la largeur dun crneau appliqu
lentre PA0 du port A, on peut utiliser le programme suivant, o X sert de compteur :

[02] CE 0000 LDX #0 Initialisation du compteur (X)


[01] 86 01 LDAA #1
[03] 95 00 ATTEN BITA PORTA Attente du passage 1
[03] 27 FC BEQ ATTEN de la ligne 0 du port A
[01] 08 ATTE2 INX Incrmentation du compteur
[03] 95 00 BITA PORTA Attente du passage 1
[03] 26 FB BNE ATTE2 de la ligne 0 du port A
[01] 09 DEX Dcrmentation de X (on a compt 1 de trop)

50
Le compteur IX est incrment au sein de la boucle dattente du second front, dont la dure
est de 1 + 3 + 3 = 7 cycles machine. Le rsultat de la mesure est 7X cycles, avec une
incertitude de 7 cycles. Cette incertitude est invitable du fait de la boucle dattente ATTE2.
Sil sagit dun test plus compliqu, la gestion commune devient vite trs pnible.

Ces exemples donnent une ide des problmes poss par les temporisations logicielles. Dans
les cas cits, cest difficile mais pas insurmontable. Mais le problme devient impossible pour
deux raisons principales : lvolution des processeurs dont les vitesses dhorloge sacclrent,
supprimant ainsi toute portabilit des logiciels, et le fonctionnement en parallle avec des
interruptions dont on ignore la dure et la frquence puisquon nen connat souvent mme
pas les sources. Il devient alors absolument ncessaire de disposer dune horloge autonome,
qui gre lincrmentation de son (ou ses) compteurs indpendamment du logiciel du CPU. On
appelle ce module priphrique timer (ou compteur de temps).

Prsentation

Un timer est un composant qui incrmente ou dcrmente un registre chaque front appliqu
sur sa ligne dentre CLK (horloge). Si ce signal est priodique (horloge du microprocesseur
ou oscillateur indpendant), le registre du timer fonctionne lui mme comme une horloge dans
laquelle le programme peut aller lire lheure tout moment. Si les fronts de la ligne dentre
ne sont pas priodiques, le timer fonctionne alors en compteur dvnements (compteur
Geiger par exemple).

Les composants timers usuels sont le 8254 dans la famille INTEL et le 6840 dans la famille
MOTOROLA. Tous deux runissent sur un mme composant 3 compteurs de 16 bits, quon
peut lancer ou arrter, ainsi que divers modes de fonctionnement qui leur donnent une grande
souplesse dutilisation : possibilit de commander un timer par un autre, fonctionnement en
cascade, etc. Le timer dont on dispose est assez diffrent et correspond au bloc diagramme ci-
dessous. On y distingue trois parties :

- Un compteur principal de 16 bits prcd dun pr-diviseur qui permet davoir sous la main
une base de temps permanente. Le systme de huit registres associs de capture dentre ou de
sortie compare permet une utilisation optimum de cette ressource.

- Quatre accumulateurs dimpulsions de 8 bits, cascadables en deux accumulateurs de 16 bits


fournissent un accessoire pratique pour les comptages dvnements et les chronomtrages.
De nombreux gadgets quipent cette option pour ladapter au mieux une grande varit de
problmes concrets.

- Un dcompteur de 16 bits, muni lui aussi dun pr-diviseur indpendant, permet la


gnration dune autre base de temps. Bien quil ait t prvu pour faciliter lutilisation des
accumulateurs, on peut parfaitement lutiliser comme un timer indpendant.

Lexploitation de tous les accessoires du timer ncessite de nombreux registres. Motorola en a


prvu $40 (de $40 $7F). On va dcrire maintenant les principales fonctions du timer avec les
registres associs.

51
Pr-diviseur Canal 0
Horloge bus
Capture dentre
IOC 0
Sortie compare
Compteur 16 bits Canal 1
Capture dentre
IOC 1
Inter compteur module Compteur module 16 bits Sortie compare
Canal 2
Inter canal 0 Capture dentre
IOC 2
Inter canal 1 Sortie compare
Inter canal 2 Canal 3
Capture dentre
Inter canal 3 IOC 3
Registres Sortie compare
Inter canal 4 Canal 4
Inter canal 5 Capture dentre
IOC 4
Sortie compare
Inter canal 6 Canal 5
Inter canal 7 Capture dentre
Accumulateur dimpulsions A IOC 5
Sortie compare
Inter Dbordement PA
16 bits Canal 6
Inter entre PA Capture dentre
Accumulateur dimpulsions B IOC 6
Sortie compare
Inter Dbordement PB
16 bits Canal 7
Capture dentre
IOC 7
Sortie compare

Registre de comptage du timer

$0044 TCNT15 TCNT14 TCNT13 TCNT12 TCNT11 TCNT10 TCNT9 TCNT8 TCNT
$0045 TCNT7 TCNT6 TCNT5 TCNT4 TCNT3 TCNT2 TCNT1 TCNT0
Situ aux adresses $44 et $45, TCNT est le compteur de base du timer. En lecture seule, il
sincrmente chaque impulsion dun pr-diviseur qui divise lhorloge E du micro (24 MHz
sur la carte de TP) par 2N, N allant de 0 7.
Deux commandes agissent sur ce compteur :
Le bit TEN (timer enable), bit 7 du registre TSCR1 qui lactive ( 1) ou larrte ( 0).
$0046 TEN TSWAI TSFRZ TFFCA 0 0 0 0 TSCR1
Les trois bits poids faibles du registre TSCR2 qui dfinissent la valeur de N.
$004D TOI 0 0 0 TCRE PR2 PR1 PR0 TSCR2
Quand il arrive FFFF, il repasse 0, en mettant 1 lindicateur TOF (Time OverFlow) du
registre d'tat TFLG2.
$004F TOF 0 0 0 0 0 0 0 TFLG2

On peut distinguer deux types dutilisation du compteur :


- Raliser des temporisations, pour rpter priodiquement des actions, logicielles ou
matrielles. Le principe est simple : on lit le compteur, on y ajoute la dure de temporisation
et on attend que le compteur atteigne la valeur calcule pour excuter laction, et on
recommence le processus. Ce type de fonctionnement (dclenchement d'un 'top' ou d'une autre
action un instant prcis) est appel Sortie Compare (Output Compare).
-.Mesurer la dure entre plusieurs tops matriels. Il sagit de saisir au vol la valeur du
compteur immdiatement aprs chaque vnement pour faire les calculs ensuite. Ce type de
fonctionnement est appel Capture dEntre (Input Capture).

52
Pour raliser ces deux types daction le timer dispose de huit registres de 16 bits TC0 TC7,
qui peuvent la demande servir des captures dentre ou des sorties compares, suivant le
registre TIOS : bit IOSx 1 : TCx en sortie compare. bit IOSx 0 : TCx en capture dentre.

$0040 IOS7 IOS6 IOS5 IOS4 IOS3 IOS2 IOS1 IOS0 TIOS

Les sorties compares (OCx : Output Compare Nx)

Il s'agit de dclencher un instant donn une action logicielle ou matrielle (top sur une
ligne physique). On pourrait imaginer une boucle logicielle dattente de lgalit du registre
de comptage TCNT et d'une valeur donne. Par exemple, si la valeur est contenue dans le
registre double D, on pourrait crire la squence suivante :
RECOM CPD TCNT
BNE RECOM
La dure de la boucle est de 3 + 3 = 6 cycles machine. Si le timer est incrment chaque
cycle, lgalit cherche risque fort davoir lieu entre deux comparaisons successives, et donc
de ntre pas dtecte. La solution de faire un test dingalit est elle aussi malcommode
puisque le timer reboucle sur lui-mme. Le timer vite ces ennuis en utilisant un comparateur
matriel, qui positionne lindicateur CxF quand le compteur passe par la valeur du registre
TCx (utilis comme sortie compare). Ces 8 indicateurs composent le registre TFLG1.
$004E C7F C6F C5F C4F C3F C2F C1F C0F TFLG1

La monte du bit CxF entrane une interruption si le bit correspondant CxI de TIE est 1
$004C C7I C6I C5I C4I C3I C2I C1I C0I TIE

Dans le cas prcdent, lvnement de sortie compare est logiciel : monte dun indicateur.
Le timer offre en plus la possibilit de dclencher une action matrielle (top sur une ligne)
sur une sortie compare. Les lignes utilises sont les lignes du port T, PTx tant associe au
registre TCx. Le choix de la forme du top se fait dans les registres TCTL1 et TCTL2.
$0048 OM7 OL7 OM6 OL6 OM5 OL5 OM4 OL4 TCTL1
$0049 OM3 OL3 OM2 OL2 OM1 OL1 OM0 OL0 TCTL2

Exemple : soit rpter laction dfinie par le sous-programme ACTION tous les millimes
de seconde. Lvnement OC0, signal par la monte 1 du bit C0F du registre dtat,
signifie que le compteur est pass par la valeur affiche dans le registre TC0. Le programme
attend cet vnement en scrutant le bit C0F. Quand il sest produit, on excute laction, puis
on prpare les registres du timer pour la prochaine scrutation, cest dire en ajoutant la
priode TC0 et en remettant lindicateur C0F 0. On a la squence :
86 40 LDAA #$40
95 4E RECOM BITA TFLG1 Attente de lvnement OC0
27 FC BEQ RECOM (TCNT = TC0)
16 xxxx JSR ACTION Excution de laction
DC 50 LDD TC0 Prparation de TC0
C3 5DC0 ADDD #24000 pour le prochain coup
5C 50 STD TC0 (TC0 = TC0 + 24000)
86 40 LDAA #$40 Remise zro de
5A 4E STAA TFLG1 lindicateur C0F
20 EC BRA RECOM Bouclage

53
Le programme est indpendant de la dure du sous-programme ACTION, pourvu quelle soit
plus courte que la priode. La boucle de scrutation dure 6 cycles, ce qui donne une incertitude
de 6 cycles machine sur linstant dexcution du sous-programme ACTION. Mais les OC0
sont toujours exactement spars par une priode. Il ny a pas accumulation dincertitude.

En rsum :

A / Aucune sortie active. Les lignes physiques que le timer partage avec le port T restent la
proprit du port T

Choix des sorties = TC0


TCTL1 et TCTL2
= TC1
00000000 00000000
N7N6N5N4 N3N2N1N0 = TC2
= TC3
= TC4
Compteur gnral : TCNT
= TC5
= TC6
= TC7

Tmoin dgalit : TFLG1 1 1 1 1 1 1 1 1

B/ Quatre sorties actives


Quand TCNT = TC7, la patte associe (PT7) passe au niveau bas
Quand TCNT = TC4, la patte associe (PT4) passe au niveau haut
Quand TCNT = TC3, la patte associe (PT3) change de niveau
Quand TCNT = TC1, la patte associe (PT1) passe au niveau bas
Les pattes PT6, PT5, PT2 et PT0 restent des pattes du port T

Choix des sorties = TC0


TCTL1 et TCTL2
= TC1
10000011 01001000
N7N6N5N4 N3N2N1N0 = TC2
= TC3
= TC4
Compteur gnral : TCNT
= TC5
= TC6
= TC7

Tmoin dgalit : TFLG1 1 1 1 1 1 1 1 1

54
Les captures d'entre (ICx : Input Capture Nx)

Il s'agit de rcuprer linstant o se produit une action matrielle (top sur une ligne
physique, cest dire front montant ou descendant). On peut imaginer une boucle logicielle
dattente du front. Par exemple, pour attendre un niveau haut sur la ligne PH1 du port H, on
pourrait crire la squence suivante :
LDAA # 2
RECOM BITA PORTH
BEQ RECOM
La dure dune telle boucle est de 4 + 3 = 7 cycles machine. Elle reprsente lincertitude sur
la mesure du temps. On peut lviter en reliant physiquement la ligne au mcanisme de
capture.

Chaque capture utilise une ligne physique et un registre 16 bits. Ces lignes et ces registres
sont les mmes que pour les sorties compares, savoir les lignes du port T, la ligne PTx tant
associe au registre TCx. Le fonctionnement dune capture est le suivant. L'vnement sur la
ligne PTx dclenche une recopie du registre de comptage TCNT dans le registre de capture
TCx (choisi comme capture dentre). Cette capture est signale logiciellement par la monte
du bit CxF du registre dtat TFLG1. Cette monte entrane une interruption si le bit
correspondant CxI de TIE est 1.

Le type de front qui dfinit lvnement actif sur chaque ligne est choisi par deux bits
conscutifs dans les registres TCTL3 et TCTL4. Il peut sagir soit dun front montant, soit
dun front descendant, soit des deux. Si on nen choisit aucun, la capture dentre est
dvalide et la ligne correspondante du port T recouvre ses droits.
$004A EDG7B EDG7A EDG6B EDG6A EDG5B EDG5A EDG4B EDG4A TCTL3
$004B EDG3B EDG3A EDG2B EDG2A EDG1B EDG1A EDG0B EDG0A TCTL4

Exemple : la squence de programme suivante rcupre dans X linstant o sest produit une
transition active de la ligne PT1. (La squence ne dfinit pas la transition active).
86 02 LDAA #2 Mise zro de
5A 4E STAA TFLG1 lindicateur C1F
95 4E RECOM BITA TFLG1 Boucle dattente de
27 FC BEQ RECO la transition active
M
DE 52 LDX TC1 Rcupration du temps dans IX

La fonction capture dentre a t complte par des registres de rangement qui permettent
plus de souplesse dans les mesures de temps o on doit faire la diffrence entre deux entres
captures. Seuls les canaux 0, 1, 2 et 3 sont quips de ce gadget.

En rsum,

Dans lexemple qui suit, le contenu des registres TCTL3 et TCTL4 indique que seules les
pattes PT7, PT5, PT4 et PT2 peuvent dclencher des captures, PT7 et PT2 sur front
quelconque, PT5 sur front descendant et PT4 sur front montant. Les quatre autres pattes
restent des pattes dentre-sortie du port T

Il sensuit que les bits 6, 3, 1 et 0 du registre TFLG1 restent constamment 0

55
Choix des fronts actifs
TCTL3 et TCTL4
11001001 00110000
N7N6N5N4 N3N2N1N0

TC0
TC1
TC2
TC3

Compteur gnral : TCNT TC4


TC5
TC6
TC7

Tmoin dgalit : TFLG1 1 0 1 1 0 1 0 0

Accumulateurs dimpulsions.

Le module timer comporte quatre accumulateurs dimpulsions de 8 bits, associs aux pattes
PT0 PT3 du port T. Ces quatre accumulateurs bnficient aussi de registres de rangement.
$0062 PACNT7/15 PACNT6/14 PACNT5/13 PACNT4/12 PACNT3/11 PACNT2/10 PACNT1/9 PACNT0/8 PACN3
$0063 PACNT7 PACNT6 PACNT5 PACNT4 PACNT3 PACNT2 PACNT1 PACNT0 PACN2
$0064 PACNT7/15 PACNT6/14 PACNT5/13 PACNT4/12 PACNT3/11 PACNT2/10 PACNT1/9 PACNT0/8 PACN1
$0065 PACNT7 PACNT6 PACNT5 PACNT4 PACNT3 PACNT2 PACNT1 PACNT0 PACN0

Ces accus sont valids par un bit du registre ICPAR


$0068 0 0 0 0 PA3EN PA2EN PA1EN PA0EN ICPAR

Le type dimpulsion dclenchante est dtermin par les deux registres TCTL3 et TCTL4 dj
utiliss pour les captures dentre.

Les deux accumulateurs N 0 et 1 peuvent se cascader pour former laccumulateur 16 bits


PACB, dont le poids faible est PACN0 et le poids fort PACN1. La patte associe PACB est
la patte PT0. La notice prcise bien comment choisir entre deux accus 8 bits et 1 accu 16 bits.

Les deux accumulateurs N 2 et 3 peuvent se cascader pour former laccumulateur 16 bits


PACA, dont le poids faible est PACN2 et le poids fort PACN3. La patte associe PACA
est la patte PT7. La notice prcise bien comment choisir entre deux accus 8 bits et 1 accu 16
bits.

Tous les accumulateurs (8 bits et 16 bits) fonctionnent en accumulateur dimpulsion, depuis


quils sont activs jusqu ce quils soient invalids. Laccu PACA dispose en plus dun autre
mode de fonctionnement, le mode chronomtre, o il compte le nombre de tops dhorloge
entre deux fronts appliqus. Seule une lecture dtaille du mode demploi permettra den tirer
toutes les possibilits.

56
COURS n9

Les autres modules

A : LES CONVERTISSEURS ANALOGIQUES / NUMERIQUES

Gnralits

Le microcontrleur tudi contient deux modules identiques de conversion analogique


numrique de type ATD_10B8C. Ces deux modules sont dsigns par ATD0 (Analog To
Digital N 0) et ATD1 (Analog To Digital N 1). On se borne ici dcrire ATD0, ATD1 ne
diffrant que par les pattes physiques et ladresse de ses registres. Et pour allger lcriture, on
omettra le 0 pour parler simplement du module ATD.

Il sagit dun convertisseur analogique / numrique par approximations successives sur 10


bits, huit canaux dentre multiplexs. Bien que ce ne soit pas une obligation (voir
rfrences lectriques du module) on peut considrer que la prcision de la conversion est de
lordre dun bit poids faible, soit 1/1024 pleine chelle. Il sagit dune prcision respectable si
on travaille pleine chelle (5 mV sur 5V) mais vite faible si on nutilise quune partie de la
gamme possible.

Le bloc ATD prsente les caractristiques suivantes :


Choix de la rsolution (8 ou 10 bits).
Choix de la vitesse de conversion.
Echantillonneur bloqueur. Choix du temps dchantillonnage.
Rsultats justifis gauche ou droite, signs ou non.
Possibilit de contrle extrieur du dclenchement.
Possibilit de gnration dune interruption sur conversion complte.
Multiplexeur analogique pour 8 canaux dentre analogique.
Squences de conversions de 1 8.
Mode de conversion continu.
Scrutation de canaux multiples.

Bien que programmable, le temps de conversion est rgl par une horloge propre lATD
tablie par une division de lhorloge CPU. Les valeurs permises pour lhorloge ATD ne
dpassent pas 2 MHz. Une conversion sur 10 bits prendra donc 10 cycles, soit 5s, sans
compter le temps dchantillonnage. Celui-ci, programmable, occupe au moins 2 cycles
(premire phase) et 2 16 cycles (seconde phase), soit un minimum de 4 cycles et donc 2s.
Au total, la conversion dure un minimum de 14 cycles, soit 7 s.

b9 b8 b7 b6 b5 b4 b3 b2 b1 b0

EB(1) EB(2) Conversion 10 bits


Temps de conversion minimum (EB = 2)

57
Description du fonctionnement

Horloge CPU Horloge ATD


Pr-diviseur

Interruption sur Contrle du mode et du timing


conversion complte
Rsultats
Registre DR0
VRH dapproximations DR1
VRL successives (SAR) DR2
et DAC DR3
DR4
VDDA DR5
DR6
VSSA DR7
AN7/PAD7
AN6/PAD6
+
AN5/PAD5 Echantill-Bloqueur
AN4/PAD4 1 1 -
AN3/PAD3
AN2/PAD2 Comparateur
AN1/PAD1
AN0/PAD0
MUX Registre de validation dentre
analogique

Registre de donnes du Port AD

Le convertisseur peut mesurer de 1 8 signaux analogiques diffrents, appliqus aux entres


analogiques AN0 AN7, cest dire aux pattes PAD0 PAD7. Les entres analogiques sont
multiplexes, les conversions se faisant successivement sur chaque canal.

Une mesure consiste en un chantillonnage / blocage qui fige la tension mesurer pour la
dure de mesure, puis des comparaisons successives de la valeur bloque avec les tensions
successives (VRH-VRL)/2, (VRH-VRL)/4... (VRH-VRL)/2N fournies par un DAC intgr,
qui construisent le nombre de N bits correspondant la tension analogique. Le rangement de
la mesure se fait dans un des registres 16 bits de rsultats de DR0 DR7.

Lordonnancement des conversions et de leur rangement est assur par le bloc de contrle et
de timing, programmable grce de nombreux registres. Le principe de base est de procder
par squence, cest dire un enchanement aussi rapproch que possible de 1 8 mesures sur
le mme canal ou des canaux diffrents, les rsultats dune mme squence tant rangs dans
les registres de rsultats.

58
Principaux registres concerns

Pour fonctionner, lATD doit tre aliment. Cest le rle du bit ADPU du registre ATDCTL2.
On trouve galement dans ce registre des bits relatifs au dclenchement extrieur.
$0082 ADPU AFFC AWAI ETRIGLE ETRIGP ETRIGE ASCIE ASCIF ATD0CTL2

Le choix du timing de la conversion dpend du registre ATDCTL4, qui dfinit la frquence


de lhorloge ATD et le nombre de cycles dchantillonnage blocage.
$0084 SRES8 SMP1 SMP0 PRS4 PRS3 PRS2 PRS1 PRS0 ATD0CTL4

Le choix du nombre dlments de la squence (1 8) se fait dans le registre ATDCL3. Les


lments sont rangs dans les registres de rsultats dans lordre dexcution de la squence,
sauf si on est en mode FIFO o les rsultats saffichent sans cesse la suite en bouclant.
$0083 0 S8C S4C S2C S1C FIFO FRZ1 FRZ0 ATD0CTL3

Le registre ATDCTL5 est essentiel car cest une criture dans ce registre qui dclenche une
nouvelle squence de conversion, en arrtant au besoin celle en cours. Il fixe le N du canal
convertir en premier. En mode MULT, la squence se poursuit par celle des canaux suivants.
En mode simple, la squence rpte la mesure sur le mme segment. Le mode SCAN relance
une squence ds la fin de la prcdente, sinon lATD attend une nouvelle criture pour lancer
une nouvelle squence. Ce registre fixe en outre le format de sortie (cadrage droite ou
gauche, valeur signe ou non).
$0085 DJM DSGN SCAN MULT 0 CC CB CA ATD0CTL5

LATD dispose de deux registres dtat. ATDSTAT0 et ATDSTAT1 Le premier est


fondamental par son bit 7 (SCF) qui indique la fin dune squence de conversion. Les autres
bits de ce registre ainsi que ceux de lautre registre fournissent des informations plus fines sur
le droulement dune squence.
$0086 SCF 0 ETORF FIFOR 0 CC2 CC1 CC0 ATDSTAT0

Sur chacun des 8 registres de rangement 16 bits on doit ranger des nombres de 10 bits. Il y a
possibilit de diffrents cadrages. On trouvera le dtail dans la notice complte.

Pour tre complet il faut rappeler que les lignes dentre des canaux analogiques peuvent
aussi servir de lignes dentres logiques. Il y a des registres prvus pour valider ou non cette
possibilit et bien sr il existe le registre de port PAD dont les bits traduisent le cas chant
les niveaux logiques des pattes PAD0 PAD7.

59
B : LES LIAISONS SERIE SCI ET SPI

Comparaison entre transmission srie synchrone et asynchrone

Les liaisons srie ont en commun le transfert doctets bit bit sur une mme ligne. Un bit est
reprsent par un niveau haut ou bas de la ligne pendant un certain temps dfini par le nombre
de bauds (bits par seconde) et rgl par une horloge. On distingue deux types de
transmissions suivant les horloges utilises pour dcouper un octet et le recomposer.

Dans les deux cas, chaque bit est mis entre deux tops dhorloge* de lmetteur, pour tre
reconstitu la rception. Le rcepteur se place juste entre deux tops de son horloge (flches)
pour tomber au milieu de chaque bit et reconstituer loctet. Cela implique bien sr que les
horloges de lmetteur et du rcepteur soient synchronises.

Dans le cas dune liaison srie synchrone, les deux partenaires utilisent la mme horloge
(celle du matre, qui peut tre rcepteur ou transmetteur). La synchronisation est toujours
assure, mais le transfert exige un fil supplmentaire pour transmettre lhorloge..
Horloge transmetteur

Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7

Horloge rcepteur (= horloge transmetteur)

Dans le cas dune liaison srie asynchrone le rcepteur utilise son horloge qui a peu prs la
mme frquence que lmetteur et il la synchronise au dbut de chaque octet, la rception du
front descendant du bit start sur la ligne de donne. Si les frquences sont peu diffrentes, la
flche de rception tombe bien sur le bit, mais pas tout fait au milieu. Si elles diffrent de
plus de 5% environ, la reconstitution peut omettre un bit ou compter deux fois le mme.
Horloge transmetteur

Start Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 Stop

Synchronisation Horloge rcepteur

Le MC9S12DG256B dispose de trois modules de liaison srie synchrone : SPI0, SPI1 et SPI2
et de deux modules de liaison srie asynchrone : SCI0 et SCI1. Les trois modules SPI sont
rigoureusement identiques de mme que les deux modules SCI. Ils ne diffrent que par les
pattes physiques qui les relient lextrieur.

* Pour faciliter la lecture des schmas, on na fait figurer que les tops dhorloge. Ce signal
est en fait un signal carr, et les tops reprsentent un type de front (montant ou descendant).

60
Liaison srie synchrone SPI (Serial Peripheral Interchange)

Le microcontrleur dispose de trois modules SPI rigoureusement semblables. On dcrit SPI0,


SPI1 et SPI2 ne diffrant que par les pattes physiques et ladresse des registres. Et pour
allger lcriture, on omettra le 0 pour parler simplement du module SPI.

Le fonctionnement de la liaison SPI est a priori dissymtrique du fait de lutilisation dune


horloge commune. Le gnrateur de lhorloge commune est appel matre et lautre partenaire
de lchange est appel esclave.

Registre dcalage MISO MISO Registre dcalage


MOSI MOSI
Horloge SCK SCK
SS SS
MAITRE 5V ESCLAVE

En mode matre ou en mode esclave, la liaison SPI utilise quatre pattes du microcontrleur.
Le SPI0 les emprunte au port S : PTS4 = MISO (Master In Slave Out), PTS5 = MOSI (Master
Out Slave In), PTS6 = CLK (horloge) et PTS7 = SS (Slave Select). La figure ci-dessus prcise
la structure de la liaison synchrone et les principaux registres affrents. La dtection du signal
se fait avec lhorloge du matre, et la communication des donnes se fait par change
systmatique des contenus des registres SPIDR de donnes du matre et de lesclave.
$00DD BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 SPIDR

Pour le contrle des changes le SPI dispose


- dun registre de bauds SPIBR fixant la vitesse de transmission :
$00DA 0 SPPR2 SPPR1 SPPR0 0 SPR2 SPR1 SPR0 SPIBR

- dun registre dtat SPISR comportant trois indicateurs :


$00DB SPIF 0 SPTEF MODF 0 0 0 0 SPISR

- de 2 registres de contrle pour choisir parmi les diffrentes options proposes (cf notice) :
$00D8 SPIE SPE SPTIE MSTR CPOL CPHA SSOE LSBFE SPICR1
$00D9 0 0 0 MODFEN BIDIROE 0 SPISWAI SPCO SPICR2

On nentre pas plus dans le dtail de la liaison SPI, dont ltude et la manipulation se font
dans le cadre du cours dinformatique industrielle de deuxime anne.

Liaison srie asynchrone SCI (Serial Communication Interface)

Le microcontrleur dispose de deux modules SCI rigoureusement semblables. On dcrit SCI0,


SCI1 ne diffrant que par les pattes physiques et ladresse des registres. Et pour allger
lcriture, on omettra le 0 pour parler simplement du module SCI.

On a dj prsent ce type de liaison dans le dbut du cours. On y a vu notamment que deux


horloges diffrentes ne peuvent pas rester synchronises, ce qui impose lajout dun bit de
start et dun bit de stop pour une synchronisation au dbut de chaque octet transmis et un
contrle aprs le dernier bit.

61
La liaison SCI utilise deux pattes du microcontrleur. Pour le SCI0, ce sont les pattes du port
S : PTS0 = RxD (Rception de Donnes), PTS1= TxD (Transmission de Donnes). Le SCI1
utilise quant lui les pattes PTS2 et PTS3. La figure ci-dessous illustre le fonctionnement
dun module SCI. Le module se comporte en fait comme deux modules pratiquement
indpendants, un module de rception et un module de transmission.

Transmission donnes ($CF en criture) ($CF en lecture) Rception des donnes

contrle Registre dtat contrle


Dcalage des donnes transmission rception Dcalage des donnes
($CC)
TxD TE Gnrateur de bauds RE RxD
($C8 , $C9)

Le module de transmission comporte principalement un registre dcalage qui assure le


dcoupage et la transmission sur la ligne TxD de loctet quil contient. Pour envoyer un octet
sur le SCI il suffit de lcrire dans le registre de transmission du SCI. Il est alors recopi et
trait dans le registre dcalage. Bien entendu, des indicateurs permettent de contrler le bon
fonctionnement du systme et dviter des erreurs (notamment de bourrage).

Le module de rception comporte lui aussi un registre dcalage qui assure la reconstruction
de loctet partir du signal qui lui arrive par la patte RxD. Ds que cest fait, loctet est
recopi dans le registre de rception, et un indicateur signale son arrive. Bien entendu, le
travail de rception est contrl et divers indicateurs signalent les anomalies dans le transfert.

Ces modules ont en commun le registre de bauds SCIBD qui permet sur 13 bits de choisir la
vitesse de transmission et de rception selon la relation :
baud = horloge/(16 SBR).
Avec une horloge micro 24 MHz, le nombre de bauds peut aller de 183 (SBR = $1FFF)
1.500.000 bauds (SBR = 1). Sur la carte de TP, le moniteur D-Bug12 initialise SBR $9C, ce
qui donne environ 9615 bauds.
$00C8 0 0 0 SBR12 SBR11 SBR10 SBR9 SBR8 SCI0BDH
$00C9 SBR7 SBR6 SBR5 SBR4 SBR3 SBR2 SBR1 SBR0 SCI0BDL

Ils ont galement en commun ladresse du registre de donne SCIDRL. Bien quil sagisse de
deux registres distincts, on peut leur attribuer la mme adresse puisque le registre de rception
nest accessible quen lecture et le registre de transmission nest accessible quen criture.
$00CF R7/T7 R6/T6 R5/T5 R4/T4 R3/T3 R2/T2 R1/T1 R0/T0 SCI0DRL

Dans les deux registres de commande, un seul est important en premire utilisation, cest
SCICR2. Le bit TE (Transmit Enable) tablit laffectation de la patte PTS1 au module SCI en
tant que TxD et le bit RE (Receive Enable) tablit laffectation de la patte PTS0 au module
SCI en tant que RxD. Les quatre bits poids fort servent valider les demandes dinterruption
sur monte des indicateurs du registre dtat.
$00CB TIE TCIE RIE ILIE TE RE RWU SBK SCI0CR2

Le SCI propose en option la possibilit dchanger un 9e bit de donne. Cest la fonction du


registre SCIDRH. Dans un premier temps, on peut lignorer.

62
Le registre dtat du SCISR

$00CC TDRE TC RDRF IDLE OR NF FE PF SCI0SR1

Ce registre contient tous les indicateurs qui contrlent le bon fonctionnement du module, en
transmission comme en rception. Deux indicateurs sont fondamentaux :
- TDRE (Transmit Data Register Empty) indiquant quon peut envoyer un nouvel octet sur la
sortie srie, le prcdent tant parti
- RDRF (Receive Data Register Full) indiquant que le registre de rception est plein, donc
quune nouvelle donne vient darriver.

Tous les indicateurs du SCI sont remis 0 par deux oprations successives : une lecture du
registre dtat suivie dune lecture (RDRF) ou dune criture (TDRE) ladresse commune
des deux registres de donne. Cette technique de remise 0 suit de trs prs le fonctionnement
du module et est automatique dans un fonctionnement par scrutation. Elle diffre de la
mthode utilise dans les autres modules, o on remet un bit dtat 0 en y crivant un 1.

Exemple de sous programme dentre en scrutation :

*************************LIOCT **************************
* Rception d'un octet sur la liaison srie *
* Attend larrive dun caractre et le rcupre dans A *
* Aucun autre registre modifi sauf CCR, suivant A *
*********************************************************
LIOCT LDAA #$20 ; Attente de la monte
ATT BITA SCISR1 ; |de RDRF, bit 5 du
BEQ ATT ; |registre d'tat SCISR
LDAA SCIDRL ; Lecture de la donne
RTS

Exemple de sous programme de sortie en scrutation :

************************* SOROCT ************************


* Emission d'un octet sur la liaison srie *
* Attend que la ligne soit libre et *
* met l'octet contenu dans A *
* Aucun autre registre modifi sauf CCR, suivant A *
*********************************************************
SOROCT TST SCISR ; Attente de la monte
BPL SOROCT ; de TDRE, bit 7 de SCISR
STAA SCIDRL ; Envoi de la donne
RTS

63
64
65