Lezione 2

Step 4/4

Passo precedenteInizio lezionePasso successivo

Realizziamo le "Luci in sequenza"

 

Proviamo ora a fissare i concetti finora appresi rielaborando il source LED.ASM presentato nella prima lezione per realizzare un lampeggiatore sequenziale a quattro led. Il nuovo source modificato si chiamerà SEQ.ASM.

Nella figura seguente viene riportato lo schema elettrico del nuovo circuito, sostanzialmente equivalente al circuito presentato nella prima lezione, con l'unica variante che ora i led collegati sono quattro anziché uno.

Le linee di I/O utilizzate sono RB0 per primo led, RB1 per il secondo, RB2 per il terzo ed RB3 per il quarto. Esse vanno quindi configurate tutte in uscita all'inizio del programma cambianto le istruzioni:

	movlw 11111110B
	movwf TRISB

in

	movlw 11110000B
	movwf TRISB

in cui i quattro bit meno significativi, corrispondenti alle linee RB0,1,2,3 vengono messi a zero per definire tali linee in uscita.

Nell'area di memoria del REGISTER FILE (che nel source inizia con la direttiva ORG 0CH) oltre ai due byte referenziati dalla label Count, riserviamo un ulteriore byte con label Shift che utilizzeremo per determinare la sequenza di accensione dei led. La direttiva da inserire è:

Shift	RES	1

Prima di eseguire il ciclo principale (label MainLoop) inizializiamo il nuovo registro Shift a 00000001B con le seguenti istruzioni istruzioni:

	movlw	00000001B
	movwf	Shift

A questo punto, nel ciclo principale del nostro programma, ci occuperemo di trasferire il valore memorizzato nel registro Shift sulla Porta B ottenendo quindi l'accensione del primo led, con le seguenti istruzioni:

	movf	Shift,W
	movwf	PORTB

quindi di effettuare lo shift a sinistra del valore contenuto in Shift di un bit, con le seguenti istruzioni:

	bcf	STATUS,S
	rlf	Shift,F

la prima istruzione serve ad azzerare il bit CARRY del REGISTRO DI STATO che verrà analizzato nelle lezioni successive. L'istruzione RLF Rotate Left F through Carry (ruota a sinistra attraverso il bit di carry) sposta di un bit verso sinistra il valore memorizzato nel registro Shift inserendo nella posizione occupata dal bit 0 il valore del bit di Carry (che come già detto andremo a vedere in seguito). Per far si che il bit inserito sia sempre zero viene eseguita prima della RLF l'istruzione BCF STATUS,C per azzerare questo bit.

A questo punto il registro Shift varrà 00000010B, quindi, al ciclo successivo, una volta trasferito tale valore sulla port B si otterrà lo spegnimento del LED1 e l'accensione del LED2 e così via per i cicli successivi.

Quando il bit 4 di Shift varrà 1, vorrà dire che tutti e quattro i led sono stati accesi almeno una volta e occorre quindi ripartire dal led 1. Le istruzioni seguenti svolgono questo tipo di controllo:

	btfsc	Shift,4
	swapf	Shift,F

L'istruzione btfsc Shift,4 controlla appunto se il bit 4 del registro Shift vale 1. Se si esegue l'istruzione successiva swapf Shift,F, altrimenti la salta.

L'istruzione swap (dall'inglese "scambia") in pratica scambia i quattro bit più significativi contenuti nel registro Shift con i quattro meno significativi. Dal valore iniziale del registro Shift pari a 00010000B ottenuto dopo alcune ripetizioni del ciclo MainLoop si ottiene il valore 00000001B ed in pratica alla riaccensione del primo led.

 
Home page

PICPOINT, SXPOINT and ELETTROSHOP (C) 1997/98 by Andrea Galizia
For comments on this web site, write to webmaster@picpoint.com
Web design by Tiziano Galizia

Pic by example (c) 1997/98 by Sergio Tanzilli & Tiziano Galizia