Code Warrior - nouveau projet structuré en langage assembleur
Transcription
Code Warrior - nouveau projet structuré en langage assembleur
numEctron http://nalhossri.free.fr _______________________________________________________________________ Code Warrior - nouveau projet structuré en langage Assembleur Nabil Al-HOSSRI, département GEII IUT Bordeaux1 e-mail : [email protected] Les démarches à suivre pour construire un projet modèle en langage Assembleur sont semblables à ce que l'on a vu lors de l'ouverture d'un projet en langage C. Sous Explorer de Windows, préparer un dossier vide et lui donner un nom au choix (par exemple: MonPremierProjet_ASM) dans lequel on sauvegardera notre nouveau projet. Ensuite, lancer CW, en cliquant sur l'icône IDE (version 5.1 ou 6.1) ; la page suivante s'affiche : Valider File -> New Project pour faire apparaître la fenêtre : On vous demande la version du processeur que vous utilisez pour votre projet. ______________________________________________________________________________ 1 Code Warrior - nouveau projet structuré en langage Assembleur numEctron http://nalhossri.free.fr _______________________________________________________________________ Double Clic dans HC08 puis dans G Family ; valider MC68HC908GP32, et remplir la fenêtre qui s'ouvre comme suit : Valider Mon08 Interface ; et voilà la suite, après la validation de Suivant> ______________________________________________________________________________ 2 Code Warrior - nouveau projet structuré en langage Assembleur numEctron http://nalhossri.free.fr _______________________________________________________________________ Choisissez votre langage de programmation. On peut avoir plusieurs langages de programmation, et par défaut, le C est coché. Dans le cas présent, je vous conseille d’utiliser « Absolute Assembly », pour deux raisons principales. Cela permet : 1. de rester vraiment dans un environnement Assembleur. 2. d'avoir un fichier source autonome, qui comportera toutes les informations nécessaires pour un bon fonctionnement dans un autre compilateur, à savoir : plan d'occupation de la mémoire, vecteurs d'adresses d'interruption concernant le micro utilisé, etc… De toute façon, on a toujours la possibilité d'utiliser la fonction Include, qui permet à l'éditeur de liens d'associer des feuilles de codes personnalisés venant d'autres programmes. A ce stade, valider Set... pour sauvegarder le projet, par exemple sous le nom MonPremierProgramme_ASM, dans le dossier (MonPremierProjet_ASM) déjà créé. L'écran précédent devient ainsi : Clic sur Terminer pour valider le projet. ______________________________________________________________________________ 3 Code Warrior - nouveau projet structuré en langage Assembleur numEctron http://nalhossri.free.fr _______________________________________________________________________ Voici le fichier « main.asm » ainsi créé ; les commentaires sont en rouge: ______________________________________________________________________________ 4 Code Warrior - nouveau projet structuré en langage Assembleur numEctron http://nalhossri.free.fr _______________________________________________________________________ ;******************************************************************* ;* This stationery serves as the framework for a user application * ;* For a more comprehensive program that demonstrates the more * ;* advanced functionality of this processor, please see the * ;* demonstration applications, located in the examples * ;* subdirectory of the "Freescale CodeWarrior for HC08" program * ;* directory. * ;******************************************************************* ; Ici est défini le fichier du composant utilisé ; on peut, bien sûr, en ajouter d’autres avec la ; fonction INCLUDE. ; Include derivative-specific definitions INCLUDE 'derivative.inc' ; ; export symbols ; XDEF _Startup ABSENTRY _Startup ; ; Définition de la RAM ; variable/data section ; ORG RAMStart ; Insert your data definition here ExampleVar: DS.B 1 ; ; Définition de la Flash ; code section ; ORG ROMStart _Startup: LDHX #RAMEnd+1 ; initialize the stack pointer TXS CLI ; enable interrupts ; Ceci sert à initialiser le pointeur en RAM, en fin de RAM, plus exactement RAMEnd+1 ; Ici, peut commencer votre programme en Assembleur mainLoop: ; Insert your code here NOP feed_watchdog BRA mainLoop ; Ne pas oublier de définir les vecteurs de reset sinon votre programme ne fonctionnera pas ;************************************************************** ;* spurious - Spurious Interrupt Service Routine. * ;* (unwanted interrupt) * ;************************************************************** spurious: ; placed here so that security value NOP ; does not change all the time. RTI ;************************************************************** ;* Interrupt Vectors * ;************************************************************** ORG $FFFA DC.W spurious DC.W spurious DC.W _Startup ; ; SWI ; Reset ______________________________________________________________________________ 5 Code Warrior - nouveau projet structuré en langage Assembleur numEctron http://nalhossri.free.fr _______________________________________________________________________ Vous pouvez intégrer directement la partie suivante dans le fichier « Main.asm ». Celle-ci a été épurée pour que vous puissiez l’utiliser comme modèle, en l'adaptant comme vous le souhaitez, et ce quel que soit le compilateur. ; Inclure les définitions des registres. INCLUDE 'MC68HC908GP32.inc' ORG RAMStart ; Début de la RAM, définit dans 'MC68HC908GP32.inc' ; Déclarer vos variables ou données ici: ; ... ORG ROMStart ; Début de la ROM (Flash), définit dans 'MC68HC908GP32.inc' Entry: ; Point d'entrée du programme LDHX #RAMEnd+1 ; Initialise le pointeur de pile TXS MOV #1,CONFIG1 ; Inhibe le WATCHDOG pour permettre ; l'initialisation du HC08 à la mise sous tension. CLI ; Autorise les interruptions. ; programme main: ; Ecrire vos codes ici: ; ... mainLoop: ; Ecrire vos codes ici: ;... BRA mainLoop ; fin du programme ;******************************************************** ;* Routine des éventuelles interruptions "temporaire" déterminables ;* ultérieurement selon l'application. ;* Cette routine ne fait que générer le retour au programme principal ;* pour calmer le compilateur et éviter les erreurs de compilation de ce ;* modèle; cette routine peut être effacée dans le cas où toutes les ;* interruptions sont sollicitées dans une application ;******************************************************** temporaire: NOP RTI ; Retour au programme. ;******************************************************** ;* Vecteurs d'adresses et étiquettes, en commentaire, qui peuvent ;* remplacer "temporaire" selon la demande d'interruption souhaitée ;* Vecteur Reset est obligatoire. ;******************************************************** org $FFDC ; Début de vecteurs d'interruptions. FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire ; it_tbm ; it_coco ; it_key ; it_sci_transmit ; it_sci_receive ; it_sci_error ; it_spi_transmit ; it_spi_receive ; it_tim2_tof ; it_tim2_ch1f ; it_tim2_ch0f ; it_tim1_tof ; it tim1 ch1f (base du temps) (convertisseur A/N) (clavier) (transmission série asynchrone) (réception série asynchrone) (erreur de transmission) (transmission série synchrone) (réception série synchrone) (overflow : débordement) (timer 2 canal1) (timer 2 canal0) (overflow : débordement) (timer 1 canal1) ______________________________________________________________________________ 6 Code Warrior - nouveau projet structuré en langage Assembleur numEctron http://nalhossri.free.fr _______________________________________________________________________ FDB temporaire FDB temporaire FDB temporaire FDB temporaire ; Vecteur Reset FDB Entry ; it_tim1_ch0f ; it_pll ; it_irq ; it_swi (timer 1 canal0) (pll) (irq) (swi) END Vous avez bien fait de m'accompagner jusqu'ici... Le projet est maintenant fonctionnel ; vous allez pouvoir rentrer dans la phase de programmation pure et dure. Mais… pas d'affolement ! Pour vous faciliter la tâche et vous encourager, je vous propose ci-dessous un exemple qui fait complémenter le port B, par une demande d'interruption, toutes les 500 millisecondes, au Timer 1, ce qui fait clignoter les LEDs associées. Le fichier source main.asm précédent prend la forme qui suit (les codes rajoutés sont en bleu et commentaires qui les concernent, en vert) : ; Exemple: Interruption TOF ; Inclure les définitions des registres. INCLUDE 'MC68HC908GP32.inc' ORG RAMStart ; Début de la RAM, définit dans 'MC68HC908GP32.inc' ; Déclarer vos variables ou données ici: ; ... ORG ROMStart ; Début de la ROM (Flash),définit dans 'MC68HC908GP32.inc' Entry: ; Point d'entrée du programme LDHX #$240 ; Initialise le pointeur de pile TXS MOV #1,CONFIG1 ; Inhibe le WATCHDOG pour permettre ; l'initialisation du HC08 à la mise sous tension. CLI ; Autorise les interruptions. ; Programme main: ; Ecrire vos codes ici: ; ... ; Initialisation du PORTA MOV #$FF, DDRB MOV #0, PTB ; Initialisation du Timer1 MOV #$30, T1SC LDHX #19200 STHX T1MOD MOV #$46, T1SC ; PTA en sortie ; PTA = 0 ; Arrêt du Timer1 ; 500ms ; Lancement du Timer, interruption et pré-diviseur mainLoop: ; Ecrire vos codes ici: ;... BRA mainLoop ; Routine d'interruption TOF it_tim1_tof: ; Complémenter PTB ______________________________________________________________________________ 7 Code Warrior - nouveau projet structuré en langage Assembleur numEctron http://nalhossri.free.fr _______________________________________________________________________ LDA PTB EOR #$FF STA PTB ; Réinitialisation du Timer1 LDA T1SC MOV #$46,T1SC RTI ; Fin du programme ; Lecture du T1SC avant de mettre TSC_TOF à 0 ;T1SC_TOF = 0 ; Retour au programme ;******************************************************** ;* Routine des éventuelles interruptions "temporaire" déterminables ;* ultérieurement selon l'application. ;* Cette routine ne fait que générer le retour au programme principal ;* pour calmer le compilateur et éviter les erreurs de compilation de ce ;* modèle; cette routine peut être effacée dans le cas où toutes les ;* interruptions sont sollicitées dans une application ;******************************************************** temporaire: NOP RTI ; Retour au programme. ;******************************************************** ;* Vecteurs d'adresses et étiquettes, en commentaire, qui peuvent ;* remplacer "temporaire" selon la demande d'interruption souhaitée ;* Vecteur Reset est obligatoire. ;******************************************************** org $FFDC FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB it_tim1_tof FDB temporaire FDB temporaire FDB temporaire FDB temporaire FDB temporaire ; Vecteur Reset FDB Entry ; Début de vecteurs d'interruptions ; it_tbm ; it_coco ; it_key ; it_sci_transmit ; it_sci_receive ; it_sci_error ; it_spi_transmit ; it_spi_receive ; it_tim2_tof ; it_tim2_ch1f ; it_tim2_ch0f ; it_tim1_tof ; it_tim1_ch1f ; it_tim1_ch0f ; it_pll ; it_irq ; it_swi (base de temps) (convertisseur A/N) (clavier) (transmission série asynchrone) (réception série asynchrone) (erreur de transmission) (transmission série synchrone) (reception série synchrone) (overflow : débordement) (timer 2 canal 1) (timer 2 canal 0) (overflow: débordement) (timer 1 canal 1) (timer 1 canal 0) (pll) (/irq) (swi) END Vous pouvez télécharger le projet "MonPremierProjet_ASM" et l'exemple ici Rendez vous à la maison bleue ______________________________________________________________________________ 8 Code Warrior - nouveau projet structuré en langage Assembleur