搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2016-8-17 16:07:52 | 显示全部楼层 |阅读模式
如题,单片机使用内部晶振,使用外部中断0下降沿触发,但是总是不能进入中断,程序和电路劳烦大家指点一下。
#include <iom48v.h>
#include <macros.h>
#include <eeprom.h>

#define  DDRNSSMD0  DDRB  |= (1<<5)
#define  SETNSSMD0  PORTB |= (1<<5)
#define  CLRNSSMD0  PORTB &= ~(1<<5)

#define  DDRINT  DDRD  &= ~(1<<2)
#define  SETINT  PORTD |= (1<<2)
#define  CLRINT  PORTD &= ~(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);
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2016-8-17 16:17:43 | 显示全部楼层
头文件错了,我改过了,但还是不好使

出0入0汤圆

发表于 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生成的,肯定能用

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2016-8-17 18:35:24 | 显示全部楼层
IO时钟没有找到相关配置

出0入0汤圆

 楼主| 发表于 2016-8-17 18:38:25 | 显示全部楼层
粗人 发表于 2016-8-17 18:21
//call this routine to initialize all peripherals
void init_devices(void)
{

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

出0入0汤圆

发表于 2016-8-17 19:02:59 | 显示全部楼层
软件找不出毛病查硬件,要下降沿触发首先你得有个高电平。
IO上拉了吗?

出0入0汤圆

发表于 2016-8-17 22:56:27 | 显示全部楼层
        LDI        R16,                0B00000000
        STS        EICRA,                R16

        LDI        R16,                0B00000010
        OUT        EIMSK,                R16
这是我用汇编设置的INT1中断,端口要设置成输入上拉。
我是用PCF8563的低电平中断来唤醒MEGA48。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-13 10:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表