You are on page 1of 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

Document crit par JP Perrin. Merci pour sa contribution.

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.

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).

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).

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.

Reprsentation schmatique du microcontrleur 9S12DG256B


VSSX VDDX PK PS7 PS6 PS5 PS4 PS3 PS2 PS1 PS0

PP7 PP6 PP5 PP4 PP3 1 PP2 PP1 PP0 PK3 PK2 PK1 PK0 PT0 PT1 PT2 PT3 VDD1 VSS1 PT4 PT5 PT6 PT7 PK5 PK4 PJ1 PJ0 BKGD PB0 PB1 PB2 PB3 PB4 28 PB5 PB6 PB7

PM0 PM1 PM2 PM3 PM4 PM5

VREGEN PJ6 PJ7

PM6 PM7 VSSA VRL


85 84 VRH

112

ATD
convertisseur analog/num

ECT
timer ECT_16B8C

CRG
clock & reset generator

PIM
gestion des ports t

EETS
EEPROM 4K

CPU
-processeur HCS12

SCI
commun. srie asynchrone

MICROCONTROLEUR
FTS
Mmoire Flash 256K

9S12DG256B
PWM
modulation de largeur pulse

SPI
commun. srie synchrone

CAN
Gestion des bus CAN

Autres priph.
BDLC, IIC, VREG

29

56

VDDA PAD15 PAD7 PAD14 PAD6 PAD13 PAD5 PAD12 PAD4 PAD11 PAD3 PAD10 PAD2 PAD9 PAD1 PAD8 PAD0 VSS2 VDD2 PA7 PA6 PA5 PA4 PA3 PA2 PA1 57 PA0

PH7 PH6 PH5 PH4

PE7 PE6 PE5 PE4 RESET

VSSR VDDR VDDPLL

XFC VSSPLL

TEST XTAL EXTAL

PH0 PH1 PH2 PH3

PE0 PE1 PE2 PE3

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 13, 65 2.5 V Alimentations internes gnres par le rgulateur interne VDD1 VDD2 0V et masses associes VSS1 VSS2 14, 66 41 5V Alimentation externe des drivers de pattes et du rgulateur VDDR 40 0V et masse associe VSSR 107 5V Alimentation externe des drivers de pattes VDDX 106 0V et masse associe VSSX Alimentation externe et masse pour les convertisseurs 83 5V VDDA analogique numriques et rfrence du rgulateur interne Permet de court circuiter lalimentation des convertisseurs 86 0V VSSA A/N indpendamment 85 0V Tension de rfrence haute des convertisseurs A/N. VRL 84 5V Tension de rfrence basse des convertisseurs A/N. VRH 43 2.5 V Fournit la tension et la masse ncessaires au PLL. Cela VDDPLL permet de court circuiter lalimentation du PLL indpendamment. Alimentation et masse gnres par le 45 0V VSSPLL rgulateur interne. 97 5V Validation/dvalidation du rgulateur interne VREGEN 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) Normal Expanded 1 0 1 Jamais Narrow 1 1 0 Special Peripheral Jamais Normal Expanded 1 1 1 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.
Adresse 0000-0017 0018-0019 001A-001B 001C-001F 0020-0027 0028-002F 0030-0033 0034-003F 0040-007F 0080-009F 00A0-00C7 00C8-00CF 00D0-OOD7 00D8-00DF 00E0-00E7 00E8-00EF 00F0-00F7 00F8-00FF 0100-010F 0110-011B 011C-011F 0120-013F 0140-017F 0180-01BF 01C0-01FF 0200-023F 0240-027F 0280-02BF 02C0-03FF Module CORE (Ports A, B, E, Modes, Inits, Test) Rserv PARTID Device ID register CORE (MEMSIZ, IRQ, HPRIO) Rserv CORE (Background Debug Mode) CORE (PPAGE, Port K) CRG Clock and Reset Generator (PLL, RTI, COP) ECT Enhanced Capture Timer 16-bit 8 channel ATD0 Analog to Digital Converter 10-bit 8 channel N0 PWM Pulse Width Modulator 8-bit 8 channel SCI0 Serial Communications Interface N0 SCI1 Serial Communications Interface N1 SPI0 Serial Peripheral Interface N0 IIC Inter IC Bus BDLC Byte Data Link Controller SPI1 Serial Peripheral Interface N1 SPI2 Serial Peripheral Interface N2 FTS Flash Control Register EETS EEPROM Control Register Rserv ATD1 Analog to Digital Converter 10-bit 8 channel N1 CAN0 Motorola Scalable Can N0 CAN1 Motorola Scalable Can N1 CAN2 Motorola Scalable Can N2 CAN3 Motorola Scalable Can N3 PIM Port Integration Module CAN4 Motorola Scalable Can N4 Rserv Taille (octets) 24 2 2 4 8 8 4 12 64 32 40 8 8 8 8 8 8 8 16 12 4 32 64 64 64 64 64 64 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 1000-3FFF RAM Array Fixed Flash EEPROM Array 4000-7FFF incl 0.5K, 1K, 2K or 4K Protected Sector at start 8000-BFFF Flash EEPROM Page Window Fixed Flash EEPROM array C000-FFFF incl 0.5K, 1K, 2K or 4K Protected Sector at end and 256 bytes of Vector Space at $FF80-$FFFF 4096 12288 16384 16384 16384

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 bit 7 (MSB)

