当前位置:
首页 >
单片机技术文章 >
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”,若写成后者,可以编译,但
程序不会执行。