|
Cominciamo ad usare l'I/O mappato.
Il testo dell'esercizio è il seguente:
Scrivere un programma Assembler per 8051 che faccia ruotare verso sinistra un LED rosso
all'incirca 5 volte al secondo.
Utilizzare una subroutine che esegua un ritardo.
NOTE:
- I LED sono connessi all'alimentazione positiva, quindi un livello logico
0 sull'uscita accende il LED, mentre un livello 1 lo spegne.
- I bottoni sono connessi a massa, quindi quando un bottone è premuto
leggeremo 0 sul corrispondente ingresso, mentre leggeremo 0 se è
rilasciato.
- I LED sono disposti dal bit 0 al bit 7, quindi una rotazione a destra
sposta la configurazione a sinistra.
- Per ulteriroi informazioni sulla programmazione del PPI della scheda GPC-F2, fare
riferimento alla pagina Hardware e mappa di memoria
della scheda del Manuale d'uso del programma PCMon.
Una possibile soluzione è la seguente:
;rotazione.asm
;Stefano Salvi - 17/8/02
;
;Questo programma fa' ruotare il un LED rosso verso sinistra una volta ogni 0.2 secondi
;
; I LED rossi sono connessi alla porta A del PPI.
; Il port A del PPI e' all'indirizzo 0FA00H nella memoria XDATA.
; Il port di Controllo del PPI e' all'indirizzo 0FA03H nella memoria XDATA.
; La programmazione del PPI sara' la seguente:
; 1xxx xxxx Programmo port
; x00x xxxx Port A -> modo 0
; xxx0 xxxx Port A -> output
; xxxx 0xxx Port C Hi -> out
; xxxx x0xx Port B -> modo 0
; xxxx xx1x Port B -> input
; xxxx xxx0 Port C Lo -> output
; ---------
; 1000 0010
;
.org 8050h
; Definisco alcune costanti utili:
.equ PPIPORTA, 0FA00h ; Port A del PPI
.equ PPICTL, 0FA03h ; Port di controllo del PPI
sjmp main ; salta le subroutine e va al programma principale
;----------------------- routine di ritardo ------------------------------------
; 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)
djnz R0,lp3 ; Ripete 'nop' (ci mette circa altri 2 uS)
djnz R1,lp2 ; ripete il ritardo precedente (200 * 3 -> 600 uS)
;
ret
;---------------------------------------------------------------------------
; main program
;---------------------------------------------------------------------------
main:
;----------------------inizializzazioni----------------------------------------
mov sp,#8Fh ; Imposta lo stack per la chiamata a 'delay'
; Programmo port, Port A -> modo 0, Port A -> output, Port C Hi -> out,
; Port B -> modo 0, Port B -> input, Port C Lo -> output
mov a,#10000010b ; imposto porta di controllo
mov dptr,#PPICTL
movx @dptr,a
mov a,#01111111b ; Configurazione dei LED - 0 -> Acceso, 1 -> Spento
mov dptr,#PPIPORTA ; Porta LED rossi
movx @dptr,a ; La invia ai LED
;
mainlp:
;
; Attende il ritardo necessario ed aggiorna la configurazione dei LED
;
acall delay ; chiama routine di ritardo
;
; Calcola la nuova configurazione e la visualizza
;
rr a ; Ruota la configurazione (Bit 0 va in Bit 7)
movx @dptr,a ; la manda sui LED
;
sjmp mainlp ; loop
.end
|
Il sorgente del programma è rotazione.asm ed il file
assemblato, pronto per l'esecuzione è rotazione.obj.
Per provare il programma, lo si deve caricare in
PCMon, assemblare e far
funzionare. Può funzionare anche in emulazione
[Home Page dell'ITIS "Fermi"]
[Indice Quarta]
[Precedente]
[Successivo]
© Ing. Stefano Salvi - Released under GPL licence
|