搜索
bottom↓
回复: 16

代码这样写有什么区别,求指点

[复制链接]

出0入0汤圆

发表于 2011-11-16 14:43:37 | 显示全部楼层 |阅读模式
#include  <msp430x14x.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P2DIR |= 0x01;                            // P1.0 output
  TBCCTL0 = CCIE;                           // CCR0 interrupt enabled
  TBCCR0 = 30000 ;
  TBCTL = TBSSEL_2 + MC_2;                  // SMCLK, contmode

  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}

// Timer B0 interrupt service routine
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
   P2OUT ^= 0x01;                            // Toggle P1.0
//问题在此处
   TBCCR0 += 30000 ;                          // Add Offset to CCR0
  }
为什么不写成: TBCCR0 = 30000 ;
我2种写法都试了,发现代码运行没有神没区别!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-11-16 14:55:23 | 显示全部楼层
TBCCR0 += 30000 ;  等于 TBCCR0 = TBCCR0 +30000 ;

出0入0汤圆

发表于 2011-11-16 15:27:16 | 显示全部楼层
因为进中断时TBCCR0=0,所以你的两种写法效果一样。

出0入0汤圆

发表于 2011-11-16 15:40:22 | 显示全部楼层
这明显差别很大嘛,1楼正解。

出500入0汤圆

发表于 2011-11-16 15:44:27 | 显示全部楼层
TBCCR0是个寄存器吧?一楼正解

出0入31汤圆

发表于 2011-11-16 15:44:34 | 显示全部楼层
你不能只看结果,过程也很重要

出0入0汤圆

发表于 2011-11-16 16:01:29 | 显示全部楼层
没有用过这款芯片,不过这两句话不一样,因为TBCCR0 = 0引起终端,但是执行到这一句的时候TBCCR0 应该不一定等于0吧。

TBCCR0 += 30000 应该是为了消除定时的误差。

猜想的,欢迎拍砖。

出0入0汤圆

发表于 2011-11-16 16:06:10 | 显示全部楼层
回复【6楼】zjj841011
-----------------------------------------------------------------------

定时中断,进中断肯定是计数器溢出了。

出0入0汤圆

发表于 2011-11-16 16:34:16 | 显示全部楼层
回复【6楼】zjj841011
-----------------------------------------------------------------------

正解,我都是这么写,两种写法运行时间长了就看出差别来了。

出0入24汤圆

发表于 2011-11-16 16:58:10 | 显示全部楼层
P2OUT ^= 0x01;                            // Toggle P1.0
//问题在此处
   TBCCR0 += 30000 ;                          // Add Offset to CCR0

两句话中加加点程序,弄长一点,实在不行你弄个delay进去就能看见二者的区别了

出0入0汤圆

发表于 2011-11-16 18:19:13 | 显示全部楼层
回复【楼主位】ARMVSAVR
#include  &lt;msp430x14x.h&gt;
void main(void)
{
  wdtctl = wdtpw + wdthold;                 // stop wdt
  p2dir |= 0x01;                            // p1.0 output
  tbcctl0 = ccie;                           // ccr0 interrupt enabled
  tbccr0 = 30000 ;
  tbctl = tbssel_2 + mc_2;                  // smclk, contmode
  _bis_sr(lpm0_bits + gie);                 // enter lpm0 w/ interrupt
}
/......
-----------------------------------------------------------------------

看看这个
点击此处下载 ourdev_695823V0AEEB.pdf(文件大小:898K) (原文件名:C语言深度解剖.pdf)

出0入0汤圆

发表于 2011-11-16 18:36:39 | 显示全部楼层
回复【楼主位】ARMVSAVR
-----------------------------------------------------------------------

应该是为了保证每次中断之间的间隔时间相等

出0入0汤圆

发表于 2011-11-16 19:22:21 | 显示全部楼层
顶10楼,一边看书去。。。

出0入0汤圆

发表于 2011-11-16 19:49:57 | 显示全部楼层
it is because of interrupt latency: when the the tmr overflows, it triggers the isr. when the execution goes to loading the tmr with the offset, the tmr has advanced a few ticks because of the latency. by adding a value to it, you have retained the ticks and making the time between each offset the same as suggested by the offset.

出0入0汤圆

 楼主| 发表于 2011-11-17 08:57:42 | 显示全部楼层
谢谢大家热心的指点!初学MSP430觉得TI的文档与例程比较好!

出0入0汤圆

发表于 2011-11-17 11:42:39 | 显示全部楼层
回复【6楼】zjj841011
没有用过这款芯片,不过这两句话不一样,因为tbccr0 = 0引起终端,但是执行到这一句的时候tbccr0 应该不一定等于0吧。  
tbccr0 += 30000 应该是为了消除定时的误差。
猜想的,欢迎拍砖。
-----------------------------------------------------------------------

估计是的。

出0入0汤圆

发表于 2011-11-27 00:51:45 | 显示全部楼层
你要是有430的开发板或者是最小系统板的话,可以用仿真器进行编译,用IAR中单步运行观察寄存器中值的变化,我当初有什么搞不懂的时候就是这么慢慢看的就是一步一步看寄存器怎么变,基本理一遍之后就会懂一点了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-18 02:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表