• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

关于MSP430的定时中断问题,请教大神。

蓝雨LOVE诗 2015-10-07 浏览量:1821

我要写一个程序,主要思路如下:

首先定时器设定一个初值1000,然后定时器自加,加到1000后,跳入中断,执行一次判断   if(P1IN&BIT0==0),若满足条件则   k++;我要的数据就是k的值。但是,我现在有个问题,在中断程序里,我必须给K赋初值,k=0。这样的话,不管我跳入几次中断,满足几次条件,K最多等于1。我该怎么改?

程序如下:

void main(void)

  //int k=0,i;
  WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗

P1DIR &=0X00;//~BIT0;
 CCTL0=CCIE+CM1;
  CCR0=1000;
  TACTL=TASSEL_1+MC_1;     //用外部特定的引脚信号,增计数模式
 _BIS_SR(LPM3_bits+GIE);   //开中断允许

  //LPM0;
}

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
    int k=0;
    
    void Delay4000ms();
   if(P1IN&BIT0==0)
        k++;
   LcdReset();   //显示程序的初始化
      Disp1Char(11,0,shuzi[k]);     在1602中显示k的值                    
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 首先主流程有问题,主流程必须是一个死循环while(1){}或者for(;;){},在这个死循环中添加任务,否则程序运行到最下端会出现异常(跑飞、复位、死机等),其次你程序中的k是一个临时变量,当然每次进入都会赋值为0,关于k的定义有两种方式,一是在函数体内定义:static int k = 0;另一种就是定义成全局变量,还有中断中的程序要尽可能的短,做到快进快出,你在定时中断中加入4000毫秒的延时是不合常理的,我不知道你的具体需求是什么,若能提供详细的需求,我帮你做一个demo程序

    • 发布于 2015-10-07
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:4

  • 看了你的程序的目的是在LCD中显示进入中断的次数是吗?

    程序有几个问题:

    比如,中断程序中的void Delay4000ms();     void可以去掉;

    显示程序的初始化完全可以放到主函数中,不需要进入中断就初始化一次;

    你可以把k定义成全局变量,在主函数中不断执行显示k值程序,Disp1Char(11,0,shuzi[k]);

    在中断程序中改变k值即可



    • 发布于2015-10-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 谢谢你,我把k定义了全局变量,这个问题就解决了。但是,为什么MSP430的P1.0口检测不出低电平呢?if(P1IN&BIT0==0),检测不出来。k一直是0。
    • 发布于2015-10-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 你的程序写得有问题,按照你的程序这样写,按键按下必须要刚好进入中断才能被检测到;

    其实,可以用外部中断,进入中断,更新k值,主函数中显示k值

    • 发布于2015-10-07
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

关于MSP430的定时中断问题,请教大神。