LEZIONE 42

SENSORI MECCANICI

Modificando leggermente il programma possiamo creare un “lottatore di sumo”.
I lottatori di sumo, sono dei robot che una volta individuato l’ostacolo (o l’avversario), lo spingono verso l’esterno di un ring.
Questa volta il robot, una volta rivelato l’avversario, dovrà girare verso di esso e spingerlo fuori dal ring.
Provate a realizzare il programma da soli.


Ecco un aiuto:
#CHIP 16F84, 4           'Tipo di PIC utilizzato
Dir PORTA OUT           'Definisco le porte d'uscita
Dir PORTB IN           'e d'ingresso

DIM Valore as BYTE           'Variabile contatore

Ciclo:           'Etichetta
Valore = PortB           'Prendo il valore degli interruttori
Valore = Valore & b'00001100'           'Prendo solo i bit che mi interessano

Select case Valore
case b'00001100'           'Controllo se tutti e due i sensori sono chiusi
PortA = b'00001001'           'Vado avanti e spingo l'avversario
case b'00000100'           'L'avversario è a destra
PortA = b'00000101'           'Vado a destra
case b'00001000'           'L'avversario è a sinistra
PortA = b'00001010'           'Vado a sinistra
case else
PortA = b'00001001'           'Vado avanti se non trova nulla
end select

GOTO Ciclo           'Torna all'inizio del programma
END           'Fine del programma

Iniziamo con la dichiarazione delle variabili che ci servono , DIM Valore as BYTE, Poi riprendono i valori dei singoli bit della porta B con l’istruzione Valore = PortB e poi li filtriamo con l’istruzione Valore = Valore & b'00001100'.
Vediamo meglio questa istruzione: il carattere & rappresenta l’operatore logico AND, qui di seguito vi riporto una tabella descrittiva.



L’operatore AND valuta due condizioni, in questo caso il BIT1 (A) ed il BIT2 (B) se entrambi sono vere (valore 1) anche l’uscita sarà vera (valore a 1 uscita X).
In questo caso noi facciamo un controllo sui bit della porta B più precisamente sulle porte RB2 RB3 ovvero dove sono collegati i contatti meccanici.

Il controllo viene fatto portando ad uno i bit che ci interessano, come si può vedere dall’esempio successivo.
b'00001100'

Facciamo qualche esempio per capire meglio la sua funzione:
Supponiamo di avere nella porta B i seguenti valori: 01010100, ora applichiamo l’operatore AND con il valore 00001100 sempre per controllare il terzo ed il quarto bit (contando da destra).

01010100 Porta B
00001100 Valore di controllo
00000100 Risultato

Come si può vedere dal risultato in questo modo abbiamo azzerato i bit che non ci interessano riportando solo il valore di quelli interessati.
Altro esempio, supponiamo ora di avere il valore 11111111 nella porta B, e di dover controllare il primo ed il terzo bit, avremo i seguenti valori:

11111111 Porta B
00000101 Valore di controllo
00000101 Risultato

Come vedete si sono azzerati tutti i valori che non ci interessano e sono rimasti solo i valori della prima e terza porta.
Questo sistema è molto importante quando si prendono tutti i valori della porta per poi testarne solo alcuni.
In precedenza abbiamo usato l’istruzione IF PortB.2 = 1 THEN, in questo caso non c’è nessun problema perchè andiamo a testare il singolo bit, mentre con il costrutto Select case Valore si va a testare tutta la variabile valore quindi tutta la porta B e può capitare che ci siano dei sensori collegati alle altre porte che inviano il loro stato logico oppure qualche tensione residua, creando errori di lettura.

Filtrando il valore con l’operatore AND lo andiamo a ripulire di tutto prelevando solo la parte del bit che ci serve.
Una volta filtrato il valore può essere usato nel costrutto Select case e quindi valutato dai case successivi.
Se sono attivi tutte e due i contatti vuol dire che il nostro avversario è davanti a noi e ci sta spingendo, in questo caso vado avanti e spingo l’avversario, se è presente un ostacolo a destra vuol dire che l’avversario è a destra e quindi giro a destra per poi spingerlo, lo stesso dicesi per il rilevamento dell’ostacolo a sinistra, in questo caso andrò a sinistra.

LEZIONE 43
LEZIONE 41