Sie sind auf Seite 1von 6

MSP430 单片机 TIMER_A 在产品设计中的应用

梁 源
杭州鹏远电子有限公司

摘要:
16-bit MCU MSP430 of Texas Instruments produced since 1996, its powerful function and well
performance have been known by all of people. Its Flash MCU is grow fast at present and its
memory and other resource have characteristics different from other MCU. TIMER_A is an
important module in MSP430 Flash. This article combines some detailed examples to explain
TIMER_A application in temperature measure, PWM generates, serial communcation. It has
some research value.

关键字 TIMER_A, Compare, Capture

美国德州仪器的 MSP430 十六位单片机产生于 1996 自该单片机问世以来 以其强大的功能和优良


的性能 逐步被中国人所认识 已经打入中国市场 但由于其产生的较晚 还有许多开发人员不知道或不
了解其独到功能 虽然许多单片机设计工程师对 MOTOROLA MICROCHIP INTEL 等单片机已比较熟
悉 但当 MSP430 单片机以全新的姿态出现后 以老的办法对 MSP430 单片机进行设计 是对这种单片机
资源的浪费

一 概述
目前 美国德州仪器所出的所有 FLASH 单片机都含有 TIMER_A 它是程序设计的核心 它由一个
十六位定时器和多路比较/捕获通道组成 每一个比较/捕获通道都可以以十六位定时器的定时功能为核心
进行单独的控制 具体可参照 MSP430X1XX Family User’s Guide 一书 同其它各类型单片机相比 MSP430
单片机的定时器 A 有以下特点
1 输入时钟可以有多种选择 可是是慢时钟 快时钟以及外部时钟
2 虽然没有自动重载时间常数功能 但产生的定时脉冲或 PWM 信号没有软件带来的误差
3 不仅能捕获外部时间发生的时间 还可锁定外部时间发生时的高低电平 给我们的使用带来了很
大的方便
4 有适用于串行通讯的功能特征

二 在产品设计中的应用
TIMER_A 有 4 种工作方式 停止 上升 连续 上升
Xin
下降方式 其中上升和上升下降方式需要和比较/捕获通道 0 Rref=10K
CCR0 共同使用 我们可以根据实际的需要 灵活选用 P2.0 Xout
Rsensor
当多个捕获/比较通道都以 16 位的定时时间作为时标时 P2.1

TIMER_A 定 时 器 采 用 连 续 方 式 的 比 较 多 这里以 P2.3 P1.0

MSP430F1121 单片机为例阐述几个应用的实例 0.1uF

1.测量阻性传感器 MSP430F1121

图1
在采用廉价的单片机进行产品设计时 用 RC 充放电原理测量已是很平常的事 然而 由于单片机比
较廉价 往往分辨率很低 MSP430 的 FLASH 型单片机中 采用 16 位的 TIMER_A 定时器 再加上内部
的比较器 至少能达到 10 位的 AD 测量精度
传统的办法采用充电的办法测量 为增加分别率 我们取内部的 0.25Vcc 作为阈值电压 采用放电的
办法可分别测出参考电阻 Rref 的放电时间 Tref,传感器电阻 Rsensor 的放电时间 Tsensor.则有下面的公式
Rsensor Tsensor Rref / Tref
下面的程序 定时器 A 的输入频率采用约 1MHz 左右的 DCO 由于电阻大小和放电时间成正比 对
测得的时间进行比较 就可以确定温度传感器的范围 如图 1 所示 当温度电阻大于参考电阻时 P1.0
输出低电平 反之 P1.0 输出高电平 如果我们温度传感器采用负温度系数的 103AT 参考电阻取 10K
那末当温度大于 25 度时 LED 亮 小于 25 度时 LED 灭 如果我们要测量具体的温度数值 可以在下面的
程序基础上增加温度传感器电阻值计算和查表程序就可以了
#include "msp430x11x1.h"
Ref equ 001h ; P2.0 接参考电阻
Sensor equ 002h ; P2.1 接温度传感器
ORG 0F000h ;程序开始
RESET mov #300h,SP ;初始化堆栈指针
Init_Sys mov #WDTPW+WDTHOLD,&WDTCTL ;停看门狗
SetupP1 bic.b #001h,&P1OUT ; P1.0 输出低电平
bis.b #001h,&P1DIR
SetupP2 bic.b #Sensor+Ref,&P2OUT ; 传感器 参考电阻输出低电平
bis.b #Sensor+Ref,&P2DIR
SetupCA mov.b #CARSEL+CAREF0+CAON,&CACTL1 ;比较器的参考电压 0.25Vcc
mov.b #P2CA0,&CACTL2 ; P2.3 比较器
SetupTA mov #TASSEL1+TACLR,&TACTL ; SMCLK 作为 TAR 输入
eint
Mainloop mov.b #Sensor,R14 ; R14 为放电引脚
call #Measure
mov R14,R15 ; R15 保存传感器放电时间
mov.b #Ref,R14 ; R14 为放电引脚
call #Measure
cmp R14,R15 ; R14 保存参考电阻的放电时间
jlo ON ; 比较是否温度大于 25 度
OFF bic.b #001h,&P1OUT ;小于等于 25 度,P1.0 输出低
jmp Mainloop
ON bis.b #001h,&P1OUT ;大于 25 度 P1.0 输出高
jmp Mainloop
Charge bis #MC1,&TACTL ; TIMER_A 工作在连续方式
bis.b #Ref,&P2OUT ;P2.0(Ref)输出高电平
bis.b #Ref,&P2DIR
mov #TAR,&CCR1 ;充电 5ms
add. #5000,&CCR1
mov #CCIE,&CCTL1 ;允许中断
bis #LPM0,SR ;等待中断唤醒
bic.b #Ref,&P2DIR ;P2.0( Ref)进入高阻态
bic.b #Ref,&P2OUT
Discharge mov #CM1+CCIS0+CAP+CCIE,&CCTL1 ;TIMER_A 工作于捕获方式
push &TAR ;保存现行的定时器数值
bis.b R14,&P2DIR ;开始放电
bis #LPM0,SR ;进入睡眠等待中断
mov &CCR1,R14 ;计算放电时间
sub @SP+,R14
bic.b #Sensor+Ref,&P2DIR ;进入高阻态
clr &CCTL1 ;禁止捕获
bic #MC1,&TACTL ;停定时器
ret
TAX_ISR add &TAIV,PC ;中断服务
reti ; CCR0 没有时钟源
CCR1_ISR bic #LPM0,0(SP) ;返回时退出低功耗
reti
ORG 0FFFEh ;中断向量地址
DW RESET
ORG 0FFF0h ;Timer_A 中断向量地址
DW TAX_ISR
END
Vcc
2.用作 PWM 控制
利用 TIMER_A 做成的 PWM 能用软件任意改变占空比和
周期 当不需要修改占空比和时间时 不需要利用中断维持 PWM P2.0 PWM 输出
输出 TIMER_A 能自动输出 PWM. - P2.1
P1.2

