这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » ATmega16编码旋扭外部中断问题,为何总是响应其中一种,求大神指点

共3条 1/1 1 跳转至

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

菜鸟
2015-10-29 22:24:33     打赏

电路很简单,旋转编码器,两个脚接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();

}



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





关键词: ATmega16     旋扭     编码     中断     外部    

菜鸟
2015-10-29 23:17:54     打赏
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:03     打赏
3楼
大侠们,都去泡妞了?

共3条 1/1 1 跳转至

回复

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