十月华笑 发表于 2014-6-21 09:23:43

外部中断疑问:主事件,中断事件,没有正常工作。

主事件:

  数码管0-1-2-3-4每秒变化显示

中断事件:
  
  LED闪5次


疑问1:

当S0合上,即接地时,再接通电源,数码管0-4变化显示正常,比如现在显示是1,我打开S0,LED会亮(有一点频闪的感觉)不是正常的按程序闪5次,然后一直维持这个现象。如果再合上S0,显示从2开始,这就是所谓的接着做主事件。

问题:进入中断时,不是正常的闪5次,按理是5次闪完了数码管接着显示,为什么退不出中断?


疑问2:S0断开再接通电源,LED亮(有一点频闪的感觉)。这就说明程序已在中断了。

问题:中断引脚电平都没变化,怎么进入中断的?


以下是原理图和程序,希望指点:





http://v.youku.com/v_show/id_XNzI5NDYyNzcy.html




int pbint = 0;    // 定义中断引脚为0,也就是D2引脚
int led1 = A0;                // 定义输出指示灯引脚





void setup() {

   pinMode(led1,OUTPUT);   //激活13号引脚,我们需要用它供电            
pinMode(A1,OUTPUT);   
    for(int n=6;n<=13;n++)
   {
   pinMode(n,OUTPUT);
   }
   attachInterrupt(pbint, intt0, CHANGE);
}


void loop()
{

digitalWrite(A1,1); //这个就是HIGH和LOW 的另一种写法0代表LOW   1代表HIGH
   

/*==========显示0=============*/
int n0={0,0,0,0,0,0,1,1};      //定义数组 通过0,1定义各数码管的明灭,
int z=0;
for(int x=6;x<=13;x++)          //采用循环方式依次点亮指定的数码管led(数组中0为点亮),单位时间只点亮1个led
{
    digitalWrite(x,n0);         //点亮led语句X为引脚数n0为数组z为0-8的变量,来依次读取数组中的值
    z++;
    if (z>=9)                  //防止变量z累加超过了8
    z=0;
}
delay(1000);
/*==========显示1=============*/
int n1={1,0,0,1,1,1,1,1};

z=0;
for(int x=6;x<=13;x++)
{
    digitalWrite(x,n1);
    z++;
    if (z>=9)
    z=0;
}
delay(1000);
/*==========显示2=============*/
int n2={0,0,1,0,0,1,0,1};

z=0;
for(int x=6;x<=13;x++)
{
    digitalWrite(x,n2);
    z++;
    if (z>=9)
    z=0;
}
delay(1000);
/*==========显示3=============*/
int n3={0,0,0,0,1,1,0,1};

z=0;
for(int x=6;x<=13;x++)
{
    digitalWrite(x,n3);
    z++;
    if (z>=9)
    z=0;
}
delay(1000);
/*==========显示4=============*/

int n4={1,0,0,1,1,0,0,1};
z=0;
for(int x=6;x<=13;x++)
{
    digitalWrite(x,n4);
    z++;
    if (z>=9)
    z=0;
}
delay(1000);
}






void intt0()
{ for(int x=0;x<=5;x++)
{
    digitalWrite(led1,1);
    delay(1000);
    digitalWrite(led1,0);
    delay(1000);
}
}

十月华笑 发表于 2014-6-21 09:49:25

加了一个上拉电阻,现在只存在一个疑问:就是中断程序不能按正常1秒亮和灭。就是很快的频闪数下就退出中断了。求解!

pathletboy 发表于 2014-6-21 11:28:02

中断中不能使用delay,也不该使用delay,因为delay本身也依靠中断,而avr默认中断是不嵌套的。

十月华笑 发表于 2014-6-21 11:51:48

那有什么方法来在中断中实现亮1秒,灭一秒这样的功能吗?

pathletboy 发表于 2014-6-21 12:28:36

十月华笑 发表于 2014-6-21 11:51 static/image/common/back.gif
那有什么方法来在中断中实现亮1秒,灭一秒这样的功能吗?

调整程序结构,使用标志位,在loop循环中处理,才是正确的做法,尽量少用delay,因为delay是忙等待,导致浪费CPU,你这种情况应该建立一个简单状态机进行处理,不要怕,尝试去做一下,不要使用任何delay。
页: [1]
查看完整版本: 外部中断疑问:主事件,中断事件,没有正常工作。