0 bit 6

0 bit 5

0 bit 4

1 bit 3

0 bit 2

0 bit 1

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

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 0 0 0 0 0 A B Additionneur 0 0 1 1 0 A+B+C 0 1 0 1 0 + 0 1 1 0 1 C 1 0 0 1 0 2R+S 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 1 0 0 1 1 0 0 1 ($99=153) l'octet. Le rsultat rduit l'octet est donc tronqu ($5D = + 1 1 0 0 0 1 0 0 ($C4=196) 93) et l'indicateur C de retenue est 1. 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) 1 0 0 0 1 1 1 1 ($8F) 1 1 1 0 1 0 0 1 ($E9) Exemple 2 0 1 0 0 1 1 0 0 ($4C) 1 1 1 1 0 0 0 1 ($F1) 0 0 1 1 1 1 0 1 ($3D) Exemple 3 0 1 0 0 1 1 0 0 ($4C) 0 1 0 1 1 0 0 0 ($58) 1 0 1 0 0 1 0 0 ($A4) Exemple 4 1 1 0 0 0 1 0 1 ($C5) 1 0 1 1 0 0 1 1 ($B3) 0 1 1 1 1 0 0 0 ($78) En nombres non signs : 90+143=233 OK En nombres signs : 90+(-113)= -23 OK C=0 V=0 En nombres non signs :76+241=61 En nombres signs : 76+(-15)=61 OK C=1 V=0 En nombres non signs : 76+88=164 OK En nombres signs : 76+88=-92 C=0 V=1 En nombres non signs : 197+179=120 En nombres signs : (-59)+(-77)=120 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 0 C C LSL 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 C C ASL 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 C C C ROL 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 non R6 A6 B7 et R7 A7 B6 et R6 A6 B7 ou R7 A7 B6 ou R6 A6 B7 eor R7 par exemple 10101100 10101100 10101100 B6 eor R6 A5 non R5 A5 B5 et R5 A5 B5 ou R5 A5 B5 eor R5 A4 non R4 A4 B4 et R4 A4 B4 ou R4 A4 B4 eor R4 = = = = A3 non R3 A3 B3 et R3 A3 B3 ou R3 A3 B3 eor R3 A2 non R2 A2 B2 et R2 A2 B2 ou R2 A2 B2 eor R2 A1 non R1 A1 B1 et R1 A1 B1 ou R1 A1 B1 eor R1 A0 non R0 A0 B0 et R0 A0 B0 ou R0 A0 B0 eor R0

R=A

non R7 A7

R = A et B

et 0 1 0 0 0 1 0 1
Table de vrit

R = A ou B

ou 0 1 0 0 1 1 1 1
Table de vrit

R = A eor B

0 1 0 0 1 1 1 0
Table de vrit

