DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 1/21 TP 2 : ASSEMBLEUR 68HC11 (SUITE) 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 E A0/D0 Liaison série ORDINATEUR DE TYPE PC 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 2 Microcontrôleurs 2/21 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 TP 2 Microcontrôleurs 3/21 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) 7 CCR 0 registre de code condition Les 8 registres de l unité centrale du 68HC11 Chaque bit du Registre Code Condition (CCR) à une signification propre : 7 6 5 4 3 2 1 0 S X H I N Z V C Validation Stop masque XIRQ Demi-retenue masque IRQ Retenue/ Borrow Dépassement Zéro Négatif Registre CCR des indicateurs et des masques d interruption
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 4/21 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 : Bit 0 (C/B) : retenue issue de l'ual (Carry) ou dépassement en non signé, Bit 1 (V) : dépassement de capacité (overflow) lors d'une opération en signé, Bit 2 (Z) : résultat de l'opération précédente est nul, Bit 3 (N) : résultat de l'opération précédente est négatif, Bit 5 (H) : retenue du bit 3 dans l'ual pour les opérations en BCD, Bit 4 (I) : masque général d'interruption IRQ et périphériques internes, Bit 6 (X) : masque d'interruption rapide XIRQ, Bit 7 (S) : instruction Stop validée ou non. 2. Rappel chargement code objet sur la carte 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. 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.
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 5/21 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. 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.
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 6/21 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. 6. Affichage alterné de chiffres (suite) 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 ; Pa7 en sortie CLRA STAA $1000 ; Affichage "0" deb LDX #TAB_CODES bou2 LDAB 0,X
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 7/21 BEQ deb INX STAB $1000 LDAA #200 bou1 LDY #1000 bou DEY BNE bou DECA BNE bou1 BRA 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 B800 h à 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, par exemple comme suit : 1. avant de lancer votre programme, tapez la commande MM B800 2. puis tapez sur la touche <Entrée> 3. entrez la valeur à écrire en mémoire à l'adresse indiquée en paramètre à la commande MM Attention : n'oubliez pas que les adresses sont données en hexadécimal donc à partir de l'adresse B809, les adresses qui suivent sont : B80A, B80B, B80C, B80D, B80E, B80F.
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 8/21 b) Initialisation d un bloc mémoire à une valeur donnée Le programme suivant permet d initialiser avec la valeur VAL (FF h par ex) tout un bloc de données de taille NB_ELEMT (10010 par ex.) d une zone mémoire débutant à l adresse ADR_I (C000h par ex.). Remarque : L adressage indexé trouve ici tout son intérêt pour aller pointer des cases mémoire successives à l aide d un registre d index dont on modifie la valeur (on peut facilement faire le parallèle avec les pointeurs en langage «C» ou l adressage des valeurs dans un tableau de valeurs). ORG VAL NB_ELEMT ADR_I bou fin $8000 EQU EQU EQU LDX LDAA LDAB STAB INX DECA BNE BRA $FF 100 $C000 #ADR_I #NB_ELEMT #VAL 0,X bou fin Expliquez son fonctionnement avant de le faire fonctionner sur la maquette. Pourquoi ne peut-on modifier plus de 255 cases mémoire à l aide de ce programme? Saisissez le programme, assemblez-le et le téléchargez-le dans le kit. Vérifiez, avant de lancer l exécution du programme, le contenu des cases mémoire débutant en C000 avec la commande : MD C000 puis tapez sur <Entrée>. Exécutez le programme (avec la commande GO 8000). Appuyez ensuite sur la touche Reset pour l arrêter, puis lancer à nouveau la commande MD C000 puis tapez sur <Entrée>. Vérifiez que l on a bien le résultat escompté. Comptez le nombre de cases mémoire modifiées par le programme et notez la première et la dernière adresse modifiée (le compte y est-il?). Refaire un essai en modifiant la variable VAL et éventuellement la variable NB_ELEMT (dans les limites acceptables). Vérification.
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 9/21 c) Transfert mémoire à mémoire Le programme suivant est une variante plus élaborée du programme précédent puisqu il utilise un double adressage indexé (registres d index X et Y). Il transfert tout un bloc de données de taille NB_ELEMT (200 10 par ex.) d une zone mémoire débutant à l adresse ADR_S (B800 h par ex.) vers une autre zone mémoire débutant à l adresse ADR_D (C800 h par ex.). ORG $8000 NB_ELEMT EQU 200 ADR_S EQU $B800 ADR_D EQU $C800 LDX #ADR_S LDY #ADR_D LDAA #NB_ELEMT bou LDAB 0,X INX STAB 0,Y INY DECA BNE bou fin BRA fin Expliquez son fonctionnement avant de le faire fonctionner sur la maquette. Saisissez le programme, assemblez-le et le téléchargez-le dans le kit. Avant de lancer l exécution du programme, modifier à la main le contenu des cases mémoire débutant en B800 h et C800 h avec la commande : MM B800 puis tapez sur <Entrée> et entrez la commande puis tapez sur <Entrée>. MM C800 Remarque : Il est aussi possible d utiliser la commande Bloc Fill du moniteur Buffalo du kit pour modifier le contenu de tout un bloc mémoire : BF <addr1> <addr2> [<data>] Block fill memory Exécutez le programme. Appuyez ensuite sur la touche Reset pour l arrêter, puis Vérifiez que l on a bien le résultat escompté en comparant le contenu des cases mémoire débutant en B800 h avec celles débutant en C800 h. Commande : MD B800 puis tapez sur <Entrée> et entrez la commande
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 10/21 puis tapez sur <Entrée>. MD C800 Notez les résultats obtenus, puis changer les variables NB_ELEMT, ADR_S, ADR_D et faire à nouveau les essais. 7. Interruption logicielle Comme vu en cours, une interruption a pour objectif d'interrompre l'exécution du programme en cours pour exécuter une routine (sous-programme) traitant l'interruption qui s est produite. Une fois le sous-programme exécuté, l'exécution du programme interrompu reprend là ou elle avait été interrompue. Une interruption est provoquée par un événement interne ou externe. Elle possède trois différences en comparaison avec un sous-programme : 1) elle n'est pas appelée de manière explicite, 2) elle peut interrompre le programme en cours d'exécution n'importe où et doit donc provoquer la sauvegarde des registres dans la pile et leur restauration au retour de la routine d'interruption, 3) son adresse est stockée dans un vecteur d'interruptions (tableau à un emplacement prédéfini en mémoire). La sauvegarde du contexte processeur correspond à sauvegarder l état de tous les registres du processeur afin de les restaurer après exécution de la routine d interruption. Sur le M68HC11, cela revient à sauvegarder les registres PC (compteur ordinal), X, Y, CCR (registre d état) et les accumulateurs A et B. Cela occupe 9 cases mémoire dans la pile comme illustré dans le schéma ci-dessous : Au retour de la routine d interruption, indiqué par l instruction RTI qui la dernière instruction de la routine, l état des 6 registres placé au sommet de la pile est restauré dans l ordre : CCR, B, A, X, Y, PC. On retrouve ainsi l état du processeur avant interruption. Chaque source d'interruption possède une entrée spécifique dans le vecteur d'interruptions situé dans une mémoire morte (ROM) situé aux adresses FFC0-FFFF. Le tableau 5-4 ci-après donne la localisation dans le vecteur d interruptions associée à chaque type d interruption, 16 bits sont utilisés pour chaque interruption. Dans la suite, nous allons nous intéresser à l interruption logicielle SWI (Software Interrupt). Comme son nom l indique cette interruption est particulière car elle peut uniquement être levée de façon logicielle dans un programme, contrairement aux autres instructions qui sont
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 11/21 générées par le matériel. Les adresses qui lui correspondent à cette interruption dans le vecteur d interruption sont les adresses FFF6 et FFF7. Le vecteur d interruption est situé en mémoire morte (ROM) et n est pas modifiable. Il n est donc pas possible de pouvoir programmer l adresse où sera située la routine traitant chaque interruption. Pour pallier à ce problème, un second vecteur appelé vecteur de saut d interruption placé dans le bas de la mémoire RAM aux adresses 00C4-00FF est modifiable et peut être est utilisé pour programmer l adresse des routines d interruption. Ainsi, chaque entrée du vecteur d interruption stocke l adresse de l entrée correspondante dans le vecteur de saut d interruption. Le tableau ci-après donne les adresses dans ce vecteur pour chaque interruption. Chaque entrée de ce tableau a une taille de 3 octets : le premier octet stocke le code opération de l instruction de saut JUMP (code 7E en hexadécimal), les deux autres octets stockent une adresse sur 16 bits où est située la première instruction de la routine d interruption à exécuter. Lorsqu une interruption survient le processeur va dans la bonne entrée du vecteur d interruption en ROM puis est redirigé vers l entrée correspondant dans le vecteur de saut d interruption en RAM où il trouve une instruction de saut (JUMP) avec comme opérande l adresse de la routine à exécuter.
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 12/21 Voici ci-dessous un exemple de programme permettant d utiliser l interruption SWI. La routine d interruption rint change le contenu de l afficheur 7 segments pour afficher l entier 1 à la place de 0 affiché initialement. Pour cela au début du programme on initialise les 3 octets aux adresses 00F4 à 00F5 comme suit : adresse 00F4 : placement du code opération d un saut (JUMP) correspondant au code F4, adresses F5-F6 : placement adresse routine d interruption rint. L instruction spéciale SWI permet de déclencher l interruption logicielle SWI, provoquant l exécution de la routine d interruption dont l adresse a été placée au préalable aux adresses 00F5-00F6. Le contexte processeur est sauvegardé puis le processeur exécute les instructions de la routine situées à l adresse rint en RAM. Enfin, l instruction spéciale RTI permet de faire un retour de routine d interruption. Elle restaure le contexte processeur sauvegardé au sommet de la pile et le processeur reprend l exécution du programme interrompu. Il est important que l instruction RTI soit la dernière instruction d une routine. ORG $8000 LDAA #$7E ; 7E correspond au opcode instruction JUMP STAA $F4 ; Indique instruction JUMP dans vecteur interruption LDD #rint ; Chargement adresse routine interruption pour SWI STD $F5 ; Enregistrement adresse routine SWI dans vecteur saut interruption LDAA #$80
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 13/21 STAA $1026 ; PA7 en sortie CLRA STAA $1000 ; Affichage de "0" LDY #2000 bou1 LDX #200 bou DEX NOP NOP BNE bou DEY BNE bou1 SWI fin BRA fin ; declenchement interruption SWI rint LDAA #$10 STAA $1000 RTI Modifiez le programme ci-dessus afin d afficher les divers symboles possibles par ordre croissant de leur valeur décimale sur l afficheur 7 segment à l aide de l interruption SWI. La routine associée à SWI devra incrémenter un nombre contenu dans un registre puis l afficher. Pour réaliser cela vous vous inspirerez des programmes précédents permettant de réaliser un compteur avec l afficheur 7 segments. Attention : On rappel que du fait du changement de contexte à l exécution de la routine d interruption SWI l état des registres du processeur sont modifiés. Vous aller donc devoir utiliser la mémoire RAM afin de stocker l état du compteur. Vous utiliserez l adresse 9000 en mémoire pour cela.
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 14/21 8. Annexe : tableau d instructions du 68HC11 Tableau 1/6
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 15/21 Tableau 2/6
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 16/21 Tableau 3/6
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 17/21 Tableau 4/6
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 18/21 Tableau 5/6
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 19/21 Tableau 6/6
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 20/21 9. Annexe 2 : BCD 7 segments
DUT 1 Informatique, CNAM Paris TP 2 Microcontrôleurs 21/21