打印

函数被多次调用!

[复制链接]
2320|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
acer4736|  楼主 | 2012-8-24 20:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的单片机是F149,在程序中发现有只用一次的屏幕显示函数被调用多次,请大家给分析一下,我自己认为是TimerA引起的。

我的这段程序是单片机C语言,在运行时发现屏幕显示函数被多次调用,实际我只用了一次。大家给点意思看看是哪里的问题。我自己分析是TiMER_A定时器引起的。

相关帖子

沙发
acer4736|  楼主 | 2012-8-24 20:28 | 只看该作者
程序如下:

void main(void)

{

  WDTCTL=WDTPW+WDTHOLD;//关闭看门狗

  init_xt();      //时钟初始化

  init_LCD();      //液晶初始化

  Init_Port1();     //P1口初始化



  P4DIR = 0x1e;

  P4SEL = 0x00;

  P4OUT = 0x02;

  xshm();        //这个屏幕显示函数,当运行到(1)这点后,发现返回到当前这条语句,反复这样

  P6DIR=0x00;

  P6SEL=0x01;

  ADC12CTL0 =SHT0_2+ ADC12ON;         // Set sampling time, turn on ADC12

  //ADC12CTL1 = CONSEQ0&CONSEQ1;                      // Use sampling timer+SHP+

  ADC12CTL1 =SHP;

  ADC12MCTL0 = INCH_0+SREF_3;                  // ref+=Vref+, channel = A0

  TACTL=TASSEL_0+TACLR+TAIE;

  CCTL0=CCIE;

  CCR0=38;

   

  TACTL|=MC0;

_EINT();

  

  //SET_GIE;   

while(1)

  {

  Delay(100);                  //延时程序(1)

  }

}

#pragma vector=TIMERA0_VECTOR              /* TimerA三值波 */

__interrupt void Timer_A(void)

{

        js=js+1;

  if(js==5)

   {

     ADC12CTL0 |=ENC+ADC12SC;      

    }else if(js==6)

    {

      while ((ADC12CTL1 & ADC12BUSY) == 1);

      result=ADC12MEM0;

    }

switch (js)

   {

    case 1:

      CCR0=40;

      P4OUT |= 0x04;

      break;

    case 2:

      CCR0=80;

      P4OUT &= 0x00;      

      break;

     case 3:

      CCR0=118;

      P4OUT |= 0x08;

      break;

     case 4:

      CCR0=120;

      P4OUT |= 0x10;      

      break;

    case 5:

      CCR0=160;

      P4OUT &= 0x00;  

      break;

    case 6:

      CCR0=38;

      P4OUT |= 0x02;      

      js=0;           

      break;

}

}

使用特权

评论回复
板凳
gexingyouxian| | 2012-8-24 22:12 | 只看该作者
你这个程序应该是,反复复位造成的。你仔细查查看,有没有其他地方打开了看门狗,或者程序有跑飞的地方,当程序跑飞后遇到代码区为FF的就会引起程序复位,使反复从头执行,看起来就像是执行了多次那个显示函数。

使用特权

评论回复
地板
yangguangaisha| | 2012-8-24 22:27 | 只看该作者
有的时候中断会导致堆栈溢出,从而反复复位,你可以先把中断关掉试试看看

使用特权

评论回复
5
G21372| | 2012-8-24 22:35 | 只看该作者
我试过,把中断关了,程序很好,液晶显示没有什么问题,只要一开就坏了

使用特权

评论回复
6
u880| | 2012-8-24 22:41 | 只看该作者
设置一个测试口接LED。。在各个位置测试下看看可以知道运行到哪出问题

使用特权

评论回复
7
huigoushang| | 2012-8-24 22:47 | 只看该作者
TACTL=TASSEL_0+TACLR+TAIE;

CCTL0=CCIE;

程序中打开了 TAIE 位,没有相应的中断服务子程序,程序实际上是在不断的复位;

你的应用CCIE设置就可以产生定时中断事件了。

使用特权

评论回复
8
gdutxzy| | 2012-8-25 12:02 | 只看该作者
退出前中断标志没有清除,导致退出后中断许可使能后,中断标志依然有效则重复进入中断?
不知道这个是不是编译器帮忙做好了,还是硬件处理的.

使用特权

评论回复
9
chenbb8| | 2012-8-25 18:17 | 只看该作者
STM8+STVP好,中断都有默认的处理函数,需要用自定义的函数,将函数指针修改一下就好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

1500

帖子

3

粉丝