non et ou eor

10101100 11110000 11110000 11110000

01010011 10100000, 11111100, 01011100

non $AC = $53 $AC et $F0 = $A0 $AC ou $F0 = $FC $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 : ou B B + valeur, A A + 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 Report (Carry) Stop Disable 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 : CLRA et se code 87 mettre A 0 scrit 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 : LDAA #$30 et se code 86 30 charger A avec loctet $30 scrit 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 : B6 10 00 charger A avec loctet dadresse $1000 scrit : LDAA $1000 et se code 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 8B 45 ADDA #$45 ;immdiat 7A 10 00 STAA $1000 ;tendu cas N1 86 45 LDAA #$45 ;immdiat BB 10 00 ADDA $1000 ;tendu 7A 10 00 STAA $1000 ;tendu 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 Inhrent Format source INST (pas doprande exterieur) INST #opr8i ou INST #opr 16i INST opr 8a INST opr16a INST rel 8 ou INST rel 16 INST oprx5,xysp INST oprx3,-xys INST oprx3,+xys INST oprx3, xysINST oprx3, xys+ INST abd, xysp INST oprx9,xysp INST oprx16,xysp Abrviation INH Description Les oprandes ventuels sont les registres CPU Loprande est inclus dans le flux dinstructions Taille 8 ou 16 bits suivant le contexte Loprande est les 8 bits poids faibles dune adresse dans la zone $0000 $00FF Loprande est une adresse 16 bits. Linstruction fournit un offset 8 ou 16 bits relatif au PC Offset sign constant 5 bits par rapport X, Y, SP ou PC Pr dcrment automatique de X,Y,SP de 1 8 Pr incrment automatique de X,Y,SP de 1 8 Post dcrment automatique de X,Y,SP de 1 8 Post incrment automatique de X,Y,SP de 1 8 Index avec un offset accumulateur 8 bits (A ou B) ou 16 bits (D) par rapport X, Y, SP ou PC Offset sign constant 9 bits / X, Y, SP ou PC (les 8 bits faibles doffset dans un octet dextension) Offset sign constant 16 bits / X, Y, SP ou PC (les16 bits doffset dans deux octets dextension) On trouve le pointeur sur loprande un offset constant de 16 bits par rapport X, Y, SP ou PC (Offset 16 bits dans deux octets dextension) On trouve le pointeur sur loprande X, Y, SP ou PC plus la valeur dans D

Immdiat Direct Etendu Relatif Index (5 bits doffset) Index (pr-dcrment) Index (pr-incrment) Index (post-dcrment) Index (post-incrment) Index (offset accum) Index (9 bits doffset) Index (16 bits doffset)

IMM DIR EXT REL IDX IDX IDX IDX IDX IDX IDX1 IDX2 [IDX2] [D,IDX]

Index indirect INST [oprx16,xysp] (16 bits doffset) Index indirect (offset accu D) INST [D,xysp]

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 Commentaires Code xb du code rr ; 00=X, 01=Y,10=SP, 11=PC (Post octet) 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) z0 = 9 bits avec signe dans LSB du post-octet -256n255 n,r 1 = 16 bits -32768 n32767 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) +8 = 0111 n,-r n,+r ... n,rrr1pnnnn +1 = 0000 n,r+ - 1 = 1111 ... - 8 = 1000 Offset accumulateur (8 bits ou 16 bits non signs) aa 00 = A A,r 01 = B B,r 111rr1aa 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 LDAA,LDAB,LDD,LDS,LDX,LDY,LEAS,LEAX,LEAY STAA,STAB,STD,STS,STX,STY MOVB,MOVW SEX,TAB,TBA,TAP,TFR,TPA,TSX,TSY,TXS,TYS EXG,XGDX,XGDY

Mise 0 Chargement Rangement Transferts mmoire Transferts de registres 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 SBCA,SBCB,SUBA,SUBB,SUBD

Addition 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 EDIV,EDIVS,FDIV,IDIV,IDIVS DEC,DECA,DECB,DES,DEX,DEY INC,INCA,INCB,INS,INX,INY ABA,ABX,ABY,SBA

