正在使用 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 处于活动状态时,它确实会中断我的小闪烁功能。
看起来您在 while 循环的每次迭代中都调用 tesBlink() 。 button_pressed 没有设置,所以你只是不断地关闭 LED。
我敢打赌你的 ISR 正在工作,但它只是将 LED 打开一段难以察觉的时间