Dubbi sull' Uso di pulsanti con while

  • roberto1949
  • Offline
  • New Member
  • New Member
Di più
8 Mesi 2 Settimane fa #1 da roberto1949
Dubbi sull' Uso di pulsanti con while è stato creato da roberto1949
Salve ragazzi vi prego di chiarirmi un dubbio che non riesco a togliermi.

Leggo da piu parti che :

"Da ricordare: i pulsanti chiudono verso GND, per cui la pressione di un pulsante porta l’IO a livello logico basso, quindi in caso di pulsante non premuto l’IO deve essere tenuto a livello alto: questo si fa utilizzando delle resistenze di pull-up (resistenza tra pin e tensione alimentazione), che lasciano scorrere una debole corrente (10KΩ vanno bene) e quindi non creano eccessivi assorbimenti o cortocircuiti nel momento in cui chiudiamo a GND. In molti casi i PICmicro hanno già resistenze di pull-up integrate.

Poi trovo :
"Esempi dell’uso dei pulsanti:
while (1){
// fino a che il contatto è aperto, attendi
while (PORTAbits.RA3 == 1) ;
LATAbits.LATA5 = 1; // alla chiusura, accendi il LED
__delay_ms (20); // ritardo di debounce di 20ms
// fino a che il contatto è chiuso, attendi
while (PORTAbits.RA3 == 0) ;
LATAbits.LATA5 = 0; // all'apertura, spegni il LED
__delay_ms (20); // ritardo di debounce di 20ms
} // loop continuo

Ma scusate se while trova PORTAbits.RA3 == 1 e il Porta3 è alto perchè "fino a che il contatto è aperto, attendi"? cosa deve attendere se la condizione è vera RA3==1 perchè non esegue?
e così anche per while (PORTAbits.RA3 == 0) all'apertura, spegni il LED
non dovrebbe essere il contrario?

Dopo aver impostato RA3 come input per default il valore va alto? così ricordo di aver letto quindi ?
Grazie

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

Di più
8 Mesi 1 Settimana fa - 8 Mesi 1 Settimana fa #2 da firstcolle
Risposta da firstcolle al topic Dubbi sull' Uso di pulsanti con while
Ciao, provo a spiegare in attesa che qualcuno possa esprimersi meglio di me.

lo stato di riposo del pin RA3 è il livello logico alto 1.
la funzione while, è una funzione di attesa finchè lo stato della condizione viene verificato.

in questo programma si vuole verificare lo stato del pulsante, se premuto il livello logico dell'ingresso RA3 diventerà 0.
quindi, con il while PORTAbits.RA3 == 1 si attende che il pulsante venga premuto, e il programma resterà bloccato li finchè non viene premuto il pulsante. una volta premuto la condizione non è piu verà perchè il pin viene messo a massa e il livello logico passa a 0. ora (dopo il delay) si accende il led, e resta acceso finchè viene mantenuto premuto il pulsante attraverso la funzione while PORTAbits.RA3 == 0.

quello che forse ti viene più logico è la funzione if, ovvero quella che esegue un azione se la condizione è verificata. in questo caso però il programma diventerebbe:


while (1){
if(PORTAbits.RA3 == 0){
LATAbits.LATA5 = 1;
}
else {
LATAbits.LATA5 = 0;
}
}

ovvero. se il pulsante su RA3 è chiuso (a 0) accendo il led altrimenti spengo il led.


la differenza tra il codice postato da te e questo è che nel tuo codice il programma resta fermo ad attendere che lo stato del pulsante cambi. mentre in questo codice lo stato del pulsante viene continuamente verificato.

se imposti RA3 come input, TRISAbits.TRISA3 = 1, devi collegarlo a VCC attraverso una resistenza da 10k tipicamente, per mantenerlo a stato logico alto 1
Ultima Modifica 8 Mesi 1 Settimana fa da firstcolle.

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

  • roberto1949
  • Offline
  • New Member
  • New Member
Di più
8 Mesi 1 Settimana fa #3 da roberto1949
Risposta da roberto1949 al topic Dubbi sull' Uso di pulsanti con while
FINALMENTE
ora mi è chiaro tutto.
Caffè pagato.......
Ringrazio e spero di ritrovare la stessa cortesia e chiarezza qualora ne avessi ancora bisogno.
Buona serata
Roberto

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

Moderatori: Mauro LaurentiPinnaStefAMatteo Garia