BCF – BSF - MOVLW – MOVWF



Questa istruzione permette di mettere a '0' logico un bit alla volta. La sintassi è


BCF NOME_REGISTRO, BIT;


BIT: fa riferimento al bit dell'area di memoria. Noi lavoriamo con un microcontrollore a 8 bit, quindi tutti i registri hanno 8 bit. La loro posizione viene identificata da un numero che va da 0 (bit meno significativo post a destra) a 7 (bit più significativo posto a sinistra).

NOME_REGISTRO: è il nome di qualsiasi registro specifico della memoria RAM (quelli con i nomi nella tabella dei 4 banchi della memoria RAM) o eventuale nome assegnato a un registro generico (quelli che non hanno nome nella tabella dei 4 banchi della memoria RAM, in questo caso per assegnare un nome a un registro generico si usa la direttiva EQU con la seguente sintassi: pippo EQU 0x20, con questo codice assegno il nome pippo all'indirizzo 0x20 (il primo indirizzo dei registri generici del bank 0. Per approfondire ripassa la lezione introduttiva ai microcontrollori, comunque ci sarà un esempio al termine di questa lezione).

Uno dei principali utilizzi di questa istruzione è quella di modificare i bit RP0 e RP1 del registro STATUS, che permettono di spostarci tra un banco e l'altro nella memoria RAM.


STATUS

7

6 - RP1

5 - RP1

4

3

2

1

0


1

1






Nella prima riga vengono identificati i numeri della cella di memoria dell'accumulatore, ed essendo un registro specifico, ogni bit ha un nome e una funzione precisa sull'hardware. Nella seconda riga il bit memorizzato.


Ipotizzando che nel registro STATUS il bit 6 (RP1) e il bit 5 (RP0) siano entrambi a 1 (quindi si sta usando il bank 3 della memoria RAM), e si decide di passare al bank0, per ottenere questo devo mettere a '0' logico il bit 6 (RP1) e il bit 5 (RP0) del registro STATUS :


BCF STATUS,6; mette a 0 il bit 6 del registro STATUS

BCF STATUS,5; mette a 0 il bit 5 del registro STATUS


dopo queste due istruzioni il bit 6 (RP1) e il bit 5 (RP0) verranno portati a '0'


STATUS

7

6 - RP1

5 - RP1

4

3

2

1

0


0

0






Nella prima riga vengono identificati i numeri della cella di memoria dell'accumulatore, ed essendo un registro specifico, ogni bit ha un nome e una funzione precisa sull'hardware. Nella seconda riga il bit memorizzato.



Questa istruzione permette di mettere a '1' logico un bit alla volta. La sintassi è


BSF NOME_REGISTRO, BIT;


partendo dall'esempio precedente, se voglio passare al bank 1 della memoria RAM devo avere RP1='0' e RP0='1', quindi dovrei mettere a '1' logico il bit 5 (RP0)


BSF STATUS,5; metto a 1 il bit 5 del registro STATUS

dopo questa istruzione il contenuto dei bit 5 e 6 del registro STATUS


STATUS

7

6 - RP1

5 - RP1

4

3

2

1

0


0

1






Nella prima riga vengono identificati i numeri della cella di memoria dell'accumulatore, ed essendo un registro specifico, ogni bit ha un nome e una funzione precisa sull'hardware. Nella seconda riga il bit memorizzato.


MOVLW


Questa istruzione permette di caricare 1 byte (8 bit) nell'accumulatore (area di memoria RAM senza indirizzo, serve come contenitore intermedio per inserire dei valori nei registri specifici e nei registri generici, dato che non è possibile fare questa operazione senza passare dall'accumulatore). L'accumulatore è identificato dalla lettera W. La sintassi è


MOVLW K;


in cui K è il byte da caricare. Per caricare un byte in forma esadecimale devo anteporre alle due cifre 0x. Un esempio di numero espresso in esadecimale che corrisponde al numero binario 11110001 (la sintassi di trasformazione è nota dalla seconda!!!):


0xF1


quindi per caricare il valore di esempio nell'accumulatore scrivo:


MOVLW 0xF1;


dopo questa istruzione le 8 celle dell'accumulatore contengono i seguenti bit:


W

7

6

5

4

3

2

1

0

1

1

1

1

0

0

0

1

Nella prima riga vengono identificati i numeri della cella di memoria dell'accumulatore, nella seconda riga il bit memorizzato.


Ora che ho caricato il valore nell'accumulatore, il byte lo posso caricare in qualsiasi registro specifico (quelli che nella memoria RAM hanno i nomi) o in un registro generico (quelli che nella memoria RAM non hanno il nome). Per farlo uso l'istruzione sotto.


MOVWF


Questa istruzione ci permette di caricare un byte dall'accumulatore a un registro specifico o registro generico. La sintassi è


MOVWF NOME_REGISTRO;


quindi richiamando l'esercizio visto sopra con l'istruzione MOVLW, avendo il valore 0xF1 nell'accumulatore lo posso trasferire in qualsiasi registro. Però prima devo controllare se sono posizionato nel banco giusto.



Quindi se devo scrivere nel registro TRISC, per definire quali pin del PORTB sono ingressi e quali sono uscite, devo assicurarmi di essere nel bank 1 (partendo da sinistra, la prima colonna è il bank 0, la seconda il bank 1, la terza il bank 2 e la quarta il bank 3). Abbiamo visto sopra come decidere il banco da puntare, quindi procediamo e carichiamo il valore 0xF0 nel registro TRISC


BCF STATUS,6; passo al bank 1

BSF STATUS,5;

MOVLW 0xF0;

MOVWF TRISB;


quindi dopo queste istruzioni RB7, RB6, RB5 e RB4 sono ingressi e RB3, RB2, RB1 e RB0 sono uscite (ricordate che nei registri TRISx i bit corrispondenti ai bit della porta sono uscite se a 0 come OUTPUT e sono ingressi se a 1 come INPUT).


TRISB

7

6

5

4

3

2

1

0

1

1

1

1

0

0

0

0

Nella prima riga vengono identificati i numeri della cella di memoria nel registro TRISB dopo le istruzioni dell'ultimo esempio. Nella seconda riga il bit memorizzato.





Vediamo anche un esempio con i registri generici.


Se vogliamo memorizzare una variabile nel bank 0, vedo che l'area assegnata ai registri generici (senza nome) parte da 0x20 (20h sta per indirizzo 20 esadecimale). Quindi, come abbiamo detto nell'esempio in alto, potrei assegnare un nome alla locazione, in questo modo il nome mi permetterebbe di usare la locazione come i registri specifici (con l'eccezione che i bit di queste aree di memoria non hanno collegamenti con l'hardware, ma sono semplici locazioni RAM per memorizzare dei valori). Ipotizziamo di voler assegnare il nome pippo (come nell'esempio in alto) e assegnare il valore 0xA7 alla locazione 0x24 (bank 0).


pippo EQU 0x24; questa direttiva assegna il nome pippo al registro generico con locazione 0x24

MOVLW 0x24; carico il valore esadecimale 0x24 nell'accumulatore

MOVWF pippo; trasferisco il valore dell'accumulatore nella memoria contrassegnata con pippo


fatto, semplice vero !!!!