Riscontro uno strano comportamento in una funzione che ho scritto
uint8_t input_decode()
{
uint8_t command = 0; // Variabile per il comando decodificato
if (analogRead(CS) < 0xFA) // Controlla se il valore analogico supera una soglia
{
digitalWrite(PIN_COMMAND_OK, LOW); // Pin di risposta messo LOW
uint8_t inputs[] = {1, 2, 4, 8, 16, 32}; // Array di valori per la decodifica dei bit
for (size_t i = 0; i < sizeof(inputs) / sizeof(inputs[0]); i++) // Scorre i bit di ingresso
{
if (analogRead(i) < 0xFA) // Legge i valori analogici
command += inputs[i]; // Accumula i valori per determinare il comando
delay(1); // Ritardo per la lettura
}
if (get_debug() and (command > 0)) // Se il debug è attivo e il comando è valido
{
Serial.print(F("Input decoded: ")); // Stampa il comando decodificato
Serial.println(command);
delay(200); // Ritardo per evitare sovrapposizioni di messaggi
}
}
return command; // Restituisce il comando decodificato
}
In pratica questa funzione si occupa di decodificare in sistema byte un numero leggendo da 6 pin analogici. la funzione viene eseguita in ciclo ogni 10ms ma si esegue solamente quando lo "strobe" sul pin (CS) viene chiuso a GND. Il tutto funziona correttamente, ma il problema sta nel'IF di debug che ho messo, in particolare il delay di 200ms. Se il debug è true e c'è un comando utile ovvero diverso da 0, stampa in debug il valore del comando. Stranamente talvolta la variabile dopo la pausa delay mi ritorna 0 anche se in realtà c'è effettivamente un comando selezionato. La cosa strana è che se ripeto il ciclo una seconda volta il comando viene rilevato. anche se elimino quel delay o lo porto sotto i 200 (100, 50 o meno). il tutto va OK. La mia sensazione è che il delay interferisca a livello piu basso nel framework di arduino ma non capisco come e mi piacerebbe capirne di più. Il micro non esegue molto altro, sono un'altra funzione a cui viene passato questo comando e esegue alcuni digitalWrite() sulla base del comando ricevuto. Di librerie incluse solo alcune che ho scritto io ma niente che lavora su timer o interrupt().
Grazie a tutti in anticipo.
L'analogRead(i) da 0 a 5 sembra funzionare correttamente agendo sui pin A0-A5, aggiungo che questo problema si verifica solo a seguito dell'accensione di Arduino, non so se ha valenza ma in seguito non si verifica più. In pratica il circuito viene alimentato, un primo ciclo lo esegue correttamente, il secondo non ritorna il valore, il terzo e tutti gli alltri a seguito si. se tolgo il delay tutto ok. Strano non capisco...
Grazie a tutti delle risposte e scusate il ritardo Il micro in questione è un Nano. Non devo leggere nessuna tensione esterna in quanto il macchinario si interfaccia a questi pin con dei relè che, chiudendosi, mettono GND i pin che sono in pull-up. Si è vero, potevo usare li come pin digitali dal 14 in poi se non erro, ma non credo sia questa la causa del problema.
Quindi i pin andavano letti come digitali. Non so se il pull-up rimane attivo una volta fatta una analogRead.
Delay probabilmente non è la causa diretta del problema. Quella pausa metterà in evidenza il vero problema preesistente, che si trova da qualche altra parte, e partire già con gli ingressi non letti correttamente non aiuta.
Probabilmente allora hai imparato ben poco, specialmente su come ci si pone. Le persone maleducate come te sono il motivo per cui molte persone si allontanano dai forum.