I can compile my idea, but I have a logic error, and an error:
Guru Meditation Error: Core 1 panic’ed (LoadStoreError). Exception was unhandled.
Backtrace: 0x4011c46e:0x3ffb1eb0 0x40116c05:0x3ffb1f20 0x4012195c:0x3ffb1f40 0x40122182:0x3ffb1f90 0x40144aed:0x3ffb1fb0 0x4008ceea:0x3ffb1fd0
#0 0x4011c46e:0x3ffb1eb0 in RotaryEncoderUIUsermod::loop() at wled00/src/dependencies/json/ArduinoJson-v6.h:1609 (discriminator 4)
#1 0x40116c05:0x3ffb1f20 in UsermodManager::loop() at wled00/um_manager.cpp:9 (discriminator 3)
#2 0x4012195c:0x3ffb1f40 in WLED::loop() at wled00/bus_manager.h:122
#3 0x40122182:0x3ffb1f90 in loop() at wled00/wled_main.cpp:23
#4 0x40144aed:0x3ffb1fb0 in loopTask(void*) at C:/Users/David/.platformio/packages/framework-arduinoespressif32@src-e9b1fbd6563a55e19ddae15e1fc09589/cores/esp32/main.cpp:23
#5 0x4008ceea:0x3ffb1fd0 in vPortTaskWrapper at /home/cschwinne/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)
This happens as soon as I try to read (I haven’t gotten to writing yet) the bits of the global byte variable.
So far I have this outside the class:
static volatile uint8_t addrPcf8574 = PCF8574_ADDRESS; // has to be accessible in ISR
//Daro Mod
/*State Transitions:
In a clockwise direction:
0-0, 1-0, 1-1, 0-1, 0-0, 1-0, 0-1, etc.
In a counterclockwise direction:
0-0, 0-1, 1-1, 1-0, 0-0, 0-1, 1-1, etc.
Enc_Store 0 = Encoder_DT; 1 = Encoder_CLK; 2 = Encoder_DT_Previous; 3 = Encoder_CLK_Previous
4 = Rotating Colckwise; 5 = State is valid; 6 = Okay to write value in loop() */
static volatile IRAM_ATTR byte Enc_Store = 0b00000000;
static void IRAM_ATTR isStateValid(){
if (bitRead(Enc_Store,2) == 0 && bitRead(Enc_Store,3) == 0){
if (bitRead(Enc_Store,0) == 1 && bitRead(Enc_Store,1) == 0){bitSet(Enc_Store,4); bitSet(Enc_Store,5); bitSet(Enc_Store,6);}
if (bitRead(Enc_Store,0) == 0 && bitRead(Enc_Store,1) == 1){bitWrite(Enc_Store,4,false); bitWrite(Enc_Store,5, true); bitWrite(Enc_Store,6, true);}
return;
}
else if (bitRead(Enc_Store,2) == 0 && bitRead(Enc_Store,3) == 1){
if (bitRead(Enc_Store,0) == 0 && bitRead(Enc_Store,1) == 0){bitSet(Enc_Store,4); bitSet(Enc_Store,5); bitSet(Enc_Store,6);}
if (bitRead(Enc_Store,0) == 1 && bitRead(Enc_Store,1) == 1){bitWrite(Enc_Store,4,false); bitWrite(Enc_Store,5, true); bitWrite(Enc_Store,6, true);}
return;
}
else if (bitRead(Enc_Store,2) == 1 && bitRead(Enc_Store,3) == 0){
if (bitRead(Enc_Store,0) == 1 && bitRead(Enc_Store,1) == 1){bitSet(Enc_Store,4); bitSet(Enc_Store,5); bitSet(Enc_Store,6);}
if (bitRead(Enc_Store,0) == 0 && bitRead(Enc_Store,1) == 0){bitWrite(Enc_Store,4,false); bitWrite(Enc_Store,5, true); bitWrite(Enc_Store,6, true);}
return;
}
else if (bitRead(Enc_Store,2) == 1 && bitRead(Enc_Store,3) == 1){
if (bitRead(Enc_Store,0) == 0 && bitRead(Enc_Store,1) == 1){bitSet(Enc_Store,4); bitSet(Enc_Store,5); bitSet(Enc_Store,6);}
if (bitRead(Enc_Store,0) == 1 && bitRead(Enc_Store,1) == 0){bitWrite(Enc_Store,4,false); bitWrite(Enc_Store,5, true); bitWrite(Enc_Store,6, true);}
return;
}
//If the state is invalid, loop should not initiate action.
bitWrite(Enc_Store,5, false);
bitWrite(Enc_Store,6, false);
}
static void IRAM_ATTR flankInteruptA() {
noInterrupts();
bitWrite(Enc_Store,0, digitalRead(ENCODER_DT_PIN));
bitWrite(Enc_Store,1, digitalRead(ENCODER_CLK_PIN));
isStateValid();
if (! bitRead(Enc_Store,5)) {interrupts(); return;}
bitWrite(Enc_Store,2, bitRead(Enc_Store,0));
bitWrite(Enc_Store,3, bitRead(Enc_Store,1));
interrupts();
}
//Daro Mod
// Interrupt routine to read I2C rotary state
In Setup I have this:
initDone = true;
//Daro mod
// Enc_A = readPin(pinA); // Read encoder pins
// Enc_B = readPin(pinB);
// Enc_A_prev = Enc_A;
Serial.println(F("Usermod Rotary Encoder setup() - Attaching interrupt."));
attachInterrupt(ENCODER_CLK_PIN, flankInteruptA, CHANGE); // RISING, FALLING, CHANGE, ONLOW, ONHIGH
Serial.println(F("Usermod Rotary Encoder setup() - Interrupt attached."));
//Daro mod
}
This is in loop():
if (changedState) select_state = newState;
}
//Daro mod
Serial.println(F("Usermod Rotary Encoder loop() - Turning off interrupts."));
noInterrupts();
Serial.println(F("Usermod Rotary Encoder loop() - Check if writting is enabled."));
if (bitRead(Enc_Store,6)){
Serial.println(F("Usermod Rotary Encoder loop() - Switch."));
switch(select_state) {
case 0: changeBrightness(bitRead(Enc_Store,4)); break;
case 1: changeEffectSpeed(bitRead(Enc_Store,4)); break;
case 2: changeEffectIntensity(bitRead(Enc_Store,4)); break;
case 3: changePalette(bitRead(Enc_Store,4)); break;
case 4: changeEffect(bitRead(Enc_Store,4)); break;
case 5: changeHue(bitRead(Enc_Store,4)); break;
case 6: changeSat(bitRead(Enc_Store,4)); break;
case 7: changeCCT(bitRead(Enc_Store,4)); break;
case 8: changePreset(bitRead(Enc_Store,4)); break;
case 9: changeCustom(1,bitRead(Enc_Store,4)); break;
case 10: changeCustom(2,bitRead(Enc_Store,4)); break;
case 11: changeCustom(3,bitRead(Enc_Store,4)); break;
}
Serial.println(F("Usermod Rotary Encoder loop() - Turning on interrupts."));
interrupts();
}
// Enc_A = readPin(pinA); // Read encoder pins
// Enc_B = readPin(pinB);
// if ((Enc_A) && (!Enc_A_prev))
// { // A has gone from high to low
// if (Enc_B == LOW) //changes to LOW so that then encoder registers a change at the very end of a pulse
// { // B is high so clockwise
// switch(select_state) {
// case 0: changeBrightness(true); break;
// case 1: changeEffectSpeed(true); break;
// case 2: changeEffectIntensity(true); break;
// case 3: changePalette(true); break;
// case 4: changeEffect(true); break;
// case 5: changeHue(true); break;
// case 6: changeSat(true); break;
// case 7: changeCCT(true); break;
// case 8: changePreset(true); break;
// case 9: changeCustom(1,true); break;
// case 10: changeCustom(2,true); break;
// case 11: changeCustom(3,true); break;
// }
// }
// else if (Enc_B == HIGH)
// { // B is low so counter-clockwise
// switch(select_state) {
// case 0: changeBrightness(false); break;
// case 1: changeEffectSpeed(false); break;
// case 2: changeEffectIntensity(false); break;
// case 3: changePalette(false); break;
// case 4: changeEffect(false); break;
// case 5: changeHue(false); break;
// case 6: changeSat(false); break;
// case 7: changeCCT(false); break;
// case 8: changePreset(false); break;
// case 9: changeCustom(1,false); break;
// case 10: changeCustom(2,false); break;
// case 11: changeCustom(3,false); break;
// }
// }
// }
// Enc_A_prev = Enc_A; // Store value of A for next time
//Daro mod
loopTime = currentTime; // Updates loopTime
As soon as I get to
Serial.println(F(“Usermod Rotary Encoder loop() - Check if writting is enabled.”));
if (bitRead(Enc_Store,6)){
The ESP32 crashes. Do I need to acces global variables differently?