我的中断有效,但如果我#ifdef一些看似无关的东西,它就会停止工作

问题描述 投票:0回答:1

正在使用 ATTINY13a。当我注释掉用于测试的#define 时,我的中断停止工作。我可以在按住按钮的同时触发中断并保持板上的 LED 亮起,但前提是 #define BLINK_TEST 处于活动状态。

两个版本都可以正常编译并上传到开发板,但是如果 LED 不闪烁,我无法用 ISR 让它点亮。

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define LED1   PB0
#define LED2   PB1
#define BUTTON PB2
#define DEBOUNCE_TIME (400) // in _delay_us
#define BLINK_TEST
//#define BUTTON_TEST

//---------------------------Declare Func----------------------
void testBlink ();
void isButtonPressed ();
void led2_on ();
void led2_off ();

//---------------------------Declare Variables-----------------
uint8_t button_pressed = 0;


int main(void) {

//--------------------------IO Setup------------------------------
DDRB |= (1 << LED1);
DDRB |= (1 << LED2);
DDRB &= ~(1 << BUTTON); //set pushbuton as input
PORTB |= (1 << BUTTON); //enable pullup

//-------------------Pin Change Interrupt Setup-------------------
MCUCR |= (1 << ISC01);  //set interrupt to occur on falling edge
GIMSK |= (1 << INT0);   //external interrupt enable
PCMSK |= (1 << PCINT2); //set button pin(PB2) to accept interrupts

sei(); //enable global interrupts

while (1) {

//----------------------Sanity Check Blinky-------------------------
#ifdef BLINK_TEST
testBlink();
#endif 

#ifdef BUTTON_TEST
isButtonPressed();

if (button_pressed) {
    led2_on();
} else { 
    led2_off();
    }
#endif


}
    return 0;
}

//---------------------------Button Press ISR----------------------------
ISR (INT0_vect) {
    if (!(PINB & (1 << BUTTON))) {
        _delay_us (DEBOUNCE_TIME);
           if (!(PINB & (1 << BUTTON))) { 
                led2_on();
           } else {
                led2_off();
             }
    }
}

//--------------------------blinktest function---------------------------
#ifdef BLINK_TEST
void testBlink () {
    if (button_pressed == 0) {
        led2_on();
        _delay_ms (200);
        led2_off();
        _delay_ms (200);
    }  
} 
#endif

//--------------------------Detect Button Press--------------------------
#ifdef BUTTON_TEST
void isButtonPressed () {

    if (!(PINB & (1 << BUTTON))) {
    _delay_us(DEBOUNCE_TIME);
        if (!(PINB & (1 << BUTTON))) {
        button_pressed = 1;
        } else {
            button_pressed = 0;
        }
    }
}
#endif

//----------------------LED2 ON-----------------------
void led2_on () {
    PORTB |= (1 << LED2);
}
//----------------------LED2 OFF-----------------------
void led2_off () {
    PORTB &= ~(1 << LED2);
}

我尝试将中断向量更改为 (PCINT0),因为数据表似乎显示它将 C 与汇编进行比较,但这不起作用。我尝试更改 ISR 中的代码,但这似乎也不起作用,但当 #define BLINK_TEST 处于活动状态时,它确实会中断我的小闪烁功能。

c embedded interrupt avr
1个回答
0
投票

看起来您在 while 循环的每次迭代中都调用 tesBlink() 。 button_pressed 没有设置,所以你只是不断地关闭 LED。

我敢打赌你的 ISR 正在工作,但它只是将 LED 打开一段难以察觉的时间

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