陶新成 发表于 2016-8-17 16:07:52

atmega168外部中断下降沿触发设置不成功问题请教

如题,单片机使用内部晶振,使用外部中断0下降沿触发,但是总是不能进入中断,程序和电路劳烦大家指点一下。
#include <iom48v.h>
#include <macros.h>
#include <eeprom.h>

#defineDDRNSSMD0DDRB|= (1<<5)
#defineSETNSSMD0PORTB |= (1<<5)
#defineCLRNSSMD0PORTB &= ~(1<<5)

#defineDDRINTDDRD&= ~(1<<2)
#defineSETINTPORTD |= (1<<2)
#defineCLRINTPORTD &= ~(1<<2)

#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{
   CLRNSSMD0;
   SETNSSMD0;
}

void init_devices(void)
{
CLI(); //disable all interrupts

MCUCR = 0x00;
EICRA = 0x02; //extended ext ints
EIMSK = 0x01;

TIMSK0 = 0x00; //timer 0 interrupt sources
TIMSK1 = 0x00; //timer 1 interrupt sources
TIMSK2 = 0x00; //timer 2 interrupt sources

PCMSK0 = 0x00; //pin change mask 0
PCMSK1 = 0x00; //pin change mask 1
PCMSK2 = 0x00; //pin change mask 2
PRR = 0x00; //power controller
SEI(); //re-enable interrupts
}

void main(void)
{
   init_devices();
   DDRNSSMD0;
   SETNSSMD0;
   DDRINT;
   SETINT;
   while(1);
}

陶新成 发表于 2016-8-17 16:17:43

头文件错了,我改过了,但还是不好使

粗人 发表于 2016-8-17 18:21:11


//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();

MCUCR = 0x00;
EICRA = 0x02; //extended ext ints
EIMSK = 0x01;

TIMSK0 = 0x00; //timer 0 interrupt sources
TIMSK1 = 0x00; //timer 1 interrupt sources
TIMSK2 = 0x00; //timer 2 interrupt sources

PCMSK0 = 0x00; //pin change mask 0
PCMSK1 = 0x00; //pin change mask 1
PCMSK2 = 0x00; //pin change mask 2
PCICR = 0x00; //pin change enable
PRR = 0x00; //power controller
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

直接用ICC生成的,肯定能用

陶新成 发表于 2016-8-17 18:33:19

查看了资料,外部中断下降沿触发时的介绍
:INT0 与 INT1 中断可以由下降沿、上升沿,或者是低电平触发。具体由外部中断控制寄存
器 A – EICRA 的设置来确定。当 INT0 或 INT1 中断使能且设定为电平触发时,只要引脚
电平被拉低,中断就会产生。若要求 INT0 或 INT1 在信号下降沿或上升沿触发中断,则
I/O时钟必须工作(请参见P 22 “时钟系统及其分布” 了解更多信息)。 INT0与INT1 的低电平
中断检测是异步的。也就是说它可以用来将器件从休眠模式唤醒。在休眠过程 ( 除了空闲
模式 ) 中 I/O 时钟是停止的。

陶新成 发表于 2016-8-17 18:33:58

I/O 时钟用于主要的 I/O 模块,如定时器 / 计数器、 SPI 和 USART。 I/O 时钟还用于外部中断
模块。要注意的是有些外部中断通过异步逻辑检测,因此即使 I/O 时钟停止了这些中断仍
然可以得到监控。此外, USI 模块的起始条件检测在没有 clkI/O 的情况下也是异步实现
的,使得这个功能在任何睡眠模式下都可以正常工作。

陶新成 发表于 2016-8-17 18:35:24

IO时钟没有找到相关配置

陶新成 发表于 2016-8-17 18:38:25

粗人 发表于 2016-8-17 18:21
//call this routine to initialize all peripherals
void init_devices(void)
{


可是却是没有反应,单片机供电正常,SPI工作正常,使用内部8M晶振,熔丝位配置也应该是正常的,我现在不知道给怎么测试了,能给点思路吗

粗人 发表于 2016-8-17 19:02:59

软件找不出毛病查硬件,要下降沿触发首先你得有个高电平。
IO上拉了吗?

HYLG 发表于 2016-8-17 22:56:27

      LDI        R16,                0B00000000
        STS        EICRA,                R16

        LDI        R16,                0B00000010
        OUT        EIMSK,                R16
这是我用汇编设置的INT1中断,端口要设置成输入上拉。
我是用PCF8563的低电平中断来唤醒MEGA48。
页: [1]
查看完整版本: atmega168外部中断下降沿触发设置不成功问题请教