Impostare un programma

In questa pagina verra' descritto dettagliatamente il programma START che puo' anche essere prelevato nella pagina delle routine di esempio. Questo programma e' un esempio tipico di come va impostato un programma per micro ST6. L'esempio si riferisce ai micro ST621x e 2x, ma e' valido anche per altri modelli.




Inizio del programma

;*********************************************************************
;*                                                                   *
;*         FILE SORGENTE DI BASE PER I MICRO ST6210/16/20/25         *
;*                                                                   *
;*********************************************************************

; by Giuseppe Di Paolo 1996/98
; gdipaolo@mail2.clio.it
Tutte 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.

Direttive assembler

	.title  "TITOLO DEL PROGRAMMA"

	.vers   "ST62E20"       ; TIPO DI MICROPROCESSORE USATO
Le 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.

Registri del micro

;**********************************************************************
;*                       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

;**********************************************************************
;*                         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.

Impostazioni iniziali

;*********************************************************************
;*                       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 PRINCIPALE
La 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

;**********************************************************************
;*                       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
	reti
Quando 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

;********************************************************************
;*                         SUBROUTINE                               *
;********************************************************************

; ESEMPIO
clock					; subroutine CLOCK
	"   "    "	    ; ISTRUZIONI DELLA SUBROUTINE
	"   "    "
	"   "    "
	ret			; esce dalla subroutine
Le 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

;*******************************************************************
;*                      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 interrupt

;*********************************************************************
;*                     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 INIZIALE
Queste 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").

Fine del programma

	.end                    ; Termine del programma
La 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