68HC11
Les circuits de la famille 68HC11 sont construits
à partir du même noyau de base. Ce noyau contenant toutes
les fonctionnalités de ces circuits, il suffit de l'étudier
complètement pour pouvoir ensuite être capable de mettre en
œuvre n'importe quel 68HC11.
La mémoire se subdivise au maximum en trois blocs distincts dont la taille et la présence varient selon les références exactes du circuit.
Des entrées / sorties séries sont aussi disponibles et peuvent fonctionner en mode synchrone ou asynchrone selon que l'on utilise la SPI (Serial Peripheral Interface) de type asynchrone ou la SCI (Serial Communication Interface) de type asynchrone.
Un timer divisé en quatre blocs fonctionnels distincts :
Toute la logique nécessaire, tant au traitement
des interruptions qu'à la génération de l'horloge
est évidemment intégrée dans le 68HC11 dont la mise
en œuvre matérielle est ainsi fort simple puisque dans de nombreux
cas, un quartz et une cellule R C pour le Reset sont les seuls composants
externes indispensables pour le pilotage de cette logique. Le circuit peut
fonctionner selon deux modes : un mode "single chip" ou circuit seul et
un mode "expanded" (étendu) qui lui permet alors d'adresser des
circuits externes comme n'importe quel microprocesseur ordinaire. Dans
ce dernier cas, les lignes des ports B et C se transforment en lignes d'adresses
et de données comme nous le verrons au moment opportun.
La famille 68HC11 contient plus de 44 versions différentes.
Précisons que toutes sont bâties à partir du noyau
de base que nous venons de décrire rapidement.
Elles diffèrent essentiellement les unes des autres par les tailles des mémoires, le nombre d'entrées analogiques disponibles et parfois le nombre de SCI présentes.
Nous allons voir maintenant quels sont les noms et
les fonctions des diverses broches que l'on peut rencontrer sur les boîtiers
des circuits de la famille HC11 étant entendu que certaines pourront
être absentes sur certaines versions de circuits.
La description qui suit est une présentation générale des fonctions de ces broches. Certaines d'entre-elles pourront êtres étudiées ensuite plus en détail selon les applications et l'utilisation des ressources internes.
VDD (+V) et VSS (masse) (Alimentation du boîtier)
Bien qu'il soit réalisé en technologie HCMOS, le 68HC11 s'alimente typiquement sous cinq volts, Dans ces conditions, ses entrées / sorties sont compatibles TTL LS ou CMOS alimentés sous la même tension. Du fait de la rapidité des transitions des signaux logiques inhérente à la technologie HCMOS, cette alimentation doit être parfaitement découplée et au plus près du boîtier pour éviter tout problème. La meilleure solution est de faire appel à un condensateur de 1 µF (tantale) en parallèle sur un condensateur de 10 nF.
MODA/LIR et MODB/Vstby (Sélection du mode)
Lors d'un Reset du circuit, les broches sont des entrées appelées MODA et MODB et permettent de sélectionner un mode de fonctionnement du circuit comme présenté dans le tableau 1.3.
EXTAL, XTAL et E (broches de l'horloge)
Connexion d'un quartz ou d'une horloge externe.
La fréquence du quartz est 4 fois la fréquence
interne du 68hc11.
E (Sortie d'horloge bus)
L'état haut ou bas permet de savoir si des données ou des adresses valides sont présentes sur le bus du 68HC11. Parfois indispensable en mode étendu pour dialoguer correctement avec certains périphériques.
RESET (Remise à l'état initial)
Contrairement à de nombreux circuits, c'est une ligne bidirectionnelle. Utilisée en entrée et forcée à la masse, elle provoque une initialisation du circuit. Si par contre un événement interne anormal survient tel que par exemple la détection par le chien de garde ou COP d'une anomalie, ce dernier provoque un Reset interne du 68HC11 mais fait aussi générer un niveau bas à cette patte afin que cette information puisse le cas échéant, être exploitée par des boîtiers externes. Afin d'éviter l'altération du contenu de l’EEPROM mais aussi de certains registres réalisés selon la même technologie, il est fortement conseillé de piloter cette broche par un circuit détectant automatiquement toute baisse de VDD en dessous de la valeur limite autorisée et générant alors un Reset dans ce cas.
/IRQ et /XIRQ (Entrées d'interruptions externes)
/IRQ est une entrée d'interruption masquable alors
que /XIRQ est non masquable. Les circuits générant un niveau
bas sur ces entrées doivent être conçus de telle façon
que le niveau soit maintenu jusqu'à ce que le 68HC11 l'ait pris
en compte, sauf éventuellement pour l'entrée /IRQ qu'il est
possible de programmer sur un front descendant. Chacune de ces entrées
doit être ramenée à VDD par une résistance de
4,7 kW placée près de la patte
correspondante du boîtier. Si plusieurs circuits sont connectés
ensembles sur l'une ou l'autre de ces entrées, ils travaillent en
"OU" câblé en forçant /IRQ ou /XIRQ à la masse.
C'est au logiciel de reconnaître ensuite le circuit interrupteur
en procédant à une interrogation systématique des
circuits concernés (technique de "polling"). L'interruption ne prend
fin qu'en présence de l'instruction RTI pour récupérer
tous les registres internes et continuer le programme interrompu.
VRL et VRH (Tensions de référence pour le convertisseur)
Sont respectivement les entrées de référence basse et haute du convertisseur analogique / numérique. Le convertisseur étant du type à redistribution de charge, la consommation de courant sur ces broches est quasi nulle. Afin de conserver une bonne précision au convertisseur l'écart entre VRL et VRH doit être au moins de 2,5 V. Par ailleurs ces tensions ne doivent pas devenir supérieures (pour VRH) et inférieures (pour VRL) aux alimentations du circuit.
PE0 à PE7 (entrées du port parallèle E)
Ces lignes sont unidirectionnelles et ne fonctionnent qu'en entrée. De plus elles sont partagées avec les entrées du convertisseur analogique / numérique mais malgré cela, il est possible de les utiliser simultanément dans les deux modes. En effet, lors d'une entrée de donnée numérique (pendant une phase d'échantillonnage), le buffer interne correspondant n'est mis en fonction qu'un très court instant ce qui peut introduire à ce moment une légère perturbation.
PD0 à PD5 (entrées / sorties parallèles du port D)
Elles sont communes avec les lignes des ports série de la SPI et de la SCI. La figure 1.1 (Synoptique) précise l'affectation relative de ces pattes aux différentes lignes spécifiques de ces interfaces. Il est évident qu'ici aussi toute simultanéité de fonction est impossible sauf quelques cas particuliers.
PC0 à PC7 (entrées / sorties parallèles du port C en mode circuit seul)
En mode étendu, elles deviennent les lignes où circulent les données et les huit bits de poids faibles des adresses en mode multiplexé. La ligne AS (Address Strobe) dont le rôle est alors tenu par la patte STRA indique si le port C véhicule des adresses (AS au niveau haut) ou si ce sont des données (AS au niveau bas). Le rôle de la ligne lecture écriture est tenu quant à lui par la patte STRB.
PB0 à PB7 (sorties parallèles du port B en mode circuit seul)
En mode étendu, elles deviennent les adresses comme pour le port C. Il est évident que, si le circuit est utilisé en mode étendu, les sorties PBO à PB7 et les entrées / sorties PCO à PC7 sont perdues. Il est toutefois possible de les "récupérer" en plaçant sur le bus externe du 68HC11 un boîtier appelé 68HC24 ou PRU (Port Replacement Unit) qui présente alors le même aspect vu du logiciel, que les ports B et C "perdus".
STRA et STRB
Sont respectivement AS et R/W en mode étendu. En mode circuit seul, ces lignes peuvent être utilisées pour divers protocoles de dialogue via les ports B et C.
STRA est sensible à un front et permet de mémoriser dans un registre spécial associé au port C les données appliquées sur celles des lignes de PCO à PC7 qui ont été placées en entrées. Le sens du front actif est programmable par logiciel. Si elle n'est pas utilisée pour provoquer cette mémorisation, STRA peut toujours servir à provoquer une interruption lors de la réception d'un front actif. Attention, si elle n'est pas utilisée en mode circuit seul, STRA doit être ramenée au VDD par une résistance de rappel de 4,7 à 10 kW .
STRB quant à elle est une sortie indiquant lorsque des données valides sont présentes sur les lignes des ports B et C qui ont été placées en sorties (fonction "strobe"). Si STRB n'est pas utilisée en tant que telle, elle peut servir de sortie à usage général mais sa manipulation est moins simple que celle d'une classique ligne de port. Tout cela est précisé en détail au chapitre consacré aux ports parallèles.
Le port A (Partagé avec le Timer et l'accumulateur d'impulsions)
PA0, PA1, PA2 sont figées en entrées (entrées de capture IC3 à IC1 du timer).
PA3, PA4, PA5, PA6 sont figées en sorties (comparaison OCI à OC5 du timer)
PA7 est bidirectionnelle et peut être configurée comme entrée de capture ou sortie de comparaison. Si le timer à accumulation d'impulsions est utilisé, c'est également PA7 qui lui sert d'entrée. Dans le cas ou le timer n'est pas utilisé, les sorties peuvent servir en tant que sorties parallèles à usage général.
Le circuit est monté tout seul, avec aucun
circuit périphérique.
Le circuit est monté avec des périphériques
(mémoires, interfaces …). Le démultiplexage des adresses
de poids faibles et des données est assuré par un octuple
latch 74HC373 grâce à la ligne AS dont les temps de fonctionnement
ont été spécialement prévus pour cela.
Les lignes E et R/W sont ensuite utilisées pour
valider les différents circuits en présence.
L'unité centrale du 68HCll est un modèle
8 bits disposant de fonctionnalités particulières lui permettant
d'exécuter avec un maximum de souplesse certaines instructions,
y compris arithmétiques et logiques sur 16 bits. Elle est issue
de l'unité centrale qui équipait les 6801 mais enrichie de
nouvelles instructions.
Nous vous proposons de découvrir dans ce chapitre, la structure de cette unité centrale ainsi que son comportement lors d'un Reset ou d'interruptions.
Les 7 registres internes vous sont présentés
figure 2.1. C'est une architecture classique chez Motorola avec des registres
aux fonctions bien définies contrairement à certaines familles
de microcontrôleurs où tous les registres sont parfois polyvalents.
Accumulateurs A et B (registres 8 bits)
Ces accumulateurs supportent toutes les instructions arithmétiques et logiques que connaît le 68HC11. Ils peuvent être utilisés de façon totalement indépendante l'un de l'autre sans restriction. Ils peuvent également être concaténés pour former un seul accumulateur 16 bits qui s'appelle alors D (Double accumulateur).. Attention, cet accumulateur n’est pas indépendant de A et B ce qui signifie que si vous avez utilisé A et B puis que vous fassiez appel ensuite à D, D sera, constitué par la mise bout à bout de A et B (A étant l'octet de poids forts).
Registres d'index X et Y (16 bits)
Ces registres correspondent à la capacité d'adressage du 68HCll soit 16 lignes d’adresses ou de 65536 octets. Leur rôle premier est d'être utilisé pour l'adressage indexé où leur double présence facilite énormément le balayage simultané de tables pour faire du transcodage par exemple. Quelques opérations arithmétiques élémentaires peuvent également être réalisées sur ces index. En outre, si l'adressage indexé ne les utilise pas, ils peuvent bien sûr servir de registres de stockage temporaire de données.
Pointeur de pile S ou SP (Stack Pointer) (16 bits)
Ce registre pointe sur la première adresse libre de la zone mémoire définie pour ranger la pile. Il est donc indispensable que très rapidement suite à la sortie du Reset, ce registre soit initialisé avec une adresse de RAM valide faute de quoi, à la première interruption ou au premier appel de sous-programme toute adresse de retour sera perdue. Le 68HCll gère automatiquement ce registre c'est-à-dire qu'en cas d'appel de sous-programme ou d'interruption, il range sur la pile le contenu de certains registres internes et décrémente le registre S d'autant d'unités que nécessaire de façon à ce qu'il pointe toujours sur la prochaine adresse de pile disponible. Réciproquement, au retour de sous-programme ou d'interruption, il recharge les registres internes qui avaient été sauvegardés avec les informations reprises sur la pile et incrémente le registre S d'autant d'unités que nécessaire. Il n'existe pas de limite physique à l'évolution de ce registre et donc au nombre de sous-programmes ou d'interruptions qu'il est possible d'imbriquer. Seule la taille de la zone de RAM utilisée pour la pile vient concrétiser cette limitation.
Registre PC (Program Counter) (16 bits)
Il pointe la prochaine instruction à exécuter et sa taille est donc nécessairement de 16 bits pour pouvoir accéder à tout l'espace mémoire adressable. Son contenu peut être modifié lors des instructions de saut et de branchement ou lors des appels de sous-programmes ou d'interruptions.
Registre d'état ou CCR (Condition Code Register) (8 bits)
Bien qu'étant un registre 8 bits, ce CCR doit être examiné bit par bit, chacun ayant une signification particulière. Précisons que même si certains de ses bits sont positionnés automatiquement par l'unité centrale en fonction des instructions exécutées, vous pouvez également manipuler la majorité d'entre eux directement au moyen d'instructions spécifiques
- Le bit C (Carry) retenue est mis à 1 lorsqu'une opération arithmétique génère une retenue. Il est également utilisé comme indicateur d'erreur lors d'une multiplication ou d'une division et sert lors de certaines opérations de décalage ou rotation qui peuvent passer par son intermédiaire ou non.
- Le bit V (oVerflow ) débordement est positionné à 1 lorsqu'une opération arithmétique a généré un débordement de l'accumulateur.
- Le bit Z (Zero) est positionné à 1 lorsque le résultat de l'instruction exécutée est nul. Contrairement aux deux bits précédents, il est affecté par de très nombreuses instructions et non seulement par des instructions arithmétiques.
- Le bit N (Negative) est positionné à 1 si le résultat de la dernière opération arithmétique réalisée est négatif (le bit de poids fort du résultat est à 1).
- Le bit H (Half) carry ou demi-retenue est positionné à 1 lors d'une retenue entre les bits 3 et 4 d'une opération arithmétique. Il n'est affecté que par les instructions ADD, ADC et ABA et est ensuite exploité par l'instruction DAA pour réaliser de l'arithmétique DCB c'est-à-dire codée en fait sur 2 groupes de 4 bits.
- Le bit I (Interrupt mask) ou masque d'interruption interdit toute interruption masquable lorsqu'il est mis à 1. Les interruptions survenant pendant qu'il est à 1 peuvent cependant rester en attente si le périphérique interrupteur le permet. Dans ce cas elles seront traitées dès le retour à zéro de ce bit. Suite à un Reset, ce bit est automatiquement mis à 1 et doit être mis à 0 volontairement par logiciel pour valider les interruptions. De même lorsqu'une interruption a lieu, ce bit est mis à 1 dès que la sauvegarde des registres sur la pile a eu lieu mais avant que le vecteur d'interruption correspondant ne soit recherché. Ce bit est ensuite remis automatiquement à 0 lors de l'exécution du RTI de fin de programme d'interruption et de la restauration du contexte.
- Le bit X (XIRQ interrupt mask) fonctionne comme le bit I vu auparavant mais pour les interruptions susceptibles d'être appliquées sur l'entrée /XIRQ. Cette entrée, qui porte le nom de non masquable l'est donc en fait via ce bit.
- Le bit S (Stop disable) permet, lorsqu'il est mis à 1 d'interdire l'exécution de l'instruction STOP. Celle-ci est alors considérée par le 68HC 11 comme un simple NOP (No OPeration). Certains utilisateurs considèrent en effet que STOP est une instruction dangereuse car elle arrête l'oscillateur du 68HCll d'où l'intérêt de ce bit.
Opération importante qui mérite d'être
examiné en détail quant à son comportement et par
ses effets car elle conditionne l'exécution de tout programme.
Pour que le 68HC11 puisse sortir correctement d'une situation de Reset, son horloge doit fonctionner. Ensuite, ce Reset agit sur un certain nombre de registres de contrôle des ressources internes (c. f. doc. Constructeur).
L'unité centrale tout d'abord va chercher à l'adresse $FFFE et $FFFF le vecteur de Reset et charge celui-ci dans le PC. Tous les autres registres sont indéterminés mais les bits I, X et S du CCR sont mis à 1 interdisant ainsi toute interruption ainsi que le mode STOP. On peut alors initialiser en toute sécurité le pointeur de pile SP puisque aucune interruption ne peut avoir lieu. Ceci justifie en grande partie le fait que XIRQ soit rendue masquable même si elle porte le nom d'interruption non masquable.
Le COP (chien de garde) est validé si le bit NOCOP du registre CONFIG est mis à 0 et il est invalidé dans le cas contraire. La vitesse de fonctionnement du COP est programmée à la plus grande valeur possible.
Après un Reset, le convertisseur analogique / digital est dans un état indéterminé, l'indicateur de "conversion terminée" est mis à "0" et le bit ADPU est également mis à "0" ce qui invalide le convertisseur.
Le 68HC11 dispose de multiples possibilités
d'interruptions : deux entrées externes dont nous avons déjà
parlé /IRQ et /XIRQ, un certain nombre de sources internes liées
aux différentes interfaces qui équipent le circuit et une
interruption par logiciel grâce à l'instruction SWI.
L'instruction
en cours d'exécution est tout d'abord terminée complètement.
Le contenu de tous les registres de l'unité centrale est alors poussé
sur la pile et le pointeur de pile SP est diminué d'autant. La figure
ci-contre précise l'ordre de rangement de ces registres dans la
zone mémoire utilisée par la pile.
Le masque d'interruption I du CCR est alors positionné interdisant toute nouvelle prise en compte d'interruption. Ensuite, le vecteur correspondant à celle des interruptions en attente qui a la plus haute priorité est recherchée et sa valeur est chargée dans le compteur ordinal PC ce qui permet de lancer l'exécution du programme d'interruption correspondant.
En fin d'exécution de ce programme, lors de l'exécution de l'instruction RTI, les opérations inverses ont lieu, à savoir récupération sur la pile des registres de l'unité centrale et incrémentation du registre SP d'autant d'unités. Ceci a pour effet tout à la fois de remettre le bit I du CCR dans sont état initial autorisant ainsi la prise en compte de nouvelles interruptions et de recharger le PC avec la valeur qu'il avait au moment de l'interruption ce qui fait poursuivre normalement le programme interrompu.
Ce mécanisme est légèrement différent pour une interruption de type /XIRQ. En effet, cette dernière étant de type non masquable il faut tout d'abord noter que, dans ce qui précède, nous n'avons parlé que de la mise à 1 du bit I du CCR. Cela signifie que même en phase de prise en compte ou de traitement d'une interruption normale, le 68HC 11 peut être interrompu par sa ligne /XIRQ.
Par contre, lors de la phase de prise en compte d'une
interruption /XIRQ, les bits X et 1 du CCR sont mis à 1 interdisant
ainsi toute nouvelle prise en compte d'interruption de type /IRQ ou /XIRQ.
Ces bits X et 1 reviennent évidemment à leur état
initial lors de l'exécution du RTI qui restaure le contenu du CCR.
Les priorités relatives des interruptions sont fixes sauf pour l'une d'entre elles que vous pouvez définir grâce au registre HPRIO (Highest PRIOrity interrupt). Si l'on considère le Reset comme une source d'interruption, l'ordre s'établit comme suit en partant de la priorité la plus élevée
- Reset par action sur l'entrée Reset,
- Reset par la circuiterie de surveillance d'horloge,
- Reset par le COP,
- Interruption par code d'instruction illégal (voir ci-après),
- Interruption /XIRQ,
- Interruption définie par le registre HPRIO,
- Autres interruptions.
Jusqu'à trois types de mémoires différentes
peuvent cohabiter dans un 68HC11
Un 68HCll "de base" dispose normalement d'une zone de mémoire vive ou RAM dont la taille varie selon la référence exacte du boîtier : de 256 octets pour le 68HCll A8 jusqu'à 1,25 ko pour le 68HCl1 M2.
Il dispose également d'une zone de mémoire morte ou ROM qui est programmable par masque, c'est-à-dire lors de la fabrication du circuit, sur les versions 68hc( )11 sans chiffre entre le c et le 11.
Enfin, les 68HCll disposent d'une mémoire EEPROM qui ne doit pas être confondue avec celle dont nous parlerons dans un instant dans le cas des 68HC811. Il s'agit en effet d'une EEPROM de petite taille que l'on appelle habituellement EEPROM de données même si on peut éventuellement y stocker du programme. Cette mémoire a essentiellement pour rôle, dans de nombreuses applications, de mémoriser des paramètres de configuration, sélectionnés par l'utilisateur et qui doivent être conservés même en l'absence de toute alimentation. Un programmateur de chauffage par exemple pourra ainsi ranger dans cette mémoire les différentes heures et températures programmées par l'utilisateur qui se retrouveront identiques à elles-mêmes tant qu'elles n'auront pas été effacées volontairement.
La RAM du 68HC11 est de type statique et ne nécessite
donc aucune circuiterie externe de rafraîchissement de même
qu'elle n'impose aucune fréquence minimum d'horloge.
Comme nous l'avons dit auparavant, la ROM peut être
ou non présente dans le 68HCll selon le type exact de boîtier
retenu. Lorsqu'elle est présente, elle peut toujours être
désactivée par un bit du registre CONFIG.
Dans ce cas, elle n'occupe plus aucun emplacement dans l'espace mémoire
adressable.
Cette ROM qui est par défaut de type programmable par masque, c'est-à-dire réservée à des productions en grande série vu les frais de masquage qu'elle implique, peut se transformer en EPROM ou OTPROM sur les 68HC711 ou en EEPROM sur les 68HC811.
Ces dernières versions de boîtiers, relativement onéreuses, sont évidemment réservées aux phases de développement d'une application tandis que les versions OTPROM sont destinées à des fabrications en petite série où les frais de masquage d'une version ROM ne pourraient être amortis.
Ces deux versions, OTPROM et EEPROM, se programment soit sur des programmateurs universels du commerce supportant le 68HCl1, soit avec des montages spécifiques.
Les ROM, EPROM ou EEPROM sont évidemment utilisées pour le stockage des programmes et des vecteurs de Reset et d'interruptions. Elle est toujours complétée par un petit morceau de ROM supplémentaire implantée de $BF40 à $BFFF qui contient le fameux bootloader.
Le 68HC11 dispose de six modes d'adressage.
L'espace adressable commence à l'adresse $0000
et s'étend jusqu'à l'adresse haute maximum permise soit $FFFF.
Les registres des ressources internes sont donc considérés comme des emplacements mémoires "normaux" et sont accessibles sans manipulation particulière par leur adresse propre.
Dans tout l'exposé qui va suivre nous utiliserons la notion d'adresse effective (effective address) abrégée EA en Anglais. Cette adresse effective est l'adresse réelle de la donnée manipulée par l'instruction.
Nous utiliserons aussi dans les exemples les notations admises par la majorité des assembleurs pour 68HC11, qui respectent les conventions suivantes :
- L'absence de symbole devant un nombre signifie qu'il est exprimé en décimal.
- Le symbole dollar ( $ ) signifie que le nombre est exprimé en hexadécimal.
- Le symbole pour cent ( % ) signifie que le nombre est exprimé en binaire.
- Le symbole apostrophe ( ' ) signifie que le caractère qui suit doit être remplacé par son code en ASCII.
- Le symbole dièse ( # ) indique un adressage de type immédiat.
Dans ce mode il n'y a en effet pas d'adresse effective
car l'instruction concernée se suffit à elle-même et
n'a besoin d'accéder à aucune donnée "externe". Les
instructions ci-dessous donnent quelques exemples d'un tel adressage.
ABA ajoute A et B et place le résultat dans A,
INCB augmente le contenu de B d'une unité,
DEX diminue d'une unité le contenu de X.
Dans ce mode, l'adresse effective est égale
à l'adresse suivant immédiatement l'adresse contenant le
code de l'instruction..
Exemples d'instructions utilisant ce mode d'adressage qui sont codées, au niveau assembleur, par le symbole dièse.
*Adressage immédiat
0000 86 55 LDAA #$55
0001 C8 25 EORB #$25
0004 81 61 CMPA #%01100001
1234 CST EQU $1234
0006 ce 12 34 LDX #CST
0009 cc 00 07 LDD #7
La donnée manipulée par l'adressage immédiat peut être une donnée sur 8 bits ou sur 16 bits selon le type de registre concerné par l'instruction. Ainsi, comme vous pouvez le voir sur le listing, LDD est toujours supposé suivi par une donnée codée sur 16 bits, même si cette dernière pouvait "tenir" sur 8 bits (le 7 est codé 00 07 au niveau assembleur).
L'instruction est suivie d'un octet non signé
qui est l'adresse effective de la donnée manipulée. Comme
cette adresse effective est codée sur un octet seulement, ce mode
d'adressage ne peut fonctionner que de l'adresse $00 à l'adresse
$FF soit sur les 256 premiers octets de l'espace adressable du microcontrôleur.
Exemples d'instructions utilisant ce mode d'adressage.
*Adressage direct
0001 RAM1 EQU $01
0010 RAM2 EQU $10
000c 96 01 LDAA RAM1
000e 97 10 STAA RAM2
0010 91 25 CMPA $25
0012 dc 01 LDD RAM1
Du fait du codage de l'adresse sur 8 bits seulement, ce mode d'adressage est moins encombrant que le mode étendu que nous allons voir maintenant.
Ce mode est une évolution du précédent
et permet d'atteindre n'importe quelle adresse mémoire car il autorise
un codage de l'adresse effective sur deux octets soit 16 bits. Ce mode
d'adressage peut donc fonctionner de l'adresse $0000 à l'adresse
$FFFF.
Exemples d'instructions utilisant ce mode d'adressage.
*Adressage étendu
1000 ROM1 EQU $1000
2500 ROM2 EQU $2500
0014 b6 10 00 LDAA ROM1
0017 f6 25 00 LDAB ROM2
00la fc 12 34 LDD $1234
Ce mode d'adressage est particulièrement souple
et puissant et fait intervenir deux facteurs dans le calcul de l'adresse
effective :
- le contenu d'un des registres d'index X ou Y qui prennent ici leur signification réelle de registre d'index
- une donnée appelée déplacement ou offset en anglais. Il existe de ce fait deux sous-modes.
Le déplacement est un octet non signé et peut donc varier seulement de $00 à $FF (255 en décimal).
Exemple 1
*Adressage indexé avec déplacement nul
001d ec 00 LDD 0,X Notation normale
00lf al 00 CMPA ,X Autre notation admise par
l'assembleur.
Exemple 2
*Adressage indexé avec déplacement non nul
0021 ec 04 LDD 4,X
0023 e3 25 ADDD $25,X
00fe DATA EQU $FE
0025 la ee fe LDY DATA,X
Ce mode d'adressage se rencontre sur quasiment tous
les microprocesseurs mais n'est utilisé ici que pour les instructions
de saut et branchement. Il spécifie l'adresse effective sous forme
d'un déplacement qui est donc ajouté à la valeur courante
du PC pour déterminer l'adresse de poursuite du programme.
Le déplacement peut prendre toute valeur décimale comprise entre -128 et +127 ce qui autorise une amplitude globale de saut de 255 octets.
Exemples d'instructions utilisant ce mode d'adressage.
*Adressage relatif
0028 86 aa ICI LDA #$AA
002a b7 10 00 LABAS STA $1000
002d 27 f9 BEQ ICI
002f la ee 00 LDY 0,X
0032 20 f6 BRA LABAS
La définition de l'adresse de (OPR) OPeRande
peut être faite en adressage direct ou indexé tandis que le
masque est toujours considéré comme codé en immédiat
sans que le symbole dièse ne soit utilisé.
Dans ce mode, l'instruction écrite avant assemblage
est suivie de deux informations et se présente sous la forme suivante
:
INSTRUCTION (OPR) (MSK)
(MSK) MaSque indique le ou les bits de l'OPR (OPeRande) à manipuler par mise à "1" des bits correspondants.
Exemples :
BCLR PORTB %00110001 *positionne à 0 les bits 0, 4 et 5
*du registre PORTB.
BSET PORTB %00110001 *positionne à 1 les bits 0, 4 et 5
*du registre PORTB.
INSTRUCTION (OPR) (MSK) (REL)
(MSK) MaSque indique le ou les bits de (OPR) OPeRande à tester par mise à 1 des bits correspondants.
(REL) est le déplacement permettant de calculer l'endroit où doit se poursuivre le programme selon le résultat du test. Ce déplacement est codé sur 8 bits signés, comme en adressage relatif classique.
Exemples :
BRCLR TFLGI $80 BOUCLE *teste le bit 7 du registre TFLG1 et
*cause un branchement à l'étiquette
*BOUCLE si ce bit est à "0".
BRSET PORTC $08 FIN *teste le bit 3 du PORTC et
*cause un branchement à l'étiquette
*FIN si ce bit est à "1".
Le jeu d'instructions se trouve aux pages suivantes
:
Le port A est dédié
au TIMER, il est donc rarement utilisé en port d'entrée /
sortie.
Le port B est uniquement un port
de sortie. PORTB $1004
Registre de donnée. PORTC
$1003
Registre de direction (Data Direction for Port C) DDRC $1007
Ce port est partagé avec les liaisons série
SPI et SCI. Son utilisation en tant que port d'entrée/sortie impose
que les SPI et SCI ne soient pas utilisées.
Registre de donnée PORTD $1008
Registre de direction DDRD $1009
- Convertisseur 8 bits par approximation successive.
- Multiplexage des 8 entrées à convertir.
- Les résultats sont stockés dans les registres de ADR1 à ADR4.
- Sélection
des entrées et des registres aux moyens des 4 bits de CA à
CD dans ADCTL.
Le registre OPTION permet de configurer les registres ADPU et CSEL.
ADPU = 1 (Mise en route du convertisseur par activation de la pompe de charge)
ASEL = 1 (Sélection d'une autre horloge pour la pompe de charge).
Le registre de contrôle ADCTL permet de contrôler les registres suivants :
CCF : Drapeau d'indication de fin de conversion (en lecture).
SCAN : Balayage continu des canaux d'entrée.
MULT : Choix de 1 ou plusieurs canaux sélectionnés par les bits CD, CC, CB, et CA
Les résultats sont stockés dans les registres ADR1, ADR2, ADR3 et ADR4 correspondant aux adresses $1031, $1032, $1033 et $1034.
Caractéristiques électriques