Multiplication Division Dcrmentation Incrmentation 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 ASR,ASRA,ASRB,ASRD LSL,LSLA,LSLB,LSLD LSR,LSRA,LSRB,LSRD ROL,ROLA,ROLB ROR,RORA,RORB

Arithmtique gauche Arithmtique droite Logique gauche Logique droite Rotation gauche 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 NEG,NEGA,NEGB COM,COMA,COMB

Et,Ou,Ouexclusif Ngation Complmentation

27

Certaines oprations servent exclusivement positionner les indicateurs sans modifier les registres sur lesquels elles ralisent des oprations logiques fictives.
BITA,BITB CMPA,CMPB,CPD,CPS,CPX,CPY,CBA TST,TSTA,TSTB

Test de bits Comparaison 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 DEBUT

Instruction Oprande

Commentaire

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 [$1102]+[$1202]+carry0 = [$1302] avec carry1 [$1101]+[$1201]+carry1 = [$1301] avec carry2 [$1100]+[$1200]+carry2 = [$1300] avec carry3 Programmation HC12 Mnmonique Description de laction
LDAA ADDA STAA LDAA ADCA STAA LDAA ADCA STAA LDAA ADCA STAA $1103 $1203 $1303 $1102 $1202 $1302 $1101 $1201 $1301 $1100 $1200 $1300 ;Aoctet dadresse $1103 ;A=A+ octet dadresse $1203 ;A rang ladresse $1303 ;Aoctet dadresse $1102 ;A=A+C+octet dadresse $1202 ;A rang ladresse $1302 ;Aoctet dadresse $1101 ;A=A+C+octet dadresse $1201 ;A rang ladresse $1301 ;Aoctet dadresse $1100 ;A=A+C+octet dadresse $1200 ;A rang ladresse $1300

ADDA ADCA ADCA ADCA

Code instruction
1000 1003 1006 1009 100C 100F 1012 1015 1018 101B 101E 1021 B6 BB 7A B6 B9 7A B6 B9 7A B6 B9 7A 1103 1203 1303 1102 1202 1302 1101 1201 1301 1100 1200 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 Mnmonique Description de laction
CLRA ADDA ADDA ADDA ADDA ASRA ASRA STAA 0,x 1,x 2,x 3,x 4,x ;Au dpart, Somme nulle ;A=A+premire note ;A=A+seconde note ;A=A+troisime note ;A=A+p quatrime note ;A = A/2 ;A = A/2 ;Moyenne dans le tableau

Code instruction
1000 1001 1003 1005 1007 1009 100A 100B 87 AB AB AB AB 47 47 6A 00 01 02 03 04

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 LDAA #$1100 A,X ;X pointe sur le dbut du tableau H ;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 1010 1020 79 20 04 B6 - 20 00 7A 20 - 05 87 C7 74 - 20 01 24 03 F3 20 04 78 - 20 05 75 20 - 04 F7 20 01 - 26 ED 7C 20 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) = 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) = 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) = 1009 [PC]=87 : code sur 1 octet Mise jour de PC : PC = 100A dcodage et excution : ACCA 0 (CLRA) = 100A [PC]=C7 : code sur 1 octet Mise jour de PC : PC = 100B dcodage et excution : ACCB 0 (CLRB) = 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) = 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) carry = 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) = 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) = 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) = 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) = 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) Z = 101E [PC]=7C : code sur 3 octets Lecture des 2 octets restants (20 02) et mise jour du PC

PC

PC

PC

PC

PC

PC

Si PC

PC

PC

PC

PC

Si 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). SP = SP-1 dcrmentation du pointeur de pile SP(SP0 - 1) -1 octet : PSHA STAA [SP] rangement de A l'adresse N SP (SP0 - 1) SP = SP-2 dcrmentation du pointeur de pile SP (SP0 - 2) -1 mot : PSHX 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). LDAA [SP] chargement de A avec le contenu de SP (SP0) -1 octet : PULA SP = SP+1 incrmentation du pointeur de pile SP (SP0+1) LDX [SP] chargement de X avec [SP0, SP0+1] -1 mot : PULX 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 :
TFR X,Y PSHX PULY EXG X,Y PSHX PSHY 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 1101 CE 10 00 LDX 1104 09 DEX 1105 26 FD 1107 30 1108 3D BNE PULX RTS

