LEZIONE 51

ROTATE

Questa istruzione ci permette di far ruotare un valore binario a sinistra od a destra di un bit.
La sintassi dell’istruzione è la seguente:

ROTATE variabile {LEFT oppure RIGHT} [SIMPLE]

Immaginiamo di avere una variabile chiamata Memoria con il seguente valore binario 00011101.
Ogni volta che chiameremo l’istruzione ROTATE il valore della variabile ruoterà in un senso o nell’altro.
Supponendo di far ruotare il valore a destra e quindi con l’istruzione RIGHT,
nel primo caso il valore sarà il seguente: 10001110
Nel secondo invece: 01000111
E nel terzo: 10100011

Se invece la rotazione fosse stata a sinistra (LEFT) avremmo avuto i seguenti valori:
Primo caso: 00111010
Secondo caso: 01110100
Terzo caso: 11101000

Per capire meglio l’istruzione immaginiamo di avere il valore binario seguente 00001000, vedremo il singolo bit spostarsi a destra o a sinistra.
Il codice seguente permette di vedere quanto descritto usando i diodi led sulla porta B nel Micropic Trainer


#CHIP 16F84, 4				'Tipo di PIC utilizzato	

DIR PORTA IN				'Definisco le porte d'ingresso	
DIR PORTB OUT 				'e d'uscita	

Memoria = b'00001000'			'Bit da far ruotare	

INIZIO:
IF PortA.0 = 1 THEN GOTO DESTRA		'Ruoto il bit verso destra	
IF PortA.1 = 1 THEN GOTO SINISTRA	'Ruoto il bit verso sinistra	

GOTO INIZIO				'Torno all'inizio	

DESTRA: 'Ruoto il valore a destra ROTATE Memoria RIGHT 'Ruoto il bit WAIT 1 s 'Attendo 1 secondo PortB = Memoria 'Guardo la posizione del bit GOTO INIZIO 'Torno all'inizio del programma SINISTRA: 'Ruoto il valore a sinistra ROTATE Memoria LEFT 'Ruoto il bit WAIT 1 s 'Attendo 1 secondo PortB = Memoria 'Guardo la posizione del bit GOTO INIZIO 'Torno all'inizio del programma END

Questo tipo di istruzione può essere utilizzata per fare delle divisioni o moltiplicazioni molto rapidamente.
Supponiamo di avere il valore binario 00000111 che equivale al valore 7 in decimale e di farlo ruotare verso sinistra, il valore sarà 00001110 che equivale al valore 14 in binario, quindi una moltiplicazione per 2.
Lo stesso dicasi per il valore binario 00001110 che equivale al valore 14 in esadecimale, se lo facciamo ruotare a destra il valore cambierà in 00000111 che è 7, in sintesi una divisione per 2.
Attenzione: Questo ragionamento è possibile perché il valore inserito inizia con uno zero e durante lo spostamento no c’è un riporto.
Supponiamo di avere il valore 10000010 che equivale al numero 130 in decimale e di farlo ruotare verso sinistra, il valore sarà di 00000101 che equivale al numero 5 e non 260 come potremmo pensare, questo perché è presente un riporto.

Un altro utilizzo dell’istruzione ROTATE è quello di poter prelevare un singolo bit per volta per poi essere elaborato.
Ad ogni istruzione ROTATE nel registro di STATO, nella posizione C (CARRY o riporto), viene inserito il valore che è stato riportato.
Esempio:

Supponiamo di avere il valore binario 00000001 e di ruotarlo verso destra, il bit 1 sarà riportato nella posizione iniziale del bit, come nell’esempio 10000000, questo 1 è il riporto che sarà scritto anche nel registro C di STATO.
Grazie a questo sistema possiamo analizzare ogni singolo bit per poi convertirlo o trasmetterlo nel seguente modo:

Trasmissione di un valore binario inserito in una variabile tramite la porta A0:


Valore = 00011011			'Inserisco il valore da trasmettere
Rotate Valore RIGHT 			'Ruoto il valore verso destra
IF STATUS.C = 1 THEN PortA.0 = 1 	'Se il valore è 1 trasmetto 1
IF STATUS.C = 0 THEN PortA.0 = 0 	'Se il valore è 0 trasmetto 0

Se non vogliamo che il riporto venga inserito nel registro di STATO basta aggiungere l’istruzione SIMPLE, nel seguente modo:

ROTATE Valore RIGHT SIMPLE

Questa istruzione può essere utilizzata per attivare in sequenza una serie di sensori per poi memorizzarne lo stato, per esempio possiamo avere quattro sensori:

Sensore           Controllo
1                 ostacoli anteriori
2                 ostacoli posteriori
3                 ostacoli destri
4                 ostacoli sinistri

Attivando in sequenza questi sensori, per poi memorizzarne lo stato, avremmo una piccola mappa dell’ambiente in qui si trova il robot.
Grazie a questa mappa il robot potrà “decidere” il percorso più favorevole o cosa dover fare.

LEZIONE 52
LEZIONE 50