errore nella gestione interrupt

Ciao a tutti,

ho scritto il seguente codice che nasconde al suo interno qualche errore che non riesco a trovare, pertanto sono qui a chiedervi una mano

  1. con uno sketch dedicato ho inserito nella EEPROM dei valori (0 e 1) che mi serviranno nello sketch operativo

  2. sul pin “attivazione” ho inserito un interrupt che, ad ogni cambio di stato logico dovrebbe attivare/disattivare un LED

  3. l’attivazione/disattivazione del led, una volta funzionante, verrà sostituita da una funzione più articolata.

#include <PinChangeInterrupt.h>
#include <EEPROM.h>

int attivazione = 0;
int led = 4;
bool stato_old;
bool stato;
bool a = 0;
int tempo = 20;
int indirizzo = 2; // indirizzo memoria EEPROM

void setup() {
  pinMode(attivazione, INPUT_PULLUP);
  attachPCINT(digitalPinToPCINT(attivazione), Test, CHANGE);
  pinMode(led, OUTPUT);
  stato = EEPROM.read(indirizzo);
  stato_old = stato;
  delay(tempo);
}


void loop() {
  if (stato != stato_old) {
    if ((stato == true) && (a == true)) {
      digitalWrite(led, HIGH);
      //funzioni secondarie da aggiungere
      a = false;
    }

    if ((stato == false) && (a == true)) {
      digitalWrite(led, LOW);
      //funzioni secondarie da aggiungere
     a = false;
     }
    stato_old = stato;
  }
}

void Test() {
  stato = !stato;
  a = true;
}

Vi ringrazio in anticipo

Le variabili usate nella funzione richiamata dall'interrupt devono essere dichiarate volatile. volatile bool stato;

torn24:
Le variabili usate nella funzione richiamata dall'interrupt devono essere dichiarate volatile. volatile bool stato;

Fantastico! Adesso funziona. grazie infinite.

Mi potresti anche spiegare per quale motivo vanno dichiarate volatile anziché semplicemente bool?

max95:
Mi potresti anche spiegare per quale motivo vanno dichiarate volatile anziché semplicemente bool?

Emmm ... ma studiare quanto meno il reference no? ... ::slight_smile:

Guglielmo