|
Incominciamo ad introdurre le subroutine
Il testo dell'esercizio è il seguente:
Scrivere un programma Assembler per 8051 che faccia lampeggiare il LED giallo connesso al bit 2 della porta P1 alla frequenza di 8 ... 10 volte al secondo.
Usare una subroutine per il ritardo.
Note:
- È da notare il commento della subroutine, che è standard di stile,
come già indicato nel capitolo sullo
stile di codifica. Il commento deve contenere:
- Un commento molto evidente, contenente il nome della funzione
- Una descrizione del funzionamento della subroutine, contenete anche eventuali
note sull'algoritmo usato
- un elenco dei parametri di ingresso (input:) che elenchi tutti i
dati usati dalla funzione, indicando in che registri/variabili globali vanno posti
- Un elenco dei valori ritornati (output:) che indichi che cosa
viene ritornato ed in quali registri/variabili globali saranno lasciati
- Un elenco dei registri/variabili globali modificate dalla subroutine
(modifica:), ed il cui valore non è stato ripristinato prima di terminare
la subroutine.
Tutte queste informazione devono comparire sempre nel commento prima di ogni
subroutine.
Le parole input:, output: e modifica: devono
comparire necessariamente nel commento, all'inizio di una riga.
Una possibile soluzione è la seguente:
; lampeggio1.htm
; Stefano Salvi - 15/8/02
;
; Fa' lampeggiare il LED giallo connesso a P1.2
;
.org 8050h ; Locazione di inizio e caricamento del programma
;
sjmp main ; salta le subroutine e va' al programma
;
; ------------------ delay -------------------
; Ritardo di circa 0,2 secondi
; Con il quarzo a 1059200 Hz, l'8051 esegue 921600 cicli al secondo
; Se voglio 5 lampeggi al secondo, devo avere un ritardo di 184320 cicli.
; Ipotizzando di avere un' 'operazione base' di 4 cicli, 240 ripetizioni di
; questa operazione porteranno ad impiegare 240*4 = 960 cicli totali.
; Se ora ripeteremo qesto ritardo base per 192 volte, otterremo 960*192=184320
; cicli int otale (non contando i 4 cicli aggiuntivi per ripetere il ritardo
; base, pari a 192*4=768)
; Ingresso:
; nessuno
; Uscita:
; nessuna
; Modifica:
; r0,r1
delay:
mov R1,#192 ; 192 ripetizioni di un ritardo base
lp2: ; Ciclo Esterno
mov R0,#240 ; 200 ripetizioni di piccolo ritardo (2 nop)
lp3: ; Ciclo Interno
nop ; operazione nulla - circa un micorsecondo (uS)
nop ; operazione nulla - circa un micorsecondo (uS)
djnz R0,lp3 ; Ripete 'nop' (ci mette circa altri 2 uS)
djnz R1,lp2 ; ripete il ritardo precedente (200 * 3 -> 600 uS)
;
ret
; programma principale (c'e' solo quello)
;
main:
mov sp,#8fh ; imposta lo stack per le subroutine
clr P1.2 ; Inizialmente accende il LED
;
lp1: ; Ciclo Programma
acall delay ; ritardo di citca 0,13 S
cpl P1.2 ; Commuta il LED (spegne se acceso, accende se spento)
sjmp lp1 ; loop infinito
;
.end
|
Il sorgente del programma è lampeggio1.asm ed il
file assemblato, pronto per l'esecuzione è
lampeggio1.obj.
Per provare il programma, lo si deve caricare in
PCMon, assemblare e far
funzionare. Può funzionare anche in emulazione, sebbene i tempi del lampeggio non siano
precisi.
[Home Page dell'ITIS "Fermi"]
[Indice Quarta]
[Precedente]
[Successivo]
© Ing. Stefano Salvi - Released under GPL licence
|