51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > MSP430单片机 > 详细内容
[分享]MSP430定时器调试总结
发布时间:2009/7/31  阅读次数:1127  字体大小: 【】 【】【
作者:陕西 陈剑锋
   摘自:电子报/2005 年/12 月
   MSP430 是TI 公司推出的16 位低功耗单片机,已广泛应用到抄表、汽车和工业控制等领域。笔者在用汇编语言进行编程调试中发现,现有书籍和资料大多取自英文的产品手册,对程序调试的指导意义有限,难以满足初学者需要,本文就在MSP430F169 的定时器调试中出现的问题进行了总结,希望更多的MSP430 使用者总结出自己的使用经验,以供大家分享。
问题一:在定时器增计数模式下,程序不能正确进入中断程序。

程序如下:
  ;时钟初始化
   BIC.B #XT2OFF,BCSCTL1
   BIC.B #XTS,BCSCTL1
   BIS.B #SELM1,&BCSCTL2
  ;选择XT2CLK 为MCLK 的时钟源

   ;定时器初始化
   MOV #0FFH,&TBCCR0 BIS # ID_3,&TBCTL
   ;MCLK8 分频作为定时器的时钟源
     BIS # CCIE +MC_1,&TBCTL
   ;以增计数模式开始计数并开中断
   EINTMainloop ...
   JMP Mainloop

  ;定时器中断程序
  TIMERB0 ADD.W &TBIV,PC RETI ...
  TBOVER XOR.B #04h,P2OUT RETI
-------------------------------------------------------------------------------
现象:TBCCR0 计满0FFH,程序指向TIMERB0,执行中断便死机。
经查原因如下:当TBR 计数到TBC-CR0 设定值0FFH 时,中断标志位TBIFG 置位,指针跳转到中断程序首址TIMERB0 处。在这里执行程序指针PC 加上定时器中断向量TBIV 内的值,指
向相应的执行程序。但TBIE 的中断向量要到中断标志位TBIFG 置位的下一个定时器时钟周期到来时才会产生,因为用MCLK 的8 分频作为定时器的时钟源,所以在下一个定时器的时钟前,程序有8 个指令周期的空挡。换句话说,就是中断标志位TBIFG 置位后,还需8 个指令周期TBIE内的中断向量才会产生。再看上面的程序,TBIFG 置位后第一个指令周期执行的是跳转指令,程序指向TIMERB0 处,第二个指令周期就开始执行语句“ADD.W &TBIV,PC”,而这时TBIV 内的中断向量值还没有产生,所以程序会死掉。
决办法:可以在定时器中断程序的首址TIMERB0 与执行语句“ADD.W&TBIV,PC”之间
加7 条以上的NOP 指令,等待定时器中断向量TBIV 的产生。

问题二:调用子程序时产生错误。
     例如,调用延时程序的语句为:“CALL DB-LAY”,执行时程序跑飞。查看手册和相关书籍,指令格式为“CALL dst”,应该没有错,但问题依旧存在。
     解决办法:找一个MSP430 调用子程序的例程,发现指令的格式为“CALL #dst”。将调用子程序的语句改为“CALL #DE-LAY”再运行,问题解决。

问题三:在定时器增/减计数模式下,不能进入中断程序。
程序如下:
MOV #0FFH,&TBCCR0 BIS # CCIE +MC_3,&TBCTL;以增/减计数模式开始计数并开中断;
     --------中断向量部分------
     ORG 0FFFEh           ;/﹡ 0xFFFE Reset ﹡/
     DW RESET
     ORG 0FFFAh           ;/﹡ 0xFFFA Timer B CC0 ﹡/
     DW HMERB0 END

现象:TBR 计数到0FFH,TBCCR0 溢出,相应的中断标志位TBIFG 也置位了,但程序无法
进入中断。
解决办法:查看msp430x16x..h 头文件中断向量相关部分如下:
  #define TIMERB1_VECTOR(12 ﹡ 2u)    /﹡ 0xFFF8 Timer B CC1-6, TB ﹡/
  #define TIMERB0_VECTOR(13 ﹡ 2u)    /﹡ 0xFFFA Timer B CC0 ﹡/

   TBCCR0 应该对应0xFFFA 处的中断向量TIMERB0_VECTOR,而TBCCR1~TBCCR6 应该
对应0xFFF8 处的中断向量TIMERB1_VECTOR,但TBCCR0 溢出时,程序指针就是不指向0xFFFA
处的中断向量。查阅所有手册和书籍,均没有相关说明和解释。经过尝试,笔者将上面程序中的“ORG 0FFFAh”改为“ORG0FFF8h”后,程序运行就正常了,即这时使用的是中断向量
TIMERB1_VECTOR。
   另外,“ORG 0FFF8h”不能写为“ORG TIMERB1_VECTOR”,若写成后者,可以编译,但
程序不会执行。
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号