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