Differenza tra avvio e reset?

Buongiorno,
sto avendo problemi con un software che dovrebbe partire con 2 setup differenti scelti tenendo premuto un tasto all'avvio.

Se accendo l'arduino parte sempre a 0 indifferentemente dal tasto premuto o meno,
se lo resetto si: col tasto parte in un modo e senza nell'altro.

Non capisco perchè si comporta diversamente, il setup non lo legge sia all'avvio che al reset?
Allego il codice:

'

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>


const int buttonMode = 3;
int bypass = digitalRead(buttonMode);   //
int TEST = 0;
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  Wire.begin();
  SPI.begin();
    lcd.init();                      // initialize the lcd
  lcd.backlight();
  pinMode (buttonMode, INPUT_PULLUP);

  if (bypass == HIGH) {   //se buttomode premuto parto in modalità TEST
    TEST = 1;
  } else {                //se buttomode NON è premuto parto in modalità normale
    TEST = 0;
  }
}
void loop() {

  if (TEST == 0) {

    lcd.setCursor(0, 0);
    lcd.print("test = 0");
  } else {

    lcd.setCursor(0, 0);
    lcd.print("test = 1");
  }
}

'

Grazie!

Ciao, in conformità al REGOLAMENTO , punto 7, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona tutto il codice e premi l’icona </> nella barra degli strumenti per contrassegnarla come codice. Grazie.

Corretto, grazie.
:slight_smile:

Il primo problema che noto è che tu leggi il pulsante fuori dal setup e prima di aver definito il pinMode.
Sposta la lettura dentro il setup e dopo il pinMode e dovresti risolvere

Cavolo hai ragione, adesso funziona ...
Mi sembrava più corretto dichiararlo fuori dal setup :slight_smile:
Ma come mai resettando funzionava e riavviando no?
Ci sono 2 comportamenti diversi?

Ero convinto che reset ed avvio fossero equivalenti.

Cmq grazie per il supporto a dir poco fulmineo!

Non è che non si può fare cose prima del setup ma nel 99% dei casi non ha molto senso perché verrebbero eseguite una sola volta esattamente come nel setup.
Se tu avessi messo la pinMode prima della lettura avrebbe funzionato.
Il perché su reset funzionava dipendeva, probabilmente, dal fatto che il pin aveva ancora il settaggio per l'input e quindi la lettura riusciva, ma sto ipotizzando per la certezza serve qualcuno di molto ferrato nell'HW e, soprattutto, del datasheet del 328

Ti ringrazio,
gentilissimo.

Il framework di Arduino (Arduino core) "nasconde" il fatto che uno sketch è un programma classico in C/C++ ovvero nasconde all'incirca questo:

void main()
{ init();
  initVariant(); 
  setup();   // chiamato una volta
  while(1) loop();       // ciclo infinito
}

Quindi ecco perché la setup() viene chiamata solo una volta, all'inizio
Dentro la main() prima della chiamata alla setup() c'e' poi del codice che dipende dalla MCU/hardware per cui compili, di base molto codice che inizializza l'hw

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.