bbsfoo 发表于 2014-7-15 10:21:32

搞了一天没搞出来,关于外中断的问题,请大侠指导一下


#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;
也是不行,请问哪里错了?

vows 发表于 2014-7-15 10:25:31

i = ~i;
PORTC = i;
原因是i在你的执行过程中没有发生任何变化,所以看上去LED不变。

bbsfoo 发表于 2014-7-15 10:34:02

vows 发表于 2014-7-15 10:25
i = ~i;
PORTC = i;
原因是i在你的执行过程中没有发生任何变化,所以看上去LED不变。 ...

i是全局变量哇~~~,已经取反了,怎么会不变?

vows 发表于 2014-7-15 10:38:13

本帖最后由 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;

bbsfoo 发表于 2014-7-15 10:42:00

vows 发表于 2014-7-15 10:38
你已经对i取反了,但是你没对i赋值。i怎么会变呢?
我再写清楚一点:



是啊,你说的对。


最严重的问题是,我include错了头文件~~~~~~~我晕死啊。。。。。。。。。。

bbsfoo 发表于 2014-7-15 10:58:43

vows 发表于 2014-7-15 10:38
你已经对i取反了,但是你没对i赋值。i怎么会变呢?
我再写清楚一点:



大哥,能不能再指导一下。

我将头文件改为iom128v.h就可以运行。
但还有一个问题,就是关于PORTD,到底设置输入还是输出?我测试的结果是两者均可,但设置为输入,则通电时会自动激发一次int0的中断,而设置为输出就不会,是什么原因?

vows 发表于 2014-7-15 11:09:07

bbsfoo 发表于 2014-7-15 10:58
大哥,能不能再指导一下。

我将头文件改为iom128v.h就可以运行。


上电过程是一个由不稳定状态转换到稳定状态的过程。上电过程中电路板电压电平会从0V变为VCC,可以视为一个上升沿脉冲。如果电路中有电容连接到IO的话,脉冲还能耦合进来。
不管你是边沿触发还是电平触发,都容易引起中断的。具体是什么情况还得看你原理图。
根据你的情况,可以这样试试:先把PORTD设为输出,在启动时加入100ms延时,延时结束后再置为输入,这样可能会好一点。
页: [1]
查看完整版本: 搞了一天没搞出来,关于外中断的问题,请大侠指导一下