#$1000 $01104

;Mise labri du contenu de IX dans la pile ;IX=1000 ;IX=IX-1 (positionne lindicateur Z) ;Bouclage si non Z (X 0) ;Sinon, cest fini, on rcupre IX en pile ;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 1003 BD 01 00 JSR 1006 ........ ... 1100 09 1101 26 FD 1103 39 DEX BNE RTS 1100 #$1234 $1100 ...

;Passage de la dure de la tempo par IX ;Appel du sous programme de temporisation ;Et cetera ;IX=IX-1 (positionne lindicateur Z) ;Bouclage si non Z (X 0) ;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 LDX BSR ... OCTHEX PSHA ANDA BSR TFR PULA LSRA LSRA LSRA LSRA BSR STD RTS CMPA BLO ADDA ADDA RTS #$B4 #$2000 OCTHEX ...

;A contient loctet 10110100 ;et X ladresse de la chane $2000 ;Appel du sous programme OCTHEX ;Mise labri de loctet traiter ;Extraction du quartet faible ;Caractre hex dcrivant le quartet faible ;rang dans B ;Rcupration de loctet initial ;| ;|Extraction du quartet fort ;| ;| ;Caractre hex dcrivant le quartet fort ;Rangement des deux caractres aux adresses X et X+1 ;| ;| ;|Voir plus haut dans ce chapitre ;| ;|

#$F CARQ A,B

CARQ 0,X #10 PLUS #7 #$30

CARQ

PLUS

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 0,X - Soit au dbut de OCTHEX, pour tre rcupre avant linstruction STD - Soit dans CARQ qui prend alors lallure suivante :
PSHX LDX LDAA PULX RTS

#$1100 A,X

;Mise labri du X du programme appelant ;X pointe sur le dbut du tableau H ;AH[A]. A est charg avec llment N A du tableau ;Rcupration de la valeur prserve ;

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 main ldaa ldab bsr bra aba bsr rts asla aba rts $1000 #3 #4 addi * addi2 PC 1000 1002 1004 1008 100A 100D 100E 1010 100C 1006 SP0-4 SP0-3 SP0-2 SP0-1 xx xx xx xx xx xx xx xx xx xx xx xx xx xx 10 06 100D xx xx 10 06 10 0C 10 06 10 0C 10 06 10 0C 10 06 10 0C 10 06 1006 10 0C 10 06 #03 #04 1008 A xx 03 03 03 07 07 0E 0E 0E 0E B xx xx 04 04 04 04 04 04 04 04 SP SP0 SP0 SP0 SP0-2 SP0-2 SP0-4 SP0-4 SP0-4 SP0-2 PILI

addi

addi2

LDAA LDAB BSR ABA BSR ASLA ABA RTS RTS BRA

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 soustraitant 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. Pull-down 5V
C C patte Pull-up patte

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 M P + + + + + + + + + + + + + + MEBI B E + + + + ATD K Pad0 Pad 1 + + + +

