Software:
Arduino: 1.8.9
Esp core: 2.5.2
Hardware:
Wemos D1 Lite
Buongiorno a tutti,
ho bisogno di qualche delucidazione per cortesia. Ho aggiornato il core di esp8266 dalla versione 2.4.2 all'ultima disponibile la 2.5.2. Quando ho verificato e scaricato il nuovo codice sulla Wemos, la stessa va in riavvio e la causa che leggo dal monitor seriale dopo lo stack è:
"ISR not in IRAM"
Ora sono consapevole del fatto che per gli ESP gli interrupt vanno allocati in ram, per cui nello skecth che ha girato fino a ieri penso di averlo fatto ed infatti era tutto ok, o almeno credo. Potete aiutarmi a correggere questa anomalia. Vi mostro il codice:
volatile byte mod; // variabile stato modalità
volatile float t_set_man; // settaggio temperatura manuale
volatile float t_set_gelo; // settaggio temperatura antigelo
// PULSANTI
#define Pulsante_2 D5 // down
#define Pulsante_3 D6 // menù
#define Pulsante_1 D7 // up
volatile unsigned long millis_p_1;
volatile unsigned long millis_p_2;
volatile unsigned long millis_p_3;
#define ICACHE_RAM_ATTR
.....
void setup()
{
pinMode(Pulsante_1, INPUT); // pulsante up
attachInterrupt(digitalPinToInterrupt(Pulsante_1), up, RISING);
pinMode(Pulsante_2, INPUT); // pulsante down
attachInterrupt(digitalPinToInterrupt(Pulsante_2), down, RISING);
pinMode(Pulsante_3, INPUT); // pulsante MENU'
attachInterrupt(digitalPinToInterrupt(Pulsante_3), menu, RISING);
}
//==============================================================
// INTERRUPT
//==============================================================
void ICACHE_RAM_ATTR up() { // pulsante su D7
if (mod == 1) { // legge memoria stato mod.MAN
if (millis() - millis_p_1 >= 225) {
t_set_man = t_set_man + 0.5; // e incrementa la temperatura t_set_man
millis_p_1 = millis();
}
}
if (mod == 3) { // legge memoria stato mod.GELO
if (millis() - millis_p_1 >= 225) {
t_set_gelo = t_set_gelo + 0.5; // e incrementa la temperatura t_set_gelo
millis_p_1 = millis();
}
}
}
void ICACHE_RAM_ATTR down() { // pulsante su D5
if (mod == 1) { // legge memoria stato mod.MAN
if (millis() - millis_p_2 >= 225) {
t_set_man = t_set_man - 0.5; // e decrementa la temperatura t_man
millis_p_2 = millis();
}
}
if (mod == 3) { // legge memoria stato mod.GELO
if (millis() - millis_p_2 >= 225) {
t_set_gelo = t_set_gelo - 0.5; // e decrementa la temperatura t_set_gelo
millis_p_2 = millis();
}
}
}
void ICACHE_RAM_ATTR menu() { // pulsante su D6
if (millis() - millis_p_3 >= 225) { // PULSANTE CICLATA MODALITA' OFF/MAN/AUTO/GELO
mod++;
EEPROM.write(addr, mod);
EEPROM.commit();
millis_p_3 = millis();
}
if (mod > 4) {
mod = 1;
EEPROM.write(addr, mod);
EEPROM.commit();
}
}