MCU attiny 804/814
internal Oscillator running at 20Mhz
Mills (Disabled ) , make no change even keeping Enable timer 0
Voltage 5V
Library / Board , MegaTinyCore "GitHub - SpenceKonde/megaTinyCore: Arduino core for the tinyAVR 0/1/2-series - this is any ATtiny with 2, 4, 6, or 7 in the 1's place, 0, 1, or 2 in the tens, and the flash size in the remaining digits. LIBRARY AUTHORS - Does your library have issues with this core? Please touch base w/me so we can ensure a solution that works on all parts and won't be broken by future changes"
i am trying to build Hazard indicators for bike with some patterns, i am using Attiny814 and custom made PCB to fit requirement.
i am trying to use interrupt for break switch left, right , break and pattern change. flashing patterns are design using delay function.
using external interrupt which should interrupt process immediately and start executing code in inside ISR but MY ISR (Switch) code gets executed only after completion of execution of pattern which can be 1 sec to 15 sec long.
i.e. if there is long pattern 1-15 second long and if i am pressing break or Indicator, new process get executed only completion of existing process (pattern which can take upto 15 second)
looking for help from forum
Code
const int leftLed = 6;// Left LED
const int rightLed = 10;// Right LED
const int brake Switch = 2; // brake Switch
const int patternSwitch = 1; // Pattern
const int leftSwitch = 3; // left Indicator Switch
const int rightSwitch = 5; // Right Indicator Switch
volatile int patternNumber = 1;
volatile byte mode = 0;
volatile bool power_state = false;
void setup()
{
noInterrupts();
pinMode(leftLed, OUTPUT);
pinMode(rightLed, OUTPUT);
pinMode(brakeSwitch, INPUT);
pinMode(patternSwitch, INPUT);
pinMode(leftSwitch, INPUT);
pinMode(rightSwitch, INPUT);
attachInterrupt(digitalPinToInterrupt(brakeSwitch), brake_isr, CHANGE);
attachInterrupt(digitalPinToInterrupt(patternSwitch), pattern_isr, CHANGE);
attachInterrupt(digitalPinToInterrupt(leftSwitch), indicator_isr, CHANGE);
attachInterrupt(digitalPinToInterrupt(rightSwitch), indicator_isr, CHANGE);
interrupts();
}
void loop()
{
if (mode == 0)
{
pattern_run();
}
if (mode == 1)
{
brake_pattern();
if (mode == 2)
{
indicator_isr();
}
}
}
void brake_isr()
{
mode = 1;
brake_pattern();
}
void brake_pattern()
{
if (digitalRead(brakeSwitch) == HIGH)
{
digitalWrite(leftLed, HIGH);
digitalWrite(rightLed, HIGH);
delay(100);
digitalWrite(leftLed, LOW);
digitalWrite(rightLed, LOW);
delay(100);
}
else if (digitalRead(brakeSwitch) == LOW)
{
digitalWrite(leftLed, LOW);
digitalWrite(rightLed, LOW);
mode = 0;
}
return;
}
void indicator_isr()
{
if ((digitalRead(leftSwitch) == HIGH) && (digitalRead(rightSwitch) == LOW))
{
digitalWrite(leftLed, HIGH);
digitalWrite(rightLed, LOW);
delay(500);
digitalWrite(leftLed, LOW);
digitalWrite(rightLed, LOW);
delay(500);
mode = 2;
}
else if ((digitalRead(leftSwitch) == LOW) && (digitalRead(rightSwitch) == HIGH))
{
digitalWrite(leftLed, LOW);
digitalWrite(rightLed, HIGH);
delay(500);
digitalWrite(leftLed, LOW);
digitalWrite(rightLed, LOW);
delay(500);
mode = 2;
}
}
void pattern_isr()
{
if (digitalRead(patternSwitch) == HIGH)
{
delay(50);
if (patternNumber >= 1 )
{
patternNumber = patternNumber + 1;
}
if (patternNumber >= 3)
{
patternNumber = 1;
}
}
mode = 0;
pattern_run();
}
void pattern_run()
{
yield();
if (patternNumber == 1)
{
digitalWrite(leftLed, HIGH);
digitalWrite(rightLed, HIGH);
delay(550);
digitalWrite(leftLed, LOW);
digitalWrite(rightLed, LOW);
delay(550);
}
if (patternNumber == 2)
{
digitalWrite(leftLed, HIGH);
digitalWrite(rightLed, HIGH);
delay(90);
digitalWrite(leftLed, LOW);
digitalWrite(rightLed, LOW);
delay(2000);
digitalWrite(leftLed, HIGH);
digitalWrite(rightLed, HIGH);
delay(90);
digitalWrite(leftLed, LOW);
digitalWrite(rightLed, LOW);
delay(2000);
}
}