C 外部中断0不';行不通

C 外部中断0不';行不通,c,initialization,interrupt,avr,atmega,C,Initialization,Interrupt,Avr,Atmega,有人能找出我的外部中断0不工作的原因吗?我使用的是AVR STK 500板,上面有一个ATmega164P。是因为针脚D2有两个功能吗 #include <asf.h> #include <avr/interrupt.h> #include <avr/io.h> #define F_CPU 8000000UL #include <util/delay.h> ISR(INT0_vect) { PORTB = 1; for(int

有人能找出我的外部中断0不工作的原因吗?我使用的是AVR STK 500板,上面有一个ATmega164P。是因为针脚D2有两个功能吗

#include <asf.h>
#include <avr/interrupt.h>
#include <avr/io.h>

#define F_CPU 8000000UL
#include <util/delay.h>

ISR(INT0_vect)
{
    PORTB = 1;
    for(int i = 0; i < 7; i++)
    {
        _delay_ms(500);
        PORTB << 1;
    }
}

int main (void)
{
    board_init();

    sei();

    PORTD = 0xFF;
    DDRD = 0x00;
    PORTB = 0x00;
    DDRB = 0xFF;

    while(1)
    {
        PORTB = PIND;
    }
}
#包括
#包括
#包括
#定义F_CPU 800000UL
#包括
情报、监视和侦察(国际矢量)
{
b=1;
对于(int i=0;i<7;i++)
{
_延迟μms(500);

我猜您没有启用外部中断

请参阅数据表第10.2节

10.2.2 EIMSK–外部中断屏蔽寄存器

当一个INT2:0位被写入1,并且状态寄存器(SREG)中的I位被设置(1)时,相应的外部引脚中断被启用。外部中断控制寄存器中的中断检测控制位, EICRA定义了在检测到上升沿、下降沿或电平时是否激活外部中断

所以你必须设定

EIMSK |= (1 << INT0);

EIMSK |=(1我猜您没有启用外部中断

请参阅数据表第10.2节

10.2.2 EIMSK–外部中断屏蔽寄存器

当一个INT2:0位被写入1,并且状态寄存器(SREG)中的I位被设置(1)时,相应的外部引脚中断被启用。外部中断控制寄存器中的中断检测控制位, EICRA定义了在检测到上升沿、下降沿或电平时是否激活外部中断

所以你必须设定

EIMSK |= (1 << INT0);

EIMSK |=(1 board_init()的作用是什么?是否设置/启用外部中断?不要在ISR内部延迟。只是强调JimmyB的声明,不要在ISR内部延迟。board_init()的作用是什么您是否设置/启用了外部中断?不要在ISR内延迟。为了强调JimmyB的声明,不要在ISR内延迟。此
EIMSK |=(1@BenceKaulics:当然,请原谅我演示了糟糕的编码实践:)这只是一个改进请求,以更好地给出一个好的答案。:)这是
EIMSK |=(1@BenceKaulics:当然,请原谅我演示了糟糕的编码实践:)这只是一个改进请求,以更好地给出一个好的答案。:)