ISR(TIMER2_COMPA_vect) {
slow_counter++;
if (slow_counter >= 125) { // Adjust this value to control the speed of chasing
slow_counter = 0;
if (current_pattern == 0) {
chase_leds(); // Call chase_leds if current pattern is chase_leds
} else {
stay_lit_chase_leds(); // Call stay_lit_chase_leds otherwise
}
}
}
ISR(INT1_vect) {
// Toggle between regular chase and stay-lit chase patterns
if (current_pattern == 0) {
current_pattern = 1; // Change to stay-lit chase pattern
} else {
current_pattern = 0; // Change to regular chase pattern
}
}
void setup() {
DDRD = 0x3F; // Set PD0-2, PD4-5 as output (0b00111111)
DDRB = 0x07; // Set PB0-PB2 as output
PORTD = 0x08; // Enable pull-up resistor on PD3
InitTimer();
adc_init();
// Enable global interrupts
sei();
// Configure external interrupt INT0 for the button at PD4
EICRA |= (1 << ISC00); // Trigger on any logic change
EIMSK |= (1 << INT1); // Enable INT1 interrupt
// Initialize serial communication
Serial.begin(57600);
}
int main(void) {
setup();
while (1) {
// Main loop
}
return 0;
}
我对这个定时器和中断主题真的一无所知。所以我真的不知道该怎么办。
所以我尝试添加一个按钮来更改模式。我的按钮只允许使用 PD2 和 3。我不知道为什么现在不注册任何按钮按下,它不会改变我的模式。
考虑到这里未见的代码量,可能存在多个问题,但缺乏 switch 谴责肯定是其中之一。
在这种情况下,忽略中断直到定时器中断发生是一种简单的去抖方法。 您可以通过在一个处理程序中使用标志 sti 并在另一个处理程序中清除来实现这一点,或者更简单地通过禁用按钮中断直到计时器中断来实现:
ISR(TIMER2_COMPA_vect)
{
// Enable button interrupt
EIMSK |= (1 << INT1);
...
}
ISR(INT1_vect)
{
// Disable button interrupt
EIMSK &= ~(1 << INT1);
...
}
这样,模式标志就无法通过切换反弹或多次激活在模式更新之间重复切换。