Con la scusa di continuare ad esaminare l'uso di PORTC, impariamo a conoscere un'altra manciata di istruzioni Assembly del PIC18. L'hardware utilizzato è lo stesso mostrato nella pagina helloREALworld in assembly. Si consiglia di proseguire solo se è chiaro quanto in essa descritto.
Visto che lo scopo di questa pagina è prendere un po' di confidenza con alcune istruzioni Assembly, è vivamente consigliata la lettura in parallelo della spiegazione semplificata qui riportata con la spiegazione "ufficiale" presente nei fogli tecnici (nota 1).
Questo programma accende quattro LED connessi a PORTC e spegne gli altri quattro; inizia quindi quindi un loop infinito che alterna l'accensione degli otto LED. A fondo pagina il codice completo.
L'unica istruzione nuova è:
comf LATC ; COMplement File register
Essa inverte il valore logico dei bit del registro speciale LATC (verificare la descrizione dell'istruzione sui fogli tecnici, dopo aver preso visione della nota 1!). In pratica: accende i LED spenti e spegne quelli accesi.
Questo programma, quando mandato in esecuzione, sembra non funzionare in quanto il tempo di esecuzione estremamente breve fa apparire ai nostri occhi tutti gli otto LED sempre accesi. Tre sono le soluzioni:
A titolo informativo i LED, senza inserire un ritardo, lampeggiano con un periodo di 24 µs, indicativamente 10 000 volte più velocemente di quanto visibile ad un essere umano. (nota 2 e terzo esercizio). Questa osservazione deve essere estesa a tutti i programmi presenti in questa pagina.
Come alternativa è possibile modificare il codice all'interno del ciclo infinito nel modo seguente:
movlw 0x0F ; copia in W il numero binario 0000 1111
(0x0F)
movwf LATC ; copia il contenuto del registro W nel registro speciale LATC
; (quattro
LED sono accesi, gli altri quattro spenti)
movlw 0xF0 ; copia in W il numero binario 1111 0000 (0xF0)
movwf LATC ; copia il contenuto del registro W nel registro speciale LATC
; (quattro
LED sono spenti, gli altri quattro accesi)
A volte vogliamo accendere e spegnere un solo LED, lasciando invariati gli altri sette appartenente a LATC. In questo vengono in aiuto le istruzione bit-oriented, ciò capaci di intervenite su uno solo dei bit che compongono un byte (nota 3)
L'istruzione nuova è:
btg LATC,7 ; Bit ToGle
Essa, nell'esempio, inverte il valore del settimo bit del registro LATC, lasciando gli altri invariati. Il bit 7 è il bit più significativo (MSB) del registro, "quello di sinistra" per noi occidentali.
Esaminare il primo esercizio.
Il programma presentato è un classicissimo: un LED acceso su otto che scorre continuamente da destra a sinistra e viceversa. Lo trovate a fondo pagina, in tre versioni.
La prima versione permette lo scorrimento in un solo verso:
rlncf LATC ; Rotate Left No Carry File register
Questa istruzione trasforma LATC in un "registro a scorrimento" verso sinistra in cui l'ultimo bit è collegato al primo. Di seguito l'immagine, tratta dai fogli tecnici, che spiega più di molte parole:
Esaminare il secondo esercizio.
Questo programma implementa lo scorrimento del LED da destra verso sinistra e, dopo lo spegnimento dell'ultimo LED, lo scorrimento nel verso opposto, in un loop infinito.
Sono presenti diverse nuove istruzioni. Due non vengono qui discusse in quanto oggetto del secondo esercizio:
rlcf LATC ; Rotate Left Carry File register
rrcf LATC ; Rotate Right Carry File register
La prima istruzione di "salto condizionato" permette di proseguire o meno sequenzialmente l'esecuzione del programma, seguendo rami diversificati:
bnc sinistra ; Branch if Not Carry
In particolare, l'esecuzione prosegue alla label "sinistra" se il flag C vale 0, in pratica tornando indietro. Se invece il flag C vale 1, il programma prosegue sequenzialmente (facendo scorrere il LED al contrario).
L'ultima istruzione è moto simile a goto, in questo caso perfettamente interscambiabile (esercizio 4)
bra sinistra ; BRAnch unconditionally
L'ultima versione è simile alla precedente. L'unica differenza è nel fatto che uno dei LED rimane sempre acceso.
L'istruzione nuova è:
btfss LATC, 0 ; Bit Test File, Skip if Set
Per comprendere il funzionamento di questa istruzione occorre esaminare la riga con l'istruzione (33, nell'esempio) e le due righe successive:
Ovviamente nelle due righe successive è possibile avere qualunque istruzione, non solo un salto come in questo caso.
Questo programma conta da 3 a 9, visualizzando i numeri sui LED. Lo trovate a fondo pagina
Una delle nuove istruzioni qui presenti ha un ovvio significato (da verificare comunque sui fogli tecnici!):
incf LATC ; INCrement File register
La seconda nuova istruzione permette di confrontare il contenuto di un registro con il contenuto del registro W. Se sono uguali, viene saltata l'istruzione successiva, in modo simile a quanto già mostrato per l'istruzione btfss.
cpfseq LATC ; ComPare File register with working register, Skip if EQual
Esaminare il quinto esercizio. Ed anche il sesto
Data di creazione di questa pagina: marzo 2016
Ultima modifica: 23 novembre 2017
Assembly PIC18 - Versione 0.5 - aprile 2018
Copyright 2016-2018, Vincenzo Villa (https://www.vincenzov.net)
Assembly PIC18 di Vincenzo Villa è distribuito con Licenza Creative Commons Attribuzione 4.0 Internazionale