Per utilizzare il programmatore è necessario avere un programma in formato S19 da poter scaricare nel processore reale oppure nell'emulatore
Per produrre un programma in formato S19 occorre avere un compilatore oppure un assemblatore per processore MC68Hc08. Per i nostri esempi utilizzeremo il compilatore e l'assemblatore/linker contenuti nel pacchetto Small Device C Compiler (SDCC)
SDCC è un compilatore per vari tipi di microprocessore, tra cui appunto l'HC08. È disponibile per piattaforme Linux, Windows e Mac Os X e comprende anche assembler e linker.
SDCC è disponibile come pacchetto precompilato per molte distribuzioni. Nel caso della distribuzione Debian occorre installare il pacchetto sdcc-nf contenuto negli archivi non-free (da abilitare in /etc/apt/sources.list) per avere a disposizione assembler e linker per HC08.
Vediamo un semplice programma scritto in linguaggio Assembly
; ruotaled.asm ; ; MC68QY908 ; 2 PTB7 -> S5 (Al centro) ; 3 PTB6 -> EN_LCD - LED Verde ; 5 PTA4 -> RS_LCD - LED Giallo ; 15 PTB0 -> DB4 ; 14 PTB1 -> DB5 ; 11 PTB2 -> DB6 ; 10 PTB3 -> DB7 ;************************************************************************************ ;* Porte Parallele ;************************************************************************************ PTA = 0x00 ;I/O PORT A PTB = 0x01 ;I/O PORT B ;****** DATA DIRECTION REGISTERS A-B ************************************************ DDRA = 0x04 ;PORT A DATA DIRECTION REGISTER DDRB = 0x05 ;PORT B DATA DIRECTION REGISTER ;****** DATA DIRECTION REGISTERS A-B ************************************************ PTAPUE = 0x0B ;PULLUP ENABLE PORT A PTBPUE = 0x0C ;PULLUP ENABLE PORT B ;****** CONFIG 1 REGISTER *********************************************************** CONFIG1 = 0x001F ;CONFIG1 REGISTER ;****** CONFIG 2 REGISTER *********************************************************** CONFIG2 = 0x001E ;CONFIG2 REGISTER ; ; STARTPGM = 0xee00 ; L'inizio della ROM STARTRAM = 0x80 ; L'inizio della RAM RESETVECT = 0xfffe ; La posizione del vettore di reset ; .area PROGRAMMA (ABS) .org STARTPGM ; MAIN: rsp ; resetta lo stack pointer ; Inizializa i registri di configurazione del processore mov #0x31,*CONFIG1 ; LVI Reset disanilitato (5); ; Alimentazione LVI disabilitati (4) ; COP disabilitato (0) mov #0x08,*CONFIG2 ; Oscillatore esterno (4;3 = 01) ; Inizializza le porte mov #0x10,*PTA ; Accendo il LED Giallo mov #0x10,*DDRA ; Metto in OUT PTA4 mov #0x01,*PTB ; Accendo un LED (bit 0 di PTB) mov #0x80,*PTBPUE ; Abilita il Pull-Up sul pulsante mov #0x4F,*DDRB ; Mette in Output i 4 bit bassi di B ; La configurazione corrente dei LED e' mantenuta in A lda #0x1 ; Mette a 1 il bit 0 di A MAIN_LOOP: psha ; Salva la configurazione dei LED ; Ciclo di ritardo da circa 1S ; ripeto 5 * 255 * 255 volte una push ed una pull lda #5 ; Numro ripetizioni ciclo esterno LOOPP: psha ; Salva contatore ciclo esterno lda #0xFF ; Numero Ripetizioni ciclo intermedio LOOPA: ldx #0xFF ; 2 - Numero ripetizioni ciclo interno LOOPX: psha ; 2 pula ; 2 - Perde tempo dbnzx LOOPX ; 3 - Ciclo interno dbnza LOOPA ; 3 - Ciclo intermedio pula ; Recupera il contatore del ciclo esterno dbnza LOOPP ; Ciclo esterno di ritardo pula ; Recupera la configurazione die LED ; Fine cicli di rtaardo lsla ; Ruota a sinistra i LED cmp #0x10 ; Dopo 4 rotazioni, A vale 0x10 bne CONTINUA_ROTAZIONE ; Se non c'รจ arrivato, continua lda #0x1 ; Mette a 1 il bit 0 di A CONTINUA_ROTAZIONE: sta *PTB ; Accende i LED ; Adesso controlla il pulsante connesso a PTB7 brclr #7,*PTB,PRESSED ; Controlla il pulsante bclr #6,*PTB ; Rilasciato - Led Giallo Acceso bset #4,*PTA ; Rialsciato - LED Verde Spento bra CLEARED ; Torna al codice comune PRESSED: bset #6,*PTB ; Premuto - Led Giallo Spento bclr #4,*PTA ; Premuto - LED Verde Acceso CLEARED: bra MAIN_LOOP ; Ciclo infinito ; .area RESET (ABS) .org RESETVECT .word MAIN ; Vettore di RESET
Per assemblare questo programma utilizzeremo il programma make che ci consente di non digitare a mano io comandi uno ad uno. Per assemblare il nostro esempio occorre un file che indichi il lavoro da fare al comandon make. Questo file si chiama Makefile e d ha il seguente contenuto
#Makefile # Regola per indicare come linkare un file .rel ed ottenere un .s19 %.s19: %.rel ( echo -s ; echo $< ; echo -e ) | aslink -c > /dev/null mv $*.S19 $*.s19 # Regola che indica come assemblare un file .asm ottenendo un file .rel %.rel : %.asm as-hc08 -lpo $< # Regole specifiche per il file da assemblare all: ruotaled.s19 ruotaled.s19: ruotaled.rel ruotaled.rel: ruotaled.asm # Regola per cancellare i file intermedi clean: rm *.s19 rm *.lst rm *.rel
Attenzione che le righe indentate devono iniziare con un carattere tab e non con una serie di spazi, altrimenti make non accetterà il file.
Una volta preparati i file, potremo assemblare e linkare il programma con il comando
make
Dopo aver verificato che il comando non abbia dato errori e verificato che sia stato prodotto il file ruotaled.s19 potremo porre il jumper JP1 in posizione 1-2 (Mon) e scaricare il programma sulla scheda con i comandi
hc080gm -s /dev/ttyS0 -c hc08pgm -s /dev/ttyS0 -p ruotaled.s19
se il programmatore è connesso alla prima porta seriale (COM1: del Dos); altrimenti
hc080gm -c hc08pgm -p ruotaled.s19
se la scheda è connessa ad un adattatore USB/Seriale.
Se non compaiono errori, spostando il jumper JP1 in posizione 2-3 (User), vedremo i LED rossi DB4-DB7 ruotare e i LED giallo RS e verde EN commutare se si preme il pulsante S5 (i led commutano in contempooranea con il cambiamento dei LED rossi).
Volendo, è possibile emulare il programma con il comando
hc08pgm -f ruotaled.s19
È possibile scaricare l'archivio ruotaled.tar.bz2 contenete il sorgente, il Makefile ed il file assemblato ruotaled.s19 da qui (dimensione 1.978 byte)
Vediamo ora un semplicissimo programma scritto in C
/* Lampeggio LED su PA4 su un mc68hc908qt4 * Compilato con SDCC */ // Carica le definizioni dei nomi dei registri del processore #include// Se non ci sono variabili globali, il compilatore genera codice d'avvio scorretto unsigned char i = 0, j = 0, k = 0; void main () { PTA = 0xff; // PTA ad 1 meno PTA4 (LED) DDRA = 0x10; // PTA4 in output PTAPUE = 0; // Disabilita il Pull-Up del port B /* Configurazione standard del processore */ CONFIG1 = 0x31; CONFIG2 = 0; for (;;) { // Loop annidati di ritardo for (i = 0; i < 4; i++) { for (j = 0; j < 255; j++) { for (k = 0; k < 255; k++) { } } } PTA ^= 0x10; // Inverte il bit del LED (PTA4) } }
Per compilarlo possiamo utilizzare il seguente Makefile
# Makefile # Programmi c HC68HC908 vari # # SDCC_OPTS=-mhc08 --stack-loc 0xff --data-loc 0x80 --code-loc 0xF800 # Force ROM Start for QY4 Processor SDCC_LINKOPTS=--out-fmt-s19 ${SDCC_OPTS} all : blink_c_qt.s19 blink_c_qt.rel: blink_c_qt.c sdcc ${SDCC_OPTS} -c blink_c_qt.c blink_c_qt.s19: blink_c_qt.rel sdcc ${SDCC_LINKOPTS} blink_c_qt.rel mv blink_c_qt.S19 blink_c_qt.s19 clean : rm *.lst rm *.lnk rm *.rel rm *.map rm *.mem rm *.rst rm *.s19
Attenzione che le righe indentate devono iniziare con un carattere tab e non con una serie di spazi, altrimenti make non accetterà il file.
Una volta preparati i file, potremo compilare, assemblare e linkare il programma con il comando
make
Dopo aver verificato che il comando non abbia dato errori e verificato che sia stato prodotto il file blink_c_qt.s19 potremo porre il jumper JP1 in posizione 1-2 (Mon) e scaricare il programma sulla scheda con i comandi
hc080gm -s /dev/ttyS0 -c hc08pgm -s /dev/ttyS0 -p blink_c_qt.s19
se il programmatore è connesso alla prima porta seriale (COM1: del Dos); altrimenti
hc080gm -c hc08pgm -p blink_c_qt.s19
se la scheda è connessa ad un adattatore USB/Seriale.
Se non compaiono errori, spostando il jumper JP1 in posizione 2-3 (User), vedremo il LED giallo RS lampeggiare al ritmo di circa una volta al secondo.
Volendo, è possibile emulare il programma con il comando
hc08pgm -f blink_c_qt.s19
È possibile scaricare l'archivio blink_c_qt.tar.bz2 contenete il sorgente, il Makefile ed il file assemblato blink_c_qt.s19 da qui (dimensione 1.201 byte)
Prof. Stefano Salvi