【问题标题】:External Interrupt 0 doesn't work外部中断 0 不起作用
【发布时间】:2016-11-07 09:15:24
【问题描述】:

谁能弄清楚为什么我的外部中断 0 不起作用?我正在使用带有 ATmega164P 的 AVR STK 500 板。是不是因为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;
    }
}

【问题讨论】:

  • board_init() 是做什么的?您是否设置/启用外部中断?
  • 不要在 ISR 中 delay
  • 只是为了强调 JimmyB 的声明,不要将延迟放在 ISR 中。

标签: c initialization interrupt avr atmega


【解决方案1】:

我猜你没有启用外部中断。

查看数据表第 10.2 节。

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

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

所以你必须设置

EIMSK |= (1 << INT0);

启用 INT0 和可能的 EICRA 来定义您想要在哪个信号边缘做出反应。

【讨论】:

  • 这个EIMSK |= (1&lt;&lt;INT0),将是设置该位的更透明方式。
  • @BenceKaulics:当然,请原谅我展示了糟糕的编码习惯 :)
  • 这只是一个改进请求,以使一个好的答案更好。 :)
猜你喜欢
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 2015-10-17
  • 1970-01-01
相关资源
最近更新 更多