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