Registre (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

H + + + + + + + +

J + + + + + + + +

S + + + + + +

T + + + + + +

A + +

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 1

IOR

0 1

Patte

Le bit IOR reproduit ltat physique de la patte sil est en entre (DDR = 0). En sortie (DDR = 1), il lit le buffer Si module enable = 0 (pas de module), et DDR = 1 (sortie), la patte recopie IOR. En prsence de module, IOR et DDR sont court-circuits et la patte prend la donne fournie par le module. On remarque bien que le transfert de la donne depuis le module vers la patte se fait mme si DDR = 0.

DDR
Data out

0 1

Module Output Enable


Module Enable

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 5A 02 86 80 94 00 27 06 86 01 9A 00 20 04 86 FE 94 00 5A 00 20 EC

RECO M

LDAA #%01111111 STAA DDRA LDAA #%10000000 ANDA BEQ LDAA ORAA BRA LDAA ANDA STAA BRA
PORTA ZERO #1 PORTA PLUS #%11111110 PORTA PORTA RECOM

Programmation de la direction des lignes Toutes en sortie sauf PA7 Rcupration du niveau de la ligne PA7 Si cest 1, On prpare le registre A pour crire un 1 dans PA0 Si cest 0, On prpare le registre A pour crire un 0 dans PA0 Mise de PA0 au niveau sans toucher les autres Et bouclage

ZERO PLUS

Exemple 2 : Compter le nombre de fronts descendants sur la patte Port H0 par scrutation. 79 2000 86 FF 7A 0264 86 01 B5 0267 27 FB 72 2000 7A 0267 20 F3

ATT

CLR LDAA STAA LDAA BITA BEQ INC STAA BRA

CPT #$FF PERH #1 PIFH ATT CPT PIFH ATT

;Compteur 0 au dpart ;Pull-up pour tout le port H ;(ou front descendant actif) ;test du bit 0 de PIFH ;(attente d'une transition ;active de la ligne PH0). ;Quand c'est le cas, on incrmente le compteur ;et on abaisse le flag (en crivant un 1 dedans) ;et on reboucle

Exemple 3 : Compter le nombre de fronts descendants sur la patte Port H0 par interruption. 79 2000 86 FF 7A 0264 86 01 7A 0267 14 10 B5 0266 CE 101E 7E 3E4C 10 EF 20 FE 72 2000 86 01 7A 0267 20 F3

CLR LDAA STAA LDAA STAA SEI STAA LDX STX CLI BRA

CPT #$FF PERH #1 PIFH

;Compteur 0 au dpart ;Pull-up pour tout le port H ;(ou front descendant actif) ; ;On abaisse le flag (rien ne sest encore pass) ;Invalidation des interruptions au niveau du CPU PIEH ;Validation dinter sur front descendant de PH0 #ETDUN ;Installation de la tche en crivant le $3E4C ;vecteur dinterruption ladresse RAM ;active de la ligne PH0). * ;Programme principal ;On incrmente le compteur ;et on abaisse le flag ;(en crivant un 1 dedans) ;Fin de tche

ETDUN INC CPT LDAA #1 STAA PIFH RTI

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). SP = SP-1 dcrmentation du pointeur de pile SP(SP0 - 1) -1 octet : PSHA 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). LDAA [SP] chargement de A avec le contenu de SP (SP0) -1 octet : PULA SP = SP+1 incrmentation du pointeur de pile SP (SP0+1) LDX [SP] chargement de X avec [SP0, SP0+1] -1 mot : PULX 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 :
TFR X,Y PSHX PULY EXG X,Y PSHX PSHY 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 sousprogramme : - 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 1101 CE 10 00 LDX 1104 09 DEX 1105 26 FD 1107 30 1108 3D BNE PULX RTS

#$1000 $01104

;Mise labri du contenu de IX dans la pile ;IX=1000 ;IX=IX-1 (positionne lindicateur Z) ;Bouclage si non Z (X 0) ;Sinon, cest fini, on rcupre IX en pile ;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 1003 BD 01 00 JSR 1006 ........ ... 1100 09 1101 26 FD 1103 39 DEX BNE RTS 1100 #$1234 $1100 ...

;Passage de la dure de la tempo par IX ;Appel du sous programme de temporisation ;Et cetera ;IX=IX-1 (positionne lindicateur Z) ;Bouclage si non Z (X 0) ;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 main ldaa ldab bsr bra aba bsr rts asla aba rts $1000 #3 #4 addi * addi2 PC 1000 1002 1004 1008 100A 100D 100E 1010 100C 1006 SP0-4 SP0-3 SP0-2 SP0-1 xx xx xx xx xx xx xx xx xx xx xx xx xx xx 10 06 100D xx xx 10 06 10 0C 10 06 10 0C 10 06 10 0C 10 06 10 0C 10 06 1006 10 0C 10 06 #03 #04 1008 A xx 03 03 03 07 07 0E 0E 0E 0E B xx xx 04 04 04 04 04 04 04 04 SP SP0 SP0 SP0 SP0-2 SP0-2 SP0-4 SP0-4 SP0-4 SP0-2 PILI

