DUT 1 Informatique, CNAM Paris 1/22 TP n°1 Microcontrôleurs TP 1 : ASSEMBLEUR 68HC11 Le but de ce TP sur machine est de mettre en œuvre le jeu d’instruction et les modes d’adressage du processeur 68HC11 de Motorola (une documentation détaillée sur les instructions proposées par ce processeur sont en annexe). 1. Matériel utilisé (kit "68HC11EVBU2 68HC11E9") Vous utiliserez le kit d’évaluation 68HC11EVBU2 de Motorola, avec un quartz 8 MHz produisant une fréquence d'horloge à 2 MHz et un microcontrôleur 68HC11E9 dont le détail est donné ci-après. Points test Masses ORDINATEUR DE TYPE PC Liaison série E A0/D0 AS R/W R A M 68HC11 Reset Alimentation 5V Fig 1 : KIT HC11EVBU2 utilisé Fig 2 : Schéma interne du 68HC11 et caractéristiques de ses différentes versions Important : Le microcontrôleur de la carte d’évaluation fonctionne en mode étendu. Ce qui veut dire qu’il sort son bus d’adresses 16 bits (A15-A0) et son bus de données 8 bits (D7-D0) vers l’extérieur par l’intermédiaire des ports B et C. Puisqu’il ne dispose avec ces 2 ports que de 16 broches, un multiplexage temporel est réalisé sur les 8 bits de données et les 8 bits de poids faible du bus d’adresses (Port C = A7/D7-A0/D0) comme le montre le chronogramme suivant : adresses basses puis données sur le Port C, adresses hautes sur le port B. DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 2/22 A15-A8 A7/D7-A0/D0 Fig 3 : Chronogramme du 68HC11 pour fonctionnement en mode étendu Fig 4 :Mapping mémoire et mémoire interne au 68HC11 RAM Interne de 0000 à 01FF libre à l'utilisateur (pas d’accès à la mémoire externe via le bus de données) REGISTRES internes de 1000 à 103F EEPROM interne de B600 à B7FF ROM Interne (on chip ROM) de D000 à FFFF ROM test pattern (4ko) de D000 à DFFF Moniteur Buffalo de E000 à FFFF RAM externe (32 ko) de 8000 à B5FF et de B800 à CFFF Le fonctionnement en mode développement d’une application avec une carte d’évaluation implique la présence d’un programme « moniteur » (Buffalo monitor). Ce programme moniteur est généralement présent dans une mémoire morte. Il permet de faire fonctionner le microcontrôleur en pas à pas et ainsi de vérifier dans le détail le bon fonctionnement de DUT 1 Informatique, CNAM Paris 3/22 TP n°1 Microcontrôleurs l’application développée. Il assure la communication entre l’ordinateur PC et la carte de développement, via une liaison série de type RS232C. En ce qui concerne la carte 68HC11EVBU2, ce programme « moniteur » est fournit par Motorola et présent dans la ROM du microcontrôleur de la carte. Il s’appelle « BUFFALO 3.4 », son code source est fourni. 1.1. REGISTRES DE TRAVAIL DU 68HC11 Le microcontrôleur 68HC11E9 utilisé en travaux pratiques dispose en tout et pour tout de 8 registres de travail accessibles par programmation à l’aide du jeu d’instruction : Deux accumulateurs 8 bits A et B (l’ensemble formant un accumulateur 16 bits D), Deux registres d'index 16 bits X et Y, Pointeur de pile 16 bits SP, Compteur de Programme 16 bits PC (ou compteur ordinal), Code Condition Register 8 bits CCR (équivalent au registre d'état vu en cours). 7 A 0 7 B 0 accumulateurs 8 bits A et B 15 D 0 ou accumulateur 16 bits D 15 X 0 registre d'index X 15 Y 0 registre d'index Y 15 SP 0 pointeur de pile 15 PC 0 compteur ordinal (ou de programme) 0 registre de code condition 7 CCR Les 8 registres de l’unité centrale du 68HC11 Chaque bit du Registre Code Condition (CCR) à une signification propre : 7 6 S Validation Stop masque XIRQ Demi-retenue masque IRQ X 5 H 4 3 2 1 0 I N Z V C Retenue/ Borrow Dépassement Zéro Négatif Registre CCR des indicateurs et des masques d’interruption DUT 1 Informatique, CNAM Paris 4/22 TP n°1 Microcontrôleurs Les indicateurs du registre CCR sont de deux catégories : les bits 0, 1, 2, 3 et 5 positionnés en fonction du résultat des instructions qui manipulent les données, et les bits 4, 6 et 7 dont le rôle est lié au fonctionnement du microcontrôleur en interruption : 2. Bit 0 (C/B) Bit 1 (V) Bit 2 (Z) Bit 3 (N) Bit 5 (H) Bit 4 (I) Bit 6 (X) Bit 7 (S) : retenue issue de l'UAL (Carry) ou dépassement en non signé, : dépassement de capacité (oVerflow) lors d'une opération en signé, : résultat de l'opération précédente est nul, : résultat de l'opération précédente est négatif, : retenue du bit 3 dans l'UAL pour les opérations en BCD, : masque général d'interruption IRQ et périphériques internes, : masque d'interruption rapide XIRQ, : instruction Stop validée ou non. Introduction du programme en code machine Le programme que vous allez exécuter est le suivant : adresse code objet mnémoniques du programme 8000 8002 8005 8007 BOU 86 05 B7 80 07 20 F9 XX DATA ORG LDAA STAA BRA RMB $8000 #$05 DATA BOU 1 C’est une petite boucle qui écrit en permanence la valeur 05h (5 en hexadécimale) dans la case mémoire appelée DATA (adresse 8007h, les adresses sont indiquées en hexadécimale). Vous disposez de 2 manières pour inscrire le programme dans la mémoire RAM du microcontrôleur : 1) en écrivant le code objet dans la RAM du microcontrôleur, 2) en téléchargeant tout le code objet dans la RAM via la liaison série du PC. Nous allons décrire ci-dessous la procédure à suivre pour télécharger tout le code objet dans la RAM du microcontrôleur via la liaison série. a) Téléchargement du code objet via la liaison série du PC L’environnement de développement minimal pour utiliser le kit "68HC11EVBU2 68HC11E9" est dans le répertoire où se trouve ce sujet de TP (en principe barracuda/temp/GEII_2). Il contient les fichiers suivants : AS11.EXE : l’assembleur 68hc11, Invite de comnande .lnk : pour lancer une fenêtre DOS, 68HC11.htt : HyperTerminal pour liaison série RS232C avec le PC, Chrono.asm : un exemple de fichier source en assembleur, CHRONO.S19 : fichier objet résultat de l'assemblage d'un programme source. DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 5/22 Création du programme source : Créez (dans le répertoire de travail) un fichier que vos appellerez chrono.asm à l’aide du Bloc note de Windows et écrivez les mnémoniques du programme indiqué pécédemment, puis enregistrez le fichier. Assemblage du programme (traduction en code objet) : Lancez l’invite de commandes (dans le répertoire de travail) puis tapez la commande suivante suivie de la touche <Entrée> : as11 chrono.asm –l Le programme est assemblé, vous devez obtenir ceci. L’assembleur a créé un fichier appelé chrono.s19, qui est un fichier texte au format s19 de Motorola (fichier en caractères ASCII, téléchargeable via une liaison série). Téléchargement du programme dans la RAM du microcontrôleur via la liaison série à l’aide de l’HyperTerminal : Lancez l’HyperTerminal (dans le répertoire de travail) en double-cliquant sur 68HC11.HT, la fenêtre suivante doit s’ouvrir (attendre quelques secondes). Appuyez sur le bouton reset de la carte HC11EVBU2 (petit switch entre le connecteur de la liaison série et celui de l’alimentation). Vous devez obtenir le message suivant dans la fenêtre de l’HyperTerminal : « BUFFALO 3.4 (ext) - Bit User Fast Friendly Aid to Logical Operation ». Appuyez une fois sur la touche <Entrée>. Pour télécharger le fichier chrono.s19 dans la RAM du microcontrôleur, tapez la commande suivante suivie de la touche <Entrée> : LOAD T Puis choisissez dans le menu transfert « envoyer un fichier texte » et sélectionnez votre fichier chrono.s19. DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 6/22 Si tout se passe bien (téléchargement réalisé) vous devez voir apparaître le message « done » dans l’HyperTerminal. b) Exécution du programme Le programme est maintenant dans la RAM du microcontrôleur, vous pouvez l’exécuter, mais avant vous pouvez vérifier qu’il y est effectivement (pour ceux qui doutent….) en lançant la commande suivante pour visualiser le contenu de la mémoire RAM situé à l'adresse 8000 : MD 8000 Vous devez obtenir l'affichage de la figure ci-dessous et constater que les codes objets du programme y sont bien. Pour lancer l’exécution du programme situé à l'adresse 8000 en RAM tapez la commande : GO 8000 Le programme s’exécute, on ne peut l’arrêter que par un appui sur la touche « reset » sur la carte du microcontrôleur. 3. Question préalable 3.1. Branchement relatif Expliquer la valeur F9 du BRA BOU, vous pouvez vous référer à la documentation en annexe pour le détail sur l'instruction BRA. DUT 1 Informatique, CNAM Paris 7/22 TP n°1 Microcontrôleurs 4. Principaux modes d'adressage du 68HC11 Dans le jeu d’instruction de chaque microcontrôleur (respect. microprocesseur) il existe plusieurs modes d’adressage pour chaque instruction. A chaque mode d’adressage correspond une façon d’accéder (ou de manipuler) à des données. Nous en étudierons les principaux modes d’adressage à travers plusieurs exemples. Le tableau suivant présente quelques exemples pour chaque mode d’adressage. Mode d’adressage Type de l’opérande Exemple Signification Valeur (1 ou 2 octets) LDAA #$7A LDAA #%01111010 LDAA #122 LDAA #@172 LDD #$A0FF LDX #$C000 A 7Ah A 7Ah A 7Ah A 7Ah D A0FFh X C000h Direct Adresse sur 1 octet (8 bits) LDAA $89 STAA $12 A (M[(89h)]) M[(12h)] (A) Étendu Adresse sur 2 octets (16 bits) LDAA $1000 STAA $1A00 A (M[(1000h)]) M[(1A00h)] (A) Immédiat Indexé (déplacement constant) Déplacement (positif sur 8 bits) par LDAA 0,X rapport à l’adresse contenue dans le LDAA $10,X registre concerné (X, Y) A (M[(X) + 0]) A (M[(X) + 10h]) PCR (PCR) Relatif Inhérent Saut (1 octet en signé) par rapport BEQ étiquette1 BRA étiquette2 au Compteur de Programme Aucun INCA CLRA Fin de décodage d’instruction + Saut A (A) + 1 A0 4.1. Mise en œuvre des modes d'adressage sur Kit 68HC11EVBU2 Pour toutes les questions qui suivent, il est conseillé de vous référer et de vous aider du jeu d’instruction du 68HC11 fournit en annexe, ainsi que des indications données précédemment. Créez des fichiers textes pour vos programmes et assemblez-les, comme indiqué précédemment, enfin téléchargez-les dans le kit 68HC11EVBU2 et exécutez-les en pas à pas. Pour commencer l’exécution d’un programme, il faut mettre le compteur de programme (registre PC) à l’adresse 8000h avec la commande RM (Register Modify) suivi du nom de registre concerné (P en l’occurrence) et appuyez sur la touche <Entrée> : DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 8/22 RM P Saisir alors la valeur 8000 puis appuyez à nouveau sur la touche <Entrée> En relançant la commande RM, on peut vérifier la valeur du compteur de programme. Pour lancer l’exécution de 2 lignes du programme en mode pas à pas à partir de la position actuelle du compteur de programme, tapez la commande suivante et appuyez sur la touche <Entrée> : T2 Vous devez obtenir quelque chose comme ceci : >T 2 CLRA LDAA #$4A > P-8001 Y-FFFF X-FFFF A-00 B-FF C-94 S-0041 P-8003 Y-FFFF X-FFFF A-4A B-FF C-90 S-0041 L'HyperTerminal indique le contenu des registres du microcontrôleur pour chaque instruction exécutée du programme. Pour la deuxième instruction ci-dessus, on peut observer que les valeurs suivantes : le registre P (Compteur Ordinal) contient la valeur 8003(16), les registres indexés Y et X contiennent la valeur FFFF(16), l'accumulateur A contient la valeur 4A(16), l'accumulateur B contient la valeur FF(16), le registre CCR contient la valeur 90(16), et le registre de pile S contient la valeur 0041(16). Pour connaître l’ensemble des commandes possibles avec la carte 68HC11, tapez la commande suivante et appuyez sur la touche <Entrée> : ? Vous obtiendrez ceci : ASM [<addr>] Line asm/disasm, [/,=] Same addr, [^,-] Prev addr, [+,CTLJ] Next addr, [CR] Next opcode, [CTLA,.] Quit, BF <addr1> <addr2> [<data>] Block fill memory, BR [-][<addr>] Set up bkpt table, BULK Erase EEPROM, BULKALL Erase EEPROM and CONFIG CALL [<addr>] Call subroutine GO [<addr>] Execute code at addr, PROCEED Continue execution, EEMOD [<addr> [<addr>]] Modify EEPROM range, LOAD, VERIFY [T] <host dwnld command> Load or verify S-records DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 9/22 MD [<addr1> [<addr2>]] Memory dump, MM [<addr>] or [<addr>]/ Memory Modify, [/,=] Same addr, [^,-,CTLH] Prev addr, [+,CTLJ,SPACE] Next addr, <addr>O Compute offset, [CR] Quit, MOVE <s1> <s2> [<d>] Block move, OFFSET [-]<arg> Offset for download, RM [P,Y,X,A,B,C,S] Register modify, STOPAT <addr> Trace until addr, T [<n>] Trace n instructions, TM Transparent mode (CTLA = exit, CTLB = send brk), [CTLW] Wait, [CTLX,DEL] Abort, [CR] Repeat last cmd a) Adressage immédiat En adressage immédiat, il faut impérativement faire précéder l’opérande du symbole #. Donnez en hexadécimal la valeur que doit contenir l’accumulateur A à la fin de chacune des instructions suivantes. LDAA #$7A LDAA #%10011100 LDAA #@217 LDAA #100 LDAA # ‘a’ ; symbole $ précédent une valeur donnée en hexadécimal ; symbole % précédent une valeur donnée en binaire ; symbole @ précédent une valeur donnée en octal ; aucun symbole précédent une valeur donnée en décimal ; code ASCII donné entre quote Vérifiez sur la maquette les valeurs que vous obtenez. Pour cela, vous devrez créer un programme avec les lignes ci-dessus, l'assembler et le charger dans la mémoire RAM du microcontrôleur. Vous exécuterez ensuite votre programme en mode pas-à-pas à l'aide de la commande : T 1 Même question avec l’accumulateur D. Vérifiez vos réponse en exécutant ce programme sur la maquette. LDD #32000 LDD #$AFEF Donnez en hexadécimal la valeur que doit contenir l’accumulateur A à la fin de ce petit programme. Le vérifier en l’exécutant sur la maquette. LDAA #$33 ADDA #$27 SUBA #$0A a) Adressage inhérent ou implicite L’adressage est dit « inhérent » ou « implicite » lorsque l’instruction ne possède pas d’opérande. Donnez en hexadécimal la valeur que doit contenir l’accumulateur B à la fin de ce DUT 1 Informatique, CNAM Paris 10/22 TP n°1 Microcontrôleurs petit programme. Le vérifier en l’exécutant sur la maquette. CLRB INCB INCB ASLB b) Adressage direct et étendu (accès direct au contenu des cases mémoire par leur adresse) Donnez en hexadécimal la valeur que contiendront les accumulateurs A et D à la fin de chaque instruction. Le vérifier en exécutant le programme sur la maquette. Indice : vous pouvez utiliser la commande MD <adresse> pour visualiser le contenu de la mémoire à l'adresse <adresse>. LDAA $30 LDAA $3000 LDD $3010 ; direct (adresse sur 8 bits) ; étendu (adresse sur 16 bits) Remarque : Il est courant de confondre adressage étendu et adressage immédiat (se souvenir qu’en adressage immédiat, il faut obligatoirement utiliser le préfixe #). Les conséquences en sont catastrophiques. Faire donc très attention. Rechargez le programme précédent, puis exécutez la commande suivante avant d'exécuter en mode pas-à-pas le programme. MD 30 puis tapez le nombre 55 et enfin sur la touche <Etnrée>. Donnez en hexadécimal la valeur que contiendront les accumulateurs A et D à la fin de chaque instruction. Le vérifier en exécutant le programme sur la maquette. 5. Affichage d’un chiffre sur un afficheur 7 segments Un afficheur 7 segments est connecté aux bits PA7, PA6, PA5, PA4 du Port A du kit 68HC11EVBU2 à travers un décodeur BCD 7 segments. R7 200ohm PORT A du 68HC11 5V 7 PA4 PA5 PA6 1 A OA 2 B OB 6 C OC D OD PA7 3 OE 5 LT OF 4 RBI OG BI/RBO 13 R1 200ohm 12 11 10 R2 200ohm 15 R3 200ohm 14 R4 200ohm R5 200ohm VCC Com 9 74LS47N 5V VCC U1 R6 200ohm A B CDE F G DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 11/22 Une valeur de 4 bits envoyée sur les broches PA7 à PA4 du microcontrôleur devrait provoquer son affichage en décimal sur l’afficheur 7 segments. Seulement, la broche PA7 n’est pas « configurée » initialement comme une sortie comme le sont initialement les broches PA6 à PA4 (voir schéma ci-dessous). Port A PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 Pour programmer la broche PA7 en sortie, il faut mettre à l’état « 1 » le bit DDRA7 à l’adresse 1026h. $1026 DDRA7 PAEN PAMOD PEDGE - - RTR1 RTR0 Les instructions à écrire sont les suivantes : LDAA STAA #$80 $1026 ; PA7 en sortie Expliquez ce que font ces 2 instructions. Pour envoyer maintenant une valeur sur les broches PA7 à PA4, il suffit de l’écrire à l’adresse $1000 correspondant aux entrées/sorties du Port A. $1000 PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 Ajoutez aux deux instructions précédentes les instructions permettant d’afficher la valeur « 5» sur l’afficheur 7 segments. Faites l’essai sur la maquette ; Essayer maintenant toutes les combinaisons possibles pour PA7 à PA4 et notez les valeurs affichées. Indice : vous pouvez aller consulter l'annexe 2 en fin de sujet pour obtenir les différentes valeurs. 6. Affichage alterné de chiffres 6.1. Adressage relatif Soit le morceau de programme suivant : BOU LDX DEX NOP NOP BNE #200 BOU Expliquez son rôle (aidez-vous du jeu d’instruction pour comprendre comment fonctionne l’instruction BNE). DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 12/22 Que représente « BOU » dans ce programme ? Implémenter ce programme et exécutez-le en mode pas-à-pas. Que fait ce programme (examinez le contenu du registre X) ? Déterminez le nombre total de cycles d’horloge nécessaire à son exécution. On utilise une horloge à 2 MHz. Quelle sera la durée totale de ce programme ? 6.2. Affichage alterné de 2 chiffres On veut écrire un programme qui affichera en alternance 2 chiffres différents et ce une seconde chacun. Affichage chiffre C1 : 1s Affichage chiffre C2 : 1s Soit le morceau de programme suivant : LDY BOU1 LDX BOU DEX NOP NOP BNE DEY BNE #1000 #200 BOU BOU1 Expliquez son rôle Quelle sera sa durée approximative ? Ecrire le programme qui fera alterner toutes les secondes l’affichage de 2 chiffres. L’assembler, le tester et le mettre au point sur la maquette. Ne pas oublier de configurer la broche PA7 en sortie ! Remarque : Pour réaliser une boucle « inconditionnelle » on utilise l’instruction BRA, de la même manière que BNE en donnant un nom d’étiquette à l’instruction vers laquelle on souhaite effectuer le branchement. DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 13/22 6.3. Autre exemple pour afficheur LCD Ecrivez le programme suivant et faite-le fonctionner. ORG $8000 LDAA #$80 STAA $1026 CLRA STAA $1000 bou2 bou1 bou suite LDY LDX DEX NOP NOP BNE DEY BNE ADDA CMPA BNE CLRA STAA BRA ; PA7 en sortie ; Affichage "0" #1000 #200 bou bou1 #$10 #$A0 suite $1000 bou2 Constatation ? Modifier ce programme pour que l’affichage varie toutes les 0.1 seconde. Expliquez comment on fait varier le chiffre affiché et comment on le remet à « 0 ». 6.4. Adressage indexé L’adressage indexé trouve tout son intérêt lorsqu’il s’agit de manipuler des tableaux de valeurs (rangées dans des cases mémoires successives). On se sert à cet effet de registres spécifiques appelés « registres d’index », qui permettent de pointer les cases mémoire successives en modifiant, soit le contenu du registre d’index (adresse sur laquelle on désire pointer) soit le déplacement par rapport au contenu de ce registre d’index (accès aléatoire à une case mémoire à partir de l’adresse de base). On peut facilement faire le parallèle entre l’adressage indexé et les pointeurs en langage « C » ou l’accès aux valeurs dans un tableau. a) Visualisation sur un afficheur 7 segments des valeurs contenues dans un tableau Ecrivez le programme suivant et faite-le fonctionner. ORG $8000 LDAA #$80 STAA $1026 CLRA STAA $1000 deb LDX ; Pa7 en sortie ; Affichage "0" #TAB_CODES DUT 1 Informatique, CNAM Paris bou2 bou1 bou LDAB BEQ INX STAB LDAA LDY DEY BNE DECA BNE BRA TP n°1 Microcontrôleurs 14/22 0,X deb $1000 #200 #1000 bou bou1 bou2 TAB_CODES fcb $10, $30, $50, $70, $90, $20, $40, $60, $80,$00 Constatation ? Comparez les valeurs affichées avec la documentation en Annexe 2. Expliquez ce que contient le registre d’index X à chaque étape du programme. Vérifiez sur la maquette l’évolution des valeurs du registre d’index X et de celles de l’accumulateur B. Pour cela, il faut mettre un point d’arrêt à l’aide de la commande BR <adresse> du moniteur de la carte 68HC11EVBU2 et mettre à la place de <adresse> l’adresse de l’instruction LDAB 0,X (à trouver). Puis taper la commande GO 8000 suivie de la commande T. Réitérer cette procédure en tapant la commande T suivie de la commande GO à chaque arrêt du programme. Vous pourrez ainsi aisément observer le contenu des registres souhaités. Pour enlever les points d’arrêts, taper la commande BR Modifier ce programme pour afficher d’abord les chiffres pairs, puis les chiffres impairs. Modifiez ce programme afin qu’il affiche les 4 bits de poids fort contenus dans les cases mémoires allant de l’adresse B800h à l’adresse B810 h. L’étiquette TAB_CODES ne sert plus dans ce cas. Pour tester votre programme, mettez au préalable des valeurs connues aux adresses B800 h à B810 h. DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 7. Annexe : tableau d’instructions du 68HC11 Tableau 1/6 15/22 DUT 1 Informatique, CNAM Paris Tableau 2/6 TP n°1 Microcontrôleurs 16/22 DUT 1 Informatique, CNAM Paris Tableau 3/6 TP n°1 Microcontrôleurs 17/22 DUT 1 Informatique, CNAM Paris Tableau 4/6 TP n°1 Microcontrôleurs 18/22 DUT 1 Informatique, CNAM Paris Tableau 5/6 TP n°1 Microcontrôleurs 19/22 DUT 1 Informatique, CNAM Paris Tableau 6/6 TP n°1 Microcontrôleurs 20/22 DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 8. Annexe 2 : BCD 7 segments 21/22 DUT 1 Informatique, CNAM Paris TP n°1 Microcontrôleurs 22/22