Delucidazioni sull'esempio Switch(C18 Step by Step) e sui pulsanti in generale

10 Anni 6 Mesi fa - 10 Anni 6 Mesi fa #1 da patana93

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • patana93
  • Junior Member
  • Junior Member
Di più
10 Anni 6 Mesi fa #2 da StefA

quando si parla di #define BT1 xxxxxxxx cosa sto settando?

La direttiva define in questo caso è usta per chiamare con un altro nome un qualcosa di più scomodo da scrivere. Se scrivi #define BT1 0b11100000 stai dicendo al compilatore, quando trovi scritto BT1 leggilo come 0b11100000.


Oppure la variabile button non riesco a capire a cosa si riferisca di preciso

In quella variabile, viene salvato lo stato della porta b con l'istruzione button = PORTB; siccome sulla porta b ci sono collegati i 4 pulsanti, quella variabile identifica lo stato della porta e di conseguenza dei pulsanti.


E neanche la parte button = button & 0xF0

0xF0 è un valore esadecimale, se lo vedi in binario sarebbe 0b11110000.
Quella istruzione fa l'AND logico tra il valore button (lo stato delle porte e quindi dei pulsanti) e il valore 11110000.
In questo modo i primi 4 bit vengono messi a zero e gli altri 4 sono uguali a quelli della variabile button.
Questo ha senso perché i 4 pulsanti della freedom sono collegati ognuno ad un pin della porta b, in particolare su RB4, RB5, RB6, RB7, quindi non usando i pin RB0, RB1, RB2, RB3 si mettono a zero.


Per farmi comprendere meglio, sono riuscito a capire che i 4 bit meno significativi di ogni pulsante vanno settati a 0 perchè sono quelli più significativi a decretare se il pulsante è premuto o meno(ma non ho capito bene come si identificano i 4 pulsanti) e sperimentando ho capito che se setto il default come 0x0F ho tutti i pulsanti spenti invece che accesi.

Aspetta, stai facendo un po' di confusione, ogni pulsante non ha 8 bit, ogni pulsante corrisponde ad un solo pin del pic e quindi ad un solo bit della porta a cui è collegato (in questo caso porta b).
I pulsanti della freedom II sono collegati con il pull-up e quindi senza premere niente si trovano a 1.
Quindi facendo button = PORTB; ho che la variabile vale (in binario) 0b11111111.
Facendo l'AND logico metto a zero i primi 4 bit che non mi interessano, quindi facendo button = button & 0xF0; ottengo che button vale 0b11110000.
In questo caso non ho pulsanti premuti, infatti questo valore non corrisponde a nessun pulsante BT1, BT2, BT3, BT4 e non si accende niente.

Vediamo ad esempio il caso in cui è premuto BT2, questo pulsante è collegato al pin RB5 e quando è premuto il valore del pin va a zero, per cui con l'istruzione button = PORTB; avrò per la variabile button il valore 0b11011111,
poi facendo button = button & 0xF0; otterro 0b11010000 e questo è proprio il valore che identifica BT2.
Nello switch sono nel caso BT2 e di conseguenza accendo i led sulla porta d eseguendo l'istruzione LATD = 0x02;

Ste

..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • StefA
  • Avatar di StefA
  • Moderator
  • Moderator
Di più
10 Anni 6 Mesi fa #3 da patana93
Grazie mille sei stato gentilissimo!
Ora ho capito tutto quello che riguarda i pulsanti! ^^
Ultima curiosità, se io premo un pulsante allora, non si dovrebbe accendere un led dal 5 all'8(in base a quale pulsante premo)e spegnere i primi 4?
Perchè tutto è nato proprio dal fatto che premo i pulsanti ma sulla Freedom II rimangono sempre i primi 4 accesi(quando dico i primi quattro intendo, partendo da destra).
Grazie ancora :)

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • patana93
  • Junior Member
  • Junior Member
Di più
10 Anni 6 Mesi fa #4 da StefA

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • StefA
  • Avatar di StefA
  • Moderator
  • Moderator
Di più
10 Anni 6 Mesi fa #5 da patana93
Purtroppo ho usato anche il codice, scaricato da questo sito, ma la mia situazione rimane sempre la stessa. Ho i primi 4 led accesi, poi premo un qualsiasi pulsante, ma la situazione non cambia. Se vuoi posso postare un video. Spero non sia un problema della Freedom :( . Ti ringrazio ancora per l'aiuto.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • patana93
  • Junior Member
  • Junior Member
Di più
Moderatori: Mauro LaurentiStefA

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login