这里 TIMER_A 工作在上升方式 捕获/比较通道 CCR0 控


制 PWM 周期 捕获/比较通道 CCR1 控制 PWM 的占空比 CCR0
MSP430F1121
和 CCR1 均工作在比较模式 P2.0 接占空比寄存减按键 P2.1
接占空比寄存加按键(具体见图 2) 程序如下 图2
#include "msp430x11x1.h"
#define Duty_cycle R6 ;PWM 占空比控制寄存器
PWM_OUT equ 004h ;P1.2 口/ TA1 输出 PWM
Period equ 0ffh ;周期寄存器
RSEG CODE ;定义程序代码段
RESET mov #300h,SP ;定义堆栈指针
call #Init_Sys ;初始化程序
Mainloop bit.b #BIT0,&P2IN ;核对 P2.0 减按键是否按下
jz Next1
bit.b #BIT1,&P2IN ;核对 P2.1 加按键是否按下
jz Next2
jmp Mainloop ;循环等待键按下
Next1 cmp #0,Duty_cycle ;核对 Duty_cycle 是否为 0
jz Mainloop ;如果为 0,则循环等待
dec Duty_cycle ;PWM 占空比减一个步长
jmp SendPWM
Next2 cmp #0ffh,Duty_cycle ;核对步长是否达到最大值
jz Mainloop ;如果为最大值则不加一个步长
inc Duty_cycle ;PWM 占空比增加一个步长
SendPWM mov Duty_cycle,&CCR1 ;送 PWM 输出
call #Delay ;键盘防抖动延时
jmp Mainloop ;主程序继续循环
Init_Sys ;模块和寄存器初始化子程序
StopWDT mov #WDTPW+WDTHOLD,&WDTCTL ;停看门狗
SetupBC mov.b #XTOFF+RSEL2+RSEL1+RSEL0,&BCSCTL1
mov.b #0ffh,&DCOCTL ;DCO 选用最高频率作为主频.
SetupP1 mov.b #0,&P1OUT ;P1OUT 置 0
bis.b #PWM_OUT,&P1SEL ;P1.2/TA1 做 PWM 输出
bis.b #0ffh,P1DIR
SetupP2 mov.b #03ch,&P2DIR ;P2.0,P2.1 按键输入
mov #Period,&CCR0 ;PWM 周期
mov #0,&CCR1 ;PWM 输出初始值
mov #OUTMOD_7,&CCTL1 ; TA1 输出方式 7,复位/置位
SetupTA mov #TASSEL1+MC0,&TACTL ;TimerA 升方式,SMCLK 为 TACLK
mov #0,Duty_cycle ;复位占空比寄存器
ret ;子程序返回
Delay push #03FFFh ;软件延时
L1 dec 0(SP)
jnz L1
incd SP
ret
COMMON INTVEC ;中断向量段
ORG RESET_VECTOR ;中断向量起始地址
RESET_VEC DW RESET ;复位入口
END
3.用作串行通讯
如图 3 所示 晶振采用 32768Hz,用 TIMER_A 产生 2400 波特率 并收
32768Hz
发数据 支持 232 通讯 P2.2 作为接收数据口 P1.1 为发送数据口 数据 Xin
格式采用 1 个起始位 8 个数据位 1 个停止位 没有奇偶校验位 利用定
Xout
时器 A 具有在达到比较时间后可对端口置位 输出方式 1 和复位的特性 输
出方式 5 具体程序如下 发送 TXD
P1.1
#include "msp430x11x1.h"
接收 RXD
P2.1
RXD equ 004h ;P2.2 作为数据接收口 RXD
MSP430F1121
TXD equ 002h ;P1.1 作为发送数据口 TXD
图3
RXTXData equ 0200h ;收发数据缓冲器
BitCnt equ 0202h ;位计数器
Bitime_5 equ 6 ;0.5 数据位长度
Bitime equ 14 ;位长度 427us 约为 2341 baud
ORG 0F000h ;程序开始
RESET mov.w #300h,SP ;初始化堆栈指针
call #Init_Sys ;初始化系统模块
Mainloop call #RX_Ready ;准备接收 1 个字节数据
Bis #LPM3,SR ;进入低功耗,直到有接收数据
Call #TX_Byte ;将接收到的数据再发送出去
Jmp Mainloop ;程序不断循环
Init_Sys ;初始化程序
StopWDT mov #WDTPW+WDTHOLD,&WDTCTL ; 停止看门狗
SetupTA mov #TASSEL0+MC1,&TACTL ;输入 ACLK,连续工作方式
SetupC0 mov #OUT,&CCTL0 ; TXD=1,发送空闲
SetupP1_2 bis.b #TXD,&P1SEL ; P1.1/TA0 为发送 TXD
bis.b #TXD,&P1DIR
bis.b #RXD,&P2SEL ; P2.2/TA0 为接收 RXD
eint
ret
TX_Byte ;发送一个字节数据
mov &TAR,&CCR0 ;确定第一位的时间长度
add #Bitime,&CCR0
bis #0100h, &RXTXData ; 数据中增加起始和停止位
rla &RXTXData
mov #10,&BitCnt ;8 个数据位+1 个起始位+1 个停止位
mov #OUTMOD0+CCIE,&CCTL0 ;输出方式 1,TXD = 1,仍未发送数据
TX_Wait bit #CCIE,&CCTL0 ;等待数据全部发送完毕
Jnz TX_Wait
ret
RX_Ready mov #08,&BitCnt ;装载位计数器
SetupRX mov #CCIS0+OUTMOD0+CM1+CAP+CCIE,&CCTL0 ; 下降沿捕获
ret
TA0_ISR ;CCR0 数据收发中断服务程序
add #Bitime,&CCR0 ;发送下一位数据的时间
bit #CCIS0,&CCTL0 ;比较方式吗
jnz UART_RX ;捕获方式 转接收程序
UART_TX bic #OUTMOD2,&CCTL0 ;输出方式 2,中断输出 1
rra &RXTXData ;最低有效位移入 C
jc TX_Test ; Jump --> bit = 1
TX_Space bis #OUTMOD2,&CCTL0 ;输出方式 5,中断输出 0
TX_Test dec &BitCnt ;所有的数据位都收发完毕
jnz TX_Next ;没有,准备收发下一位
bic #CCIE,&CCTL0 ;所有的位都收发完毕 关闭 TIMER_A 中断
TX_Next reti
UART_RX bit #CAP,&CCTL0 ;捕获方式
jz RX_Bit ;不是 转读数据位
RX_Edge bic #CAP,&CCTL0 ; 捕获方式 转比较方式
add #Bitime_5,&CCR0 ;1.5 个数据位后为真正的数据
reti
RX_Bit bit #SCCI,&CCTL0 ;得到接收到的数据位
rrc.b &RXTXData ;保存接收到的数据位
RX_Test dec &BitCnt ;所有的位都接收到了?
jnz RX_Next ;没有 接收下一位
RX_Comp bic #CCIE,&CCTL0 ;接收完毕 禁止 CCR0 中断
mov #GIE,0(SP) ;程序返回时允许总中断
RX_Next reti
ORG 0FFFEh ;复位入口地址
DW RESET
ORG 0FFF2h ;Timer_A0 向量地址
DW TA0_ISR
END

三 结束语
MSP430 单片机的 TIMER_A 结构复杂,功能强大,它给开发人员提供了较多的灵活的选择余地.上面仅
是少数的几个例子,开发人员只要深入理解了 TIMER_A 的原理,就可以根据自己的产品的实际情况 发现
更多的应用方法
参考文献

1. MSP430X1XX Family User’s Guide TEXAS INSTRUMENTS.

Das könnte Ihnen auch gefallen