AngoLinux

Rotazione dei LED rossi sul piastrino TIO16

- A cura del Prof. Stefano Salvi -


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