;********************************************************************* ;* * ;* FILE SORGENTE DI BASE PER I MICRO ST6210/16/20/25 * ;* * ;********************************************************************* ; by Giuseppe Di Paolo 1996/98 ; gdipaolo@mail2.clio.itTutte queste righe sono dei COMMENTI, perche' iniziano con il segno di punto e virgola ; e quindi verranno ignorate dall'assemblatore. E' molto utile inserire questi commenti in tutte le parti del programma, per descrivere il funzionamento delle singole parti e anche delle singole istruzioni. In questo caso, all'inizio del programma viene inserito il titolo, l'autore e una breve descrizione. E' utilissimo anche descrivere qui le connessioni delle porte di I/O del micro, le varie modifiche e aggiunte apportare durante lo sviluppo del programma e tutte le informazioni che ritenete utili per rendere piu' facile una comprensione e una lettura del programma anche a distanza di tempo.
.title "TITOLO DEL PROGRAMMA" .vers "ST62E20" ; TIPO DI MICROPROCESSORE USATOLe direttive .title e .vers permettono di specificare il titolo del programma e la vesione di micro da usare. In questa parte di programma si possono inserire anche altre direttive come ad esempio .w_on per usare la DRW. Notate che la scritta "TIPO DI MICROPROCESSORE USATO" e' un commento perche' e' preceduto dal punto e virgola.
;********************************************************************** ;* VARIABILI DEL MICRO * ;********************************************************************** .input "st62reg.inc"Qui vengono definiti tutti i registri interni del micro che sono indispensabili in qualsiasi programma. Poiche' i registri sono sempre uguali per qualsiasi programma, sono stati definiti all'interno di un altro file chiamato st62reg.inc che viene incluso nel nostro programma tramite la direttiva .input. Per i micro ST626x c'e' un altro file chiamato invece st626reg.inc. Questi files possono essere prelevati nella pagina degli esempi, oppure cliccando QUI
;********************************************************************** ;* VARIABILI DEL PROGRAMMA * ;********************************************************************** prova .def 084h ;DEFINISCE LA VARIABILE 'PROVA' tempo .def 085h ;DEFINISCE LA VARIABILE 'TEMPO'Le variabili sono delle celle di memoria RAM contenenti i dati che vengono elaborati e manipolati all'interno del programma. In questo esempio la variabile "prova" corrisponde alla cella di memoria RAM con indirizzo 084h. Non si possono usare due variabili con lo stesso nome.
;********************************************************************* ;* SETTAGGIO INIZIALE * ;********************************************************************* ; PER I MICRO ST6210/15 CON 2Kbyte DI ROM/EPROM USATE L'ISTRUZIONE : .org 0880h ; PER I MICRO ST6220/25/60/65 CON 4Kbyte DI ROM/EPROM USATE : .org 080h inizio ; INIZIALIZZAZIONE DELLE PERIFERICHE ldi wdog,0ffh ; RICARICA IL WATCH DOG ; ************* IMPOSTAZIONE DELLE PORTE I/O ******************* ldi pdir_a,11111111b ldi popt_a,11111111b ldi port_a,00000000b ; porta A come uscita push-pull ldi pdir_b,00000000b ldi popt_b,00000000b ldi port_b,00000000b ; porta B come input pull-up ldi pdir_c,11111111b ldi popt_c,00000000b ldi port_c,00000000b ; porta C come uscita OC ldi adcr,0 ;DISABLE A/D INTERRUPT ldi tscr,0 ;DISABLE TIMER INTERRUPT ldi ior,0 ;DISABLE ALL INTERRUPT reti ;RIPRISTINA I FLAG PRINCIPALI jp main ;SALTA AL PROGRAMMA PRINCIPALELa direttiva .org specifica l'indirizzo di partenza del programma all'interno della ROM/EPROM del micro a va modificata a seconda della dimensione della memoria del micro usato. Quando il micro ST6 viene resettato o viene alimentato, il programma salta automaticamente all'etichetta "inizio" per cui le successive istruzioni servono ad inizializzare il microprocessore. Vengono definite le configurazioni delle porte di I/O in funzione dell'uso che poi dovrete farne all'interno del programma. Andate alla pagina "Porte di I/O" per maggiori informazioni. Le successive istruzioni servono a disabilitare tutti gli interrupt. L'istruzione "jp main" serve poi per saltare al programma principale.
;********************************************************************** ;* SUBROUTINE DI INTERRUPT * ;********************************************************************** ad_int ;INTERRUPT DEL CONVERTITORE A/D reti tim_int ;INTERRUPT DEL TIMER reti BC_int ;INTERRUPT DELLE PORTE A e B reti A_int ;INTERRUPT DELLA PORTA A reti nmi_int ;INTERRUPT NON MASCHERABILE retiQuando si verifica un interrupt durante l'esecuzione del programma, il micro salta ad una di queste subroutine in funzione del tipo di interrupt. Notate che tutte queste subroutine devono terminare con l'istruzione "reti".
;******************************************************************** ;* SUBROUTINE * ;******************************************************************** ; ESEMPIO clock ; subroutine CLOCK " " " ; ISTRUZIONI DELLA SUBROUTINE " " " " " " ret ; esce dalla subroutineLe subroutine sono dei pezzi di programma che vengono richiamati dal programma principale o da altre subroutine tramite l'istruzione "call". Tutte le subroutine devono sempre iniziare con una etichetta (esempio "clock") e terminare con l'istruzione "ret". E' bene suddidere tutto il programma in subroutine, ognuna con una specifica funzione, in modo da rendere piu' facile la lettura e la correzione del programma e permettendo di riutilizzare alcune parti del programma anche in altre future applicazioni. Inoltre e' consigliabile inserire all'interno delle subroutine delle parti di programma che devono essere richiamate frequentemente durante il funzionamento in modo da non riscrivere piu' volte le stesse istruzioni.
;******************************************************************* ;* PROGRAMMA PRINCIPALE * ;******************************************************************* main ; INIZIO DEL PROGRAMMA PRINCIPALE ldi wdog,0feh ;RICARICA IL WATCH DOG call clock ;RICHIAMA LA SUBROUTINE 'clock' (ESEMPIO) ; ... ;ALTRE ISTRUZIONI ; ... ; " " "Questo e' il programma principale che deve iniziare sempre con l'etichetta "main".
;********************************************************************* ;* VETTORI DI INTERRUPTS * ;********************************************************************* ; Questa parte deve essere riportata alla fine del MAIN e prima della ; istruzione finale .END . ; Queste istruzioni non dovranno essere modificate. .org 0ff0h jp ad_int ;INTERRUPT DEL CONV. A/D vector #4 jp tim_int ;INTERRUPT DEL TIMER vector #3 jp BC_int ;INTERRUPT PORTE A e B vector #2 jp A_int ;INTERRUPT PORTA A vector #1 .org 0ffch jp nmi_int ;INTERRUPT NON MASCHERABILE vector #0 jp inizio ;INTERRUZIONE PER IL SETTAGGIO INIZIALEQueste istruzioni vanno inserire alla fine del programma MAIN per definire tutti i vettori di interrupt. In pratica queste righe specificano a quali etichette il micro deve saltare in corrispondenza di un interrupt. Notate la presenza dell'etichetta "inizio" che corrisponde al vettore di RESET (quando il micro viene resettato o alimentato salta a "inizio").
.end ; Termine del programmaLa direttiva .end specifica la fine del programma, per cui questa e' sempre l'ultima riga da inserire.
© Giuseppe Di Paolo '98
Aggiornato giovedě 6 agosto 1998