addi

addi2

LDAA LDAB BSR ABA BSR ASLA ABA RTS RTS BRA

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 $004E C7I C7F TOI TOF C6I C6F 0 0 C5I C5F 0 0 C4I C4F 0 0 C3I C3F TCRE 0 C2I C2F PR2 0 C1I C1F PR1 0 C0I C0F PR0 0 TIE TFLG1 TSCR2 TFLG2

$004D $004F

: Linterruption sur dbordement timer (TOF) est valide si TOI = 1

- 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 $00CC TIE TDRE TCIE TC RIE RDRF ILIE IDLE TE OR RE NF RWU FE SBK PF SCI0CR2 SCI0SR1

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


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

Module PIM (portH) Un front actif sur PHx (PIFHx = 1) dclenche une inter si PIEHx = 1
$0266 $0267 PIEH7 PIFH7 PIEH6 PIFH6 PIEH5 PIFH5 PIEH4 PIFH4 PIEH3 PIFH3 PIEH2 PIFH2 PIEH1 PIFH1 PIEH0 PIFH0 PIEH 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 clr cpt+1 ldaa #$80 staa TSCR1 * Boucle principale recom ldaa #$80 att bita TFLG2 beq att staa ldx inx stx bra TFLG2 cpt cpt recom ;Initialisation 0 ;du compteur 16 bits ;Lancement du compteur ;TCNT du timer ;On veut tester le bit 7 ;Attente de sa monte ;(bit 7 = TOF) ;Redescente de TOF ;| ;|Incrmentation du compteur ;| ;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 staa ldx inx stx rti #$80 TFLG2 cpt cpt ;| ;|Redescente de TOF ;| ;|Incrmentation du compteur ;|

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 ldaa staa ldx stx cli #$80 TSCR2 #avance $FFDE ;Masquage des IRQ ;Validation de l'inter ;au niveau du timer ;Installation de avance comme ;tche de dbordement timer ;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 sousprogrammes 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 [02] [02] [01] [03] [03] [05] 3C TEMPO CE EA5C 09 ATTEN 26 FD 30 3D

JSR PSHX LDX DEX BNE PULX RTS

TEMPO Appel du sous programme Sauvegarde du registre IX Nombre de boucles dattente Dcrmentation de IX ATTEN jusqu arriver 0 Rcupration du registre IX Retour du sous programme #59996

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] [01] [03] [03] [01] [03] [03] [01] CE 0000 86 01 95 00 27 FC 08 95 00 26 FB 09

LDX LDAA ATTEN BITA BEQ ATTE2 INX BITA BNE DEX

#0 Initialisation du compteur (X) #1 PORTA Attente du passage 1 ATTEN de la ligne 0 du port A Incrmentation du compteur PORTA Attente du passage 1 ATTE2 de la ligne 0 du port A 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 cidessous. 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

Horloge bus

Pr-diviseur Compteur 16 bits

Inter compteur module Inter canal 0 Inter canal 1 Inter canal 2 Inter canal 3 Inter canal 4 Inter canal 5 Inter canal 6 Inter canal 7 Inter Dbordement PA Inter entre PA Inter Dbordement PB

Compteur module 16 bits

Registres

Accumulateur dimpulsions A 16 bits Accumulateur dimpulsions B 16 bits

Canal 0 Capture dentre Sortie compare Canal 1 Capture dentre Sortie compare Canal 2 Capture dentre Sortie compare Canal 3 Capture dentre Sortie compare Canal 4 Capture dentre Sortie compare Canal 5 Capture dentre Sortie compare Canal 6 Capture dentre Sortie compare Canal 7 Capture dentre Sortie compare

IOC 0

IOC 1

IOC 2

IOC 3

IOC 4

IOC 5

IOC 6

IOC 7

Registre de comptage du timer


