Concetti software

I microcontroller ST62 sono basati su un'architettura a 8 bit. Non possiedono istruzioni specifiche per il trattamento di grandezze maggiori di 8 bit, pertanto i registri e le celle di memoria possono contenere solo valori interi compresi tra 0 e 255. Operazioni con valori più grandi, o con dati di tipo diverso, possono essere realizzate scrivendo appositi algoritmi.

WATCH DOG TIMER
Gli ST possiedono al loro interno un watch dog timer (cane da guardia) per assicurarne la ripartenza in caso di blocco accidentale. In pratica il WDT è un contatore che si decrementa ciclicamente in modo automatico e se arriva a zero resetta il microcontroller. E' compito del programmatore provvedere di tanto in tanto alla ricarica del WDT prima che il tempo scada (altrimenti il programma si interrompe e riparte da capo). Per fare questo è sufficiente scrivere un valore (ad esempio 255) nel registro WDOG:  LDI WDOG,255. (Approfondimento)

REGISTRI:
A  Accumulatore
V e W Registri per uso generale
X e Y Registri per uso generale e come indici di memoria RAM
(Approfondimento)

PROGRAMMAZIONE:
Essendo un microcontroller set di istruzioni è abbastanza ridotto e semplice, la lista completa si trova nella pagina "lista istruzioni". Gli operandi con cui si può lavorare sono: registri, celle di memoria, celle di memoria indicizzate tramite registro, valori immediati.

Le celle di memoria RAM possono essere puntate tramite un registro indice (X o Y) oppure avere un nome ed essere trattate a tutti gli effetti come un qualsiasi altro registro. La direttiva di compilazione DEF permette di definire il nome di una qualsiasi cella di memoria, sia dell'area dati utente, sia delle aree in cui sono mappati i registri e le periferiche.

Tutti i programmi per ST iniziano con una parte  in cui si definiscono i nomi delle aree che si vogliono usare:

;---------------------------------------------------------
; ESEMPIO DI DEFINIZIONE DI 3 CELLE DI MEMORIA
;---------------------------------------------------------
A        .def 0ffh!m        ; Registro A
WDOG     .def 0d8h          ; Registro del watch dog
PIPPO    .def 084h          ; Area di lavoro nella RAM
;---------------------------------------------------------

Da questo momento è possibile effettuare operazioni con queste celle:
LDI PIPPO,45   ADD A,PIPPO    ecc...

Il programma vero e proprio deve essere caricato all'indirizzo 0880h se si usa un ST6210/15, o all'indirizzo 0080h se si usa un ST6220/25. Nel primo caso può essere lungo fino a 1828 bytes, nel secondo fino a 3872 bytes. Possono sembrare pochi, ma lavorando in assembler, e considerando che questi sono solo dei microcontroller (e non dei microprocessori per compiti complessi) sono più che sufficienti.

La direttiva di compilazione ORG permette di definire a quale indirizzo andranno caricati i bytes di codice eseguibile ottenuti dalla compilazione delle istruzioni. Se si usa un ST6220 si dovrà scrivere: .ORG 0080h

Nel programma inoltre deve sempre essere inclusa una sezione con il vettore di interruzione di RESET, e questo perchè all'accensione il microcontroller genera automaticamente un int di reset.

Questo vettore fisicamente è allocato negli ultimi due bytes della EPROM (indirizzi 0FFEh-0FFFh) e consiste in un'istruzione di salto (JP indirizzo) all'inizio del programma.
In pratica in un ST6220/25 si mette un JP 0080h e in un ST6210/15 si mette un JP 0880h o, ancora meglio, si mette una label chiamata inizio e ci pensa il compilatore a convertirla nel giusto indirizzo.

Come prima istruzione di programma deve essere messa la "ricarica" del WDT, e come seconda un RETI (ritorno da interrupt). Il microcontroller con questo primo RETI in realtà non "ritorna" da nessuna parte e il programma prosegue con l'istruzione successiva.

;---------------------------------------------------------
; ESEMPIO DI STRUTTURA BASE PER UN PROGRAMMA SU ST6220/25
;---------------------------------------------------------
; REGISTRI ST6220/25
;---------------------------------------------------------
X        .def 80h!m         ; Index register.
Y        .def 81h!m         ; Index register.
V        .def 82h           ; Short direct register.
W        .def 83h           ; Short direct register.
A        .def 0ffh!m        ; Accumulator.
PORT_A   .def 0c0h          ; Port a data register.
PORT_B   .def 0c1h          ; Port b data register.
PORT_C   .def 0c2h          ; Port c data register.
PDIR_A   .def 0c4h          ; Port a direction register.
PDIR_B   .def 0c5h          ; Port b direction register.
PDIR_C   .def 0c6h          ; Port c direction register.
POPT_A   .def 0cch          ; Port a option register.
POPT_B   .def 0cdh          ; Port b option register.
POPT_C   .def 0ceh          ; Port c option register.
IOR      .def 0c8h          ; Interrupt option register.
DRW      .def 0c9h          ; Data rom window register.
ADR      .def 0d0h          ; A/D data register.
ADCR     .def 0d1h          ; A/D control register.
PSC      .def 0d2h          ; Timer prescaler register.
TCR      .def 0d3h!m        ; Timer counter register.
TSCR     .def 0d4h          ; Timer status control register.
WDOG     .def 0d8h          ; Watchdog register.
;---------------------------------------------------------
         .org 0080h
INIZIO:  LDI  WDOG,255
         RETI

          ... QUI VANNO LE ISTRUZIONI DEL PROGRAMMA ...
 

;---------------------------------------------------------
; DEFINIZIONE VETTORI DI INTERRUPT
;---------------------------------------------------------
         .org   0FFEh
         JP INIZIO

         .END
;---------------------------------------------------------

Alla fine del programma deve sempre essere messa la direttiva di compilazione .END.

SUBROUTINES:
Con l'istruzione CALL è possibile chiamare una subroutine (o sottoprogramma). L'indirizzo di ritorno viene memorizzato in uno stack hardware a 6 posizioni separato dalla RAM, sono perciò possibili al massimo 6 livelli di annidamento delle chiamate.

Con l'istruzione RET si termina il sottoprogramma, l'indirizzo di ritorno viene estratto dallo stack e il programma prosegue con l'istruzione seguente la CALL.

Se si usano gli interrupt si deve ricordare che l'avvio di un gestore di interrupt è equivalente a una CALL, e pertanto richiede la memorizzazione di un valore nello stack. Con RETI si termina il gestore dell'interrupt e si recupera dallo stack l'indirizzo di programma a cui tornare.

PECULIARITA' SUI FLAGS
Istruzioni LD: C invariato, Z settato se il valore è 0.
Istruzioni ADD SUB e CP: C e Z variati. C viene resettato automaticamente prima di eseguire queste istruzioni.
Istruzioni INC e DEC: C invariato, Z settato se il risultato è 0.
Istruzioni CLR: C e Z invariati. Solo nel caso di CLR A  i flags C e Z vengono settati.

Un gestore di interrupt, attivato da una periferica interna o dal pin NMI, usa un set alternativo di flags. Con l'istruzione RETI i flags riprendono il valore che avevano prima della richiesta di interrupt.

Nota: Per resettare il flag C si può effettuare un CP A,A (il flag Z però viene settato).


Pagina realizzata da Claudio Fin  -  Ultimo aggiornamento 5-11-1999