论坛» DIY与开源设计» 电子DIY

ATmega16编码旋扭外部中断问题,为何总是响应其中一种,求大神指点

菜鸟
2015-10-29 22:24 1楼

电路很简单,旋转编码器,两个脚接PD3和PD2,开启PD3的外部中断允许。中断响应试过下降沿,上升沿,任意变动,能响应。(PB0~PB4是发光二极管,没有仿真器,只有用点亮标志位来判断程序走到哪)

中断响应如下: 问题是无论哪种触发方式,左右旋转,一直响应PB3,也就是最后一个判断。(改过触发方式,改过 if (PIND3==0),结果都一样)

void int1_isr(void)

{

CLI(); //禁止外部中断
DDRB=0XFF;
PORTB=0XFF;
if (PIND3==0) //先判断是高电平产生的中断还是低点平的中断
{
if (PIND2==0)
{PORTB&=~BIT(0);kon-=1;if(kon>4096)kon=0;}
else
{PORTB&=~BIT(1);kon+=1;if(kon>4096)kon=4095;}
}

else
{ if (PIND2==1)
{PORTB&=~BIT(2); kon+=1;if(kon>4096)kon=4095;}
else
{PORTB&=~BIT(3);kon-=1;if(kon>4096)kon=0;}
}

SEI();

}



求哪位大神,帮我看看,问题出在哪里


菜鸟
2015-10-29 23:17 2楼

刚才再仔细试了一下,下降沿触发,

把if 语句简单化,变成单层了



if (PIND2==1)
{PORTB&=~BIT(0);kon-=1;if(kon>4096)kon=0;}
else
{PORTB&=~BIT(1);kon+=1;if(kon>4096)kon=4095;}


仅有这层判断了,还是一样,进入else判断,点亮PD1,改成

if (PIND2==0)

{PORTB&=~BIT(0);kon-=1;if(kon>4096)kon=0;}
else
{PORTB&=~BIT(1);kon+=1;if(kon>4096)kon=4095;}

效果一样,没有改变,

也就是说,在中断处理里面,if失效了,直接执行esle,如果有多层就是直接执行esle里面的esle.不应该啊!想的头都痛了,也不知道原因在哪里。

菜鸟
2015-10-30 11:32 3楼
大侠们,都去泡妞了?
共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]