$0044 $0045 TCNT15 TCNT7 TCNT14 TCNT6 TCNT13 TCNT5 TCNT12 TCNT4 TCNT11 TCNT3 TCNT10 TCNT2 TCNT9 TCNT1 TCNT8 TCNT0 TCNT

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 $004D TEN TOI TSWAI 0 TSFRZ 0 TFFCA 0 0 TCRE 0 PR2 0 PR1 0 PR0 TSCR1 TSCR2

Les trois bits poids faibles du registre TSCR2 qui dfinissent la valeur de N. 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 $0049 OM7 OM3 OL7 OL3 OM6 OM2 OL6 OL2 OM5 OM1 OL5 OL1 OM4 OM0 OL4 OL0 TCTL1 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 95 4E RECOM 27 FC 16 xxxx DC 50 C3 5DC0 5C 50 86 40 5A 4E 20 EC

LDAA BITA BEQ JSR LDD ADDD STD LDAA STAA BRA

#$40 TFLG1 RECOM ACTION TC0 #24000 TC0 #$40 TFLG1 RECOM

Attente de lvnement OC0 (TCNT = TC0) Excution de laction Prparation de TC0 pour le prochain coup (TC0 = TC0 + 24000) Remise zro de lindicateur C0F 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 TCTL1 et TCTL2 00000000 00000000
N7N6N5N4 N3N2N1N0

= = = =

TC0 TC1 TC2 TC3 TC4 TC5 TC6 TC7

Compteur gnral : TCNT = = = 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 TCTL1 et TCTL2 10000011 01001000
N7N6N5N4 N3N2N1N0

= = = =

TC0 TC1 TC2 TC3 TC4 TC5 TC6 TC7

Compteur gnral : TCNT = = = 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 $004B EDG7B EDG3B EDG7A EDG3A EDG6B EDG2B EDG6A EDG2A EDG5B EDG1B EDG5A EDG1A EDG4B EDG0B EDG4A EDG0A TCTL3 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). Mise zro de 86 02 LDAA #2 5A 4E STAA TFLG1 lindicateur C1F 95 4E RECOM BITA TFLG1 Boucle dattente de 27 FC BEQ RECO la transition active M DE 52 Rcupration du temps dans IX LDX TC1 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 $0063 $0064 $0065 PACNT7/15 PACNT6/14 PACNT5/13 PACNT4/12 PACNT3/11 PACNT2/10 PACNT7 PACNT6 PACNT5 PACNT4 PACNT3 PACNT2 PACNT7/15 PACNT6/14 PACNT5/13 PACNT4/12 PACNT3/11 PACNT2/10 PACNT7 PACNT6 PACNT5 PACNT4 PACNT3 PACNT2 PACNT1/9 PACNT0/8 PACNT1 PACNT0 PACNT1/9 PACNT0/8 PACNT1 PACNT0 PACN3 PACN2 PACN1 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

Pr-diviseur

Horloge ATD

Interruption sur conversion complte

Contrle du mode et du timing Registre dapproximations successives (SAR) et DAC


Rsultats DR0 DR1 DR2 DR3 DR4 DR5 DR6 DR7

VRH VRL VDDA VSSA AN7/PAD7 AN6/PAD6 AN5/PAD5 AN4/PAD4 AN3/PAD3 AN2/PAD2 AN1/PAD1 AN0/PAD0 MUX
analogique

+
Echantill-Bloqueur

Comparateur

Registre de validation dentre 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 Horloge MAITRE

MISO MOSI SCK SS


5V

MISO MOSI SCK SS

Registre dcalage

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 $00D9 SPIE 0 SPE 0 SPTIE 0 MSTR MODFEN CPOL BIDIROE CPHA 0 SSOE SPISWAI LSBFE SPCO SPICR1 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) Dcalage des donnes TxD contrle transmission TE Registre dtat ($CC) ($CF en lecture) Rception des donnes contrle rception RE Dcalage des donnes RxD

Gnrateur de bauds ($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 $00C9 0 SBR7 0 SBR6 0 SBR5 SBR12 SBR4 SBR11 SBR3 SBR10 SBR2 SBR9 SBR1 SBR8 SBR0 SCI0BDH 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

You might also like