Problema, Funzione non ritorna il valore

Salve a tutti,

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.

Il delay non fa altro che stare in un while sino a quando non è passato un certo tempo, quindi ... difficile che interferisca con altro :roll_eyes:

Guglielmo

A me quel analogRead(i) con "i" da 0 a 5 mi sa di grande guaio di logica...

Dovrebbe andare da 14 a 19!
analogRead (i+14)
A0=14, non 0!

Poi non deve rilevare valori maggiori di una certa soglia?...
if (analogRead(CS) < 0xFA) // Controlla se il valore analogico supera una soglia

Deve scendere sotto una certa soglia, i pin sono in pull-up:

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...

Quale Arduino?
Che circuito?

Che cosa stai cercando di fare?

Mi associo

Io temo che si tratti di una uno
Che non ha 7 ingressi analogici

Non vuole leggere da A0 ad A5?
Comunque stiamo qui a discutere senza sapere che cosa vuole fare...

Giusto

Comunque A0 o 14 o 0
Causa un giro di macro della min... è sempre uguale al primo pin analogico

E comunque lui legge da 0 a 5 E CS

Sono 7 letture su 7 ingressi
La uno ne ha solo 6

Anche questa frase alimenta qualche dubbio

@Zorkk
Non è che stai ancora tentando di interfacciarti con una logica a tensione minore?
Come alcuni anni fa?

Se è così lascia stare...

Ma lui non ha detto che sta usando la uno, nonostante le richieste non ha detto niente. Se fosse una nano tornerebbe.

Ciao, Ale.

Caspita, sai che, avendo sempre usato o la notazione An o l'equivalente numerico, non mi ero mai accorto della cosa ...

if (pin >= 14) pin -= 14; // allow for channel or pin numbers

... in pratica, dopo aver fatto tutte le #define possibili, hanno aggirato la cosa in "wiring_analog.c" :confused:

Tanto per rendere un po' più confuso il tutto ... :roll_eyes:

Guglielmo

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.

Si può vedere il programma o è segreto militare?

Secondo me (che varro' anche poco ma qualcosa ho imparato) o usa i pin come vanno usati oppure rinuncia ad avere risultati

sono capace anch'io di scrivere programmi a caso e poi lamentarmi se non vanno...

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.