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.
Aggiunta il link al corso Linux Uno su Udemy.
Aggiunto il tutorial per la realizzazionedi un Arcade con materiale di riciclo.