当作休闲,整理官方和我的改编的程序的注释和框图,想起之前的一个疑惑,写下来问问,怕忘了
主程序循环中:
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循环中间会有影响么?
官方主程序没有或者一下在找不到的可到http://bbs.eeworld.com.cn/thread-308725-1-1.html,其中有官方链接,附件里也有
Young Hu:
不会有影响,编译器在会生产将context中相应的通用寄存器压入堆栈的汇编代码。如果不放心的话,可以手动压栈
我查看了工程文件下的一个函数的汇编代码如图所示。。
Fuchong Wang:
回复 Young Hu:
啊!
难道这的如此?
我说的是tempCalibrated的值呀,按键的作用应该就是将tempCalibrated值设为当前的平均温度empAverage值呀,如果在主程序for循环中发生中断,tempCalibrated可能就是近似于平均温度的倍数了
我开始还是故意发这个帖子认为肯定是bug无疑呢,虽然委婉地有点过分,不过还是可以看看德州仪器是否够大气,应该是给个奖品给我比遮掩强的
看来我还得想想
Fuchong Wang:
回复 Fuchong Wang:
我开始还想着肯定是德州的错了,这也没有什么大不了的,德州那么多产品,工程师可能也很忙,再说这个小东西也不是什么,工程师也不一定放在心上,最多是管理还待进一步加紧不能懈怠,所以发这个帖子也不能算多丢德州的面子,再说不都说老外不怎么讲面子么?
可笑我
Peter_Zheng:
显然这程序是有bug存在,可以在ad中断里做,也可以用其他方法fix掉.
Young Hu:
回复 Fuchong Wang:
是我理解错了。那如果像你说的那样,这个值的显示是要出错了。
没什么可遮掩的!欢迎你多发现bug!
Fuchong Wang:
回复 Peter_Zheng:
我也以为是,不过这也没什么大不了的,工程师出错也是常有的事,火星车还趴在那儿好一段时间呢
Fuchong Wang:
回复 Young Hu:
可不能说多发现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的作用,谢谢!
Fuchong Wang:
回复 Fuchong Wang:
应该是这个函数中,复制错了:
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;
}
不过上面一个帖子中的也应该是一样的问题吧
Jason Guo:
回复 Fuchong Wang:
关于这个OUTMOD_3你说的很对。在这个程序中是没有作用的。