搞了一天没搞出来,关于外中断的问题,请大侠指导一下
#include <iom1280v.h>
#include <macros.h>
unsigned char i = 0xff;
void port_init(void)
{
PORTC = 0xff;
DDRC= 0xff;
PORTD = 0xff;
DDRD= 0xff;
}
#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{
PORTC = ~i;
}
void main(void)
{
CLI();
port_init();
EIMSK= 0x0f;
EICRA= 0xff;
SEI();
while(1);
}
PORTC连接着LED,尝试通过int0开关这些led,一直没成功。
试过改成
PORTD = 0xff;
DDRD= 0x00;
也是不行,请问哪里错了?
i = ~i;
PORTC = i;
原因是i在你的执行过程中没有发生任何变化,所以看上去LED不变。 vows 发表于 2014-7-15 10:25
i = ~i;
PORTC = i;
原因是i在你的执行过程中没有发生任何变化,所以看上去LED不变。 ...
i是全局变量哇~~~,已经取反了,怎么会不变? 本帖最后由 vows 于 2014-7-15 10:40 编辑
bbsfoo 发表于 2014-7-15 10:34
i是全局变量哇~~~,已经取反了,怎么会不变?
你已经对i取反了,但是你没对i赋值。i怎么会变呢?{:smile:}
我再写清楚一点:
void int0_isr(void)
{
i = ~i;
PORTC = i;
}
其实你直接对PORTC取反赋值就可以实现了。
PORTC=~PORTC; vows 发表于 2014-7-15 10:38
你已经对i取反了,但是你没对i赋值。i怎么会变呢?
我再写清楚一点:
是啊,你说的对。
最严重的问题是,我include错了头文件~~~~~~~我晕死啊。。。。。。。。。。 vows 发表于 2014-7-15 10:38
你已经对i取反了,但是你没对i赋值。i怎么会变呢?
我再写清楚一点:
大哥,能不能再指导一下。
我将头文件改为iom128v.h就可以运行。
但还有一个问题,就是关于PORTD,到底设置输入还是输出?我测试的结果是两者均可,但设置为输入,则通电时会自动激发一次int0的中断,而设置为输出就不会,是什么原因? bbsfoo 发表于 2014-7-15 10:58
大哥,能不能再指导一下。
我将头文件改为iom128v.h就可以运行。
上电过程是一个由不稳定状态转换到稳定状态的过程。上电过程中电路板电压电平会从0V变为VCC,可以视为一个上升沿脉冲。如果电路中有电容连接到IO的话,脉冲还能耦合进来。
不管你是边沿触发还是电平触发,都容易引起中断的。具体是什么情况还得看你原理图。
根据你的情况,可以这样试试:先把PORTD设为输出,在启动时加入100ms延时,延时结束后再置为输入,这样可能会好一点。
页:
[1]