Professional Documents
Culture Documents
Cours de Microcontrleurs
Bas sur lutilisation du HCS12 (Motorola)
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.
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.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.
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
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
XFC VSSPLL
Le microcontrleur 9S12DG256B qui quipe les kits dvaluation de la salle de TP runit autour dun microprocesseur HCS12 4K dEEPROM, 16K de RAM et 256K de mmoire Flash, ainsi que des priphriques parmi lesquels des ports dentre-sortie logiques (PIM), un timer (ICT), deux convertisseurs analogiques numriques 10 bits 8 voies (ATD0 et ATD1), deux interfaces srie asynchrones (SCI0 et SCI1), trois interfaces srie synchrones (SPI0, SPI1 et SPI2). Il contient encore dautres priphriques, qui ne seront pas abords dans ce cours, faute de temps. Le microcontrleur dispose galement de possibilits dextension de bus 8 ou 16 bits vers lextrieur. Pour communiquer avec lextrieur, le microcontrleur dispose en tout et pour tout de 112 pattes. Cest beaucoup trop peu pour rpondre aux besoins de tous les modules priphriques, qui ne sont pas tous disponibles simultanment. Lorganisation du microcontrleur comprend
9
tout un arsenal de techniques pour choisir la configuration qui correspond le mieux au traitement dun problme donn. Pour commencer, on va faire le tour du propritaire pour savoir prcisment de quoi on dispose.
Description physique des pattes
Alimentations : Les alimentations utilisent 15 pattes. - Six dentre elles groupes en trois couples, [VDDR, VSSR], [VDDX, VSSX], et [VDDA, VSSA] se partagent lalimentation des modules du microcontrleur. - Six autres pattes [VDD1, VSS1], [VDD2, VSS2] et [VDDPLL, VSSPLL] alimentent le cur du micro (CPU et son environnement immdiat). Ces tensions proviennent soit du rgulateur interne, soit dalimentations externes. - La patte VREGEN valide ou non le rgulateur interne. - Les pattes VRH et VRL sont les rfrences de tension du convertisseur A/N. Sur la carte de TP, toutes les masses sont connectes, les trois alimentations VDDR, VDDX et VDDA, sont relies VDD = 5V. VREGEN est 5V, ce qui valide le gnrateur interne. Les rfrences du convertisseur sont relies VDD (pour VRH) et la masse (pour VRL). Le tableau ci-dessous rcapitule les pattes dalimentation Nom patte N patte Tension Description (/112) Nominale 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
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
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
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.
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
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
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
24
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.
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
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
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
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
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
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
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
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 ;| ;|
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
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
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
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
40
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
;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
;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
41
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.
43
#$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.
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
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.
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.
$004D $004F
- 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 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
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
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
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
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
Registres
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
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
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
= = = =
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
= = = =
1 1 1 1 1 1 1 1
54
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
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
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
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
57
Description du fonctionnement
Horloge CPU
Pr-diviseur
Horloge ATD
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
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
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
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
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
- 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.
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
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
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
63
64
65