This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Temperature Sensor例子中的按键中断如果发生在温度平均计算中间会影响么?

当作休闲,整理官方和我的改编的程序的注释和框图,想起之前的一个疑惑,写下来问问,怕忘了

主程序循环中:
for (i = 0; i < 8; i++)
tempAverage += tempMeasured;
tempAverage >>= 3; // Divide by 8 to get average

按键中断:
if (applicationMode == APP_APPLICATION_MODE)
{
tempCalibrated = tempAverage;
calibrateUpdate = 1;
}

如果中断发生在for循环中间会有影响么?

官方主程序没有或者一下在找不到的可到bbs.eeworld.com.cn/thread-308725-1-1.html,其中有官方链接,附件里也有

  • 不会有影响,编译器在会生产将context中相应的通用寄存器压入堆栈的汇编代码。如果不放心的话,可以手动压栈

    我查看了工程文件下的一个函数的汇编代码如图所示。。

  • 啊!

    难道这的如此?

    我说的是tempCalibrated的值呀,按键的作用应该就是将tempCalibrated值设为当前的平均温度empAverage值呀,如果在主程序for循环中发生中断,tempCalibrated可能就是近似于平均温度的倍数了

    我开始还是故意发这个帖子认为肯定是bug无疑呢,虽然委婉地有点过分,不过还是可以看看德州仪器是否够大气,应该是给个奖品给我比遮掩强的

    看来我还得想想

  • 我开始还想着肯定是德州的错了,这也没有什么大不了的,德州那么多产品,工程师可能也很忙,再说这个小东西也不是什么,工程师也不一定放在心上,最多是管理还待进一步加紧不能懈怠,所以发这个帖子也不能算多丢德州的面子,再说不都说老外不怎么讲面子么?

    可笑我

  • 显然这程序是有bug存在,可以在ad中断里做,也可以用其他方法fix掉.

  • 是我理解错了。那如果像你说的那样,这个值的显示是要出错了。

    没什么可遮掩的!欢迎你多发现bug!

  • 我也以为是,不过这也没什么大不了的,工程师出错也是常有的事,火星车还趴在那儿好一段时间呢

  • 可不能说多发现bug呀,我也是初接触430,没那么大水平呀

    要是说要我多提建议,倒是可能有时候会斗胆说几句不一定对的

    既然您这么说了,那我就就这个lauchpad的Temperature Sensor例子再疑问一个问题:

    void PreApplicationMode(void)

    {    

     LED_DIR |= LED1 + LED2;

     LED_OUT |= LED1;                          // To enable the LED toggling effect

     LED_OUT &= ~LED2;

     BCSCTL1 |= DIVA_1;                        // ACLK/2

     BCSCTL3 |= LFXT1S_2;                      // ACLK = VLO

     TACCR0 = 1200;                             //  

     TACTL = TASSEL_1 | MC_1;                  // TACLK = SMCLK, Up mode.  

     TACCTL1 = CCIE + OUTMOD_3;                // TACCTL1 Capture Compare

     TACCR1 = 600;  

     __bis_SR_register(LPM3_bits + GIE);          // LPM0 with interrupts enabled

    }

    其中TACCTL1 = CCIE + OUTMOD_3; 这一句的OUTMOD_3加上是什么意思?TACCTL1 的功能输出是否对应p1.6脚?当然虽然p1.6接着一个LED但P1.6并没有打开特殊功能,所以应该对LED没有作用,那么添上这个模式定义有什么意义呢?我确定不了,能不能麻烦指教一下?我有点怀疑那是多余的,当然对程序的运行功能没有影响。如果确实是多余的,对作为一个第一次接触430的初学者,是否会起到误导的作用呢?导致初学者就demo源码学习msp430的定时器功能产生额外的困惑,以为德州加上这个模式肯定是有意义的,是自己没有理解。如果是这样,能否修正掉以利于初学者呢?

    当然我的怀疑不一定对,那请您指教我一次,加上这个OUTMOD_3的作用,谢谢!

  • 应该是这个函数中,复制错了:

    void ConfigureTimerPwm(void)

    {

     timerMode = TIMER_PWM_MODE;

     TACCR0 = TIMER_PWM_PERIOD;                              //  

     TACTL = TASSEL_2 | MC_1;                  // TACLK = SMCLK, Up mode.

     TACCTL0 = CCIE;

     TACCTL1 = CCIE + OUTMOD_3;                // TACCTL1 Capture Compare

     TACCR1 = 1;

    }

    不过上面一个帖子中的也应该是一样的问题吧

  • 关于这个OUTMOD_3你说的很对。在这个程序中是没有作用的。