This code works:
#define LED 2
hw_timer_t *blinkTimer = NULL;
volatile bool toggle=0;
volatile bool flip=0;
void IRAM_ATTR blink(){
toggle=!toggle;
if (toggle){ // controversial if statement
timerAlarmWrite(blinkTimer, 500000, true);
}
else if (!toggle){
timerAlarmWrite(blinkTimer, 1500000, true);
}
}
void setup() {
Serial.begin(57600);
pinMode(LED, OUTPUT);
blinkTimer = timerBegin(0, 80, true);
timerAttachInterrupt(blinkTimer, &blink, true);
timerAlarmWrite(blinkTimer, 0, false); // controversial line
timerAlarmEnable(blinkTimer);
}
void loop() {
if (flip!=toggle){
flip=toggle;
digitalWrite(LED,toggle);
Serial.println(toggle);
}
}
This code does not work. "If statement" relocated.
#define LED 2
hw_timer_t *blinkTimer = NULL;
volatile bool toggle=0;
volatile bool flip=0;
void IRAM_ATTR blink(){
toggle=!toggle;
}
void setup() {
Serial.begin(57600);
pinMode(LED, OUTPUT);
blinkTimer = timerBegin(0, 80, true);
timerAttachInterrupt(blinkTimer, &blink, true);
timerAlarmWrite(blinkTimer, 0, false); // controversial line
timerAlarmEnable(blinkTimer);
}
void loop() {
if (flip!=toggle){
if (toggle){ // controversial if statement
timerAlarmWrite(blinkTimer, 500000, true);
}
else if (!toggle){
timerAlarmWrite(blinkTimer, 1500000, true);
}
flip=toggle;
digitalWrite(LED,toggle);
Serial.println(toggle);
}
}
The 2nd code can be made to work if the controversial line is revised:
#define LED 2
hw_timer_t *blinkTimer = NULL;
volatile bool toggle=0;
volatile bool flip=0;
void IRAM_ATTR blink(){
toggle=!toggle;
}
void setup() {
Serial.begin(57600);
pinMode(LED, OUTPUT);
blinkTimer = timerBegin(0, 80, true);
timerAttachInterrupt(blinkTimer, &blink, true);
timerAlarmWrite(blinkTimer, 10, true); // controversial line
timerAlarmEnable(blinkTimer);
}
void loop() {
if (flip!=toggle){
if (toggle){ // controversial if statement
timerAlarmWrite(blinkTimer, 500000, true);
}
else if (!toggle){
timerAlarmWrite(blinkTimer, 1500000, true);
}
flip=toggle;
digitalWrite(LED,toggle);
Serial.println(toggle);
}
}