La page 68HC11de Martial BENOIT

1er pas (EXEMPLES)


 

Voici quelques petits programmes pour débuter en assembleur sur 68HC11.

Ces programmes sont destinés à la carte de développement 68HC11F1 décrite sur se site, mais elles sont portables sur
les autres membres de la famille 68HC11.

Exemple 1:
Le premier exemple a pour but d'attendre la réception d'une donnée sur le port SCI (port série du 68HC11) et de la re-émettre sur la SCI à destination du PC. Du coté PC on utilisera un logiciel du genre HyperTerminal qu'on aura configuré sur le bon port COM et avec les mêmes paramêtres de vitesse que ceux du 68HC11.
Le source du programme est à votre disposition.

Comment ca marche?
Après avoir récupéré le fichier du source, ouvrez-le avec un éditeur de texte (NOTEPAD par exemple sous WIN9x). Le source se décompose en deux parties:

* La partie déclarative
* L'ensemble des parties exécutables du programme

La partie déclarative:

Comme son nom l'indique, cette partie du source contient au minimum les déclarations nécessaires au bon fonctionnement de votre programme. Dans le cas présent elle est composée comme suit:


* Equivalences utilisées avec un offset $1000
*
BAUD EQU $2B Baudrate selector
SCCR1 EQU $2C SCI control register 1
SCCR2 EQU $2D SCI control register 2
SCSR EQU $2E SCI status register
SCDR EQU $2F SCI Rx/Tx data register
CSCTL EQU $5D Chip Select control


Ci-dessus, on a défini les adresses des registres internes du 68HC11. Dans le commentaire on précise que ces équivalences sont à utiliser avec un offset (décalage) de $1000 (0x1000 en hexadécimal). En effet, par défaut les registres des resources internes du 68HC11 sont localisées à partir de l'adresse $1000. Le fait de déclarer la position des registres par rapport au début de la zone des registres du 68HC11, offre la possibilité d'utiliser l'adressage indexé ou l'adressage direct. Dans cet exemple nous utiliserons l'adressage indexé.

* Equivalence pour la config Memoire
*
RAMSTR EQU $0000 Adresse de debut de la RAM interne
RAMEND EQU $03FF Adresse de fin de la RAM interne
IEESTR EQU $0E00 Adresse de la EEPROM interne
EEPROM EQU $8000 Adresse du debut de la 26C256
REGBASE EQU $1000 Adresse de base des ressources internes


Ci-dessus, on a défini les adresses qui vont nous permettre de savoir ou sont les ressources à note disposition. Les commentaires en bout de ligne parlent d'eux-mêmes.

*** Constantes ***
TDRE EQU $80 masque pour Transmit Buffer Empty
RDRF EQU $20 masque pour Reciever Buffer Full
CR EQU 13 Carriage Return (retour charriot)
LF EQU 10 Line Feed (ligne suivante)


Ci dessus, on a défini des équivalences pour des constantes jugées nécessaires à notre application.

Les parties exécutables du programme:
Cette partie du source peut être décomposée en trois parties comme suit:

* L'initialisation
* La routine principale (ou corps du programme)
* Les routines et vecteurs d'interruptions

L'initialisation:

*** code du programme ***
ORG EEPROM
START:
LDS #RAMEND affectation du registre de la pile.
LDX #REGBASE "X" contien l'add de base des registres.

CLR CSCTL,X desactive les chip select du 68HC11F1

*** reglage de la SCI ***
CLR SCCR1,X Initialise la SCI pour 8 bits de donnee
LDD #$300C "A"= 30, "B"=0C 19200 bauds
STAA BAUD,X 19200 bauds max, selectionne 19200 bauds
STAB SCCR2,X autorise TX & RX

Ci-dessus, on a affecté le pointeur de pile 'S' avec la dernière adresse de la RAM interne du 68HC11F1. En effet quand on va empiler des données sur la pile, le pointeur va avoir tendance à se rapprocher du début de la RAM (adresse 0 donc).
En suite on affecte le registre X pour qu'il pointe sur l'adresse de base des resources internes du 68HC11F1. Le reste des lignes parlent d'elles mêmes.

La routine principale:


*** MAIN LOOP ***
LOOP:
BSR CHR_IN
BRA LOOP

* Reception d'un caractere sur la SCI et echo vers le PC
*
CHR_IN:
BRCLR SCSR,X $20 *
LDAB SCDR,X
BRCLR SCSR,X $80 *
STAB SCDR,X
RTS


On déclare une étiquette 'LOOP'. On appelle la sous-routine 'CHR_IN'. Et on rebranche à l'adresse symbolisée par 'LOOP'.
La sous-routine 'CHR_IN' débute par l'instruction 'BRCLR' qui signifie BRanch si CLeaR (branche si zéro). L'instruction lit le registre 'SCSR' (SCI status register) le registre d'état du port SCI avec le masque '$20' le signe $ signifie que la valeur est en hexadécimal, dans ce cas seul le bit 5 nous intéresse.
Tant que ce bit sera à zéro on branchera à l'adresse de l'instruction en cours d'exécution, ceci est représenté par le '*'.
Pour résumer cette instruction va s'exécuter tant que le bit 5 du registre SCSR ne sera pas à 1


Les routines et vecteurs d'intéruptions:

************************* ROUTINES D'INTERRUPTIONS ************************
v_sci:
v_spi:
v_paie:
v_pao:
v_to:
v_toc5:
v_toc4:
v_toc3:
v_toc2:
v_toc1:
v_tic3:
v_tic2:
v_tic1:
v_rti:
v_irq:
v_xirq:
v_swi:
v_iot:
v_copf:
v_copcmf:
JMP START


C'est ici que seront placées les éventuelles routines de traitement d'interruption.

************************* VECTEURS D'INTERUPTIONS ************************
ORG $FFC0
ZMB 22

FDB v_sci
FDB v_spi
FDB v_paie pulse accumulator input edge
FDB v_pao pulse accumulator overflow
FDB v_to timer overflow

FDB v_toc5 timer output compare 5
FDB v_toc4 timer output compare 4
FDB v_toc3 timer output compare 3

FDB v_toc2 timer output compare 2
FDB v_toc1 timer output compare 1
FDB v_tic3 timer input capture 3
FDB v_tic2 timer input capture 2
FDB v_tic1 timer input capture 1

FDB v_rti real time interupt
FDB v_irq masquable interupt
FDB v_xirq non masquable interupt
FDB v_swi software interupt
FDB v_iot illegal opcode trap
FDB v_copf cop failure
FDB v_copcmf cop clock monitor fail
FDB START reset

END


C'est la liste des vecteurs d'interruptions du 68HC11. C'est une table d'adresses qui pointent sur les routines de traitement des interruptions. Pour ce premier exemple seul le dernier vecteur 'reset' nous importe. En effet on remarque qu'il pointe sur la rouitne 'START'. Qui est le nom de l'étiquette placée au début de la routine d'initialisation.