我正在尝试在电路中添加一个按钮来控制我的arduino

问题描述 投票:0回答:1
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。我不知道为什么现在不注册任何按钮按下,它不会改变我的模式。

arduino embedded
1个回答
0
投票

考虑到这里未见的代码量,可能存在多个问题,但缺乏 switch 谴责肯定是其中之一。

在这种情况下,忽略中断直到定时器中断发生是一种简单的去抖方法。 您可以通过在一个处理程序中使用标志 sti 并在另一个处理程序中清除来实现这一点,或者更简单地通过禁用按钮中断直到计时器中断来实现:

ISR(TIMER2_COMPA_vect) 
{
    // Enable button interrupt
    EIMSK |= (1 << INT1);

    ...
}


ISR(INT1_vect)
{
    // Disable button interrupt
    EIMSK &= ~(1 << INT1);

    ...
}

这样,模式标志就无法通过切换反弹或多次激活在模式更新之间重复切换。

© www.soinside.com 2019 - 2024. All rights reserved.