Esempi d'uso

- A cura del Prof. Stefano Salvi -


Programmi necessari

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.

Esempio di programmazione Assembler

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)



Esempio di programmazione C

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