MSP430超声波测距
MSP430超声波测距
摘要
本应用报告描述了一种采用
MSP430F413超低功耗微控制器的基于超声波的距离测量系统系统向测量目标发射超声波脉冲然后接收相应的反
射波MSP430集成的模拟比较器A用于检测到达系统的回声
超声波脉
冲从系统到目标然后反射回系统所需的时间可以由
MSP430精确的测量
假设声波室温下在空气中的速度为1100英尺/秒MSP430计算系统与目标
间的距离并采用内部集成的LCD驱动器将其显示在一两位的静态液晶显示
器上距离以英寸为单位显示精度为1英寸本系统能够测量的最小距
离是8英寸因为受到发射器传感器稳定时间能够测量的最大距离为99
英寸回声的强度取决于反射物的材质形状和尺寸地毯之类的吸音材
这类目标最大测量料或者反射面积小于两平方英尺的物体反射能力很弱
范围相对较小如果系统接收到的回声的强度很小以至于比较器A无法检
测到就超出了系统的测量范围
这时系统将显示错误信息E”
内 容
1 工作原理……………………………………………………………………2
2 电路描述……………………………………………………………………2
3 软件Ultrasonic.s43…………………………………………………………6
3.1 设备初始化子程序………………………….………………………… 6
3.2 主循环程序…………………………………………………….……… 6
3.3 计算子程序.……………………………………………….……………7
3.4 BT_ISR子程序…………………………………………………………7
3.5 显示子程序…………………………………………………………….7
3.6 延时子程序.……………………………………………………………7
4 结论………………………………………………………..……………….7
5 参考文献…………………………………………………..……………….8
A 程序代码………………………………………………………..………….9
图表清单
1 电路原理图………………………………..…….………………………….4
2 发射器40KHz脉冲波形轨迹图…………..….……………………………5
3 一个测量周期的波形轨迹图……………………………………………….5
1 工作原理
本应用基于声波的反射
声波在其传播的介质中被定义为纵波当声波受到尺寸大于其波长的目标物阻挡时就会发生反射
果声波在介质中传播的速度是已知的
后返回声源的时间反射波称为回声
如而且测量到声波从声源到达目标然这就是从声源到目标的距离就可以精确地计算出来
本应用的测量原理这里声波传播的介质就是空气采用不可见的超声波
假设室温下声波在空气中的传播速度是1100英尺/秒测量到的声波从
声源到达目标然后返回声源的时间是t秒距离d可以由下列公式计算
d=110012t英寸
因为声波经过的距离是声源与目标之间距离的两倍声源与目标之间的
实际距离应该为d/2
2 电路描述
本应用中中用来发射和接收超声波的装置是40KHz的陶瓷超声波传感
器MSP430采用晶体振荡器产生的一个40KHz方波信号的12周期脉冲序
列驱动发射传感器接收传感器则接收回声MSP430的定时器A被定义
为40KHz晶振频率计数器因此时间测量精度为25微秒这对本应用来说
足够用了测量的时间基准是非常稳定的因为它由石英晶体振荡器产生
接收传感器收到的回声由运算放大器放大后送到比较器A的输入端比较
器A检测到其输入端的回声信号后触发定时器A计数值的捕捉来捕获比较
寄存器CCR1的值捕捉在回声到达系统的瞬间进行捕获的计数值就是
超声波脉冲序列从系统出发到达目标然后返回系统的时间从系统到目标
的距离用英寸表示就可由MSP430用测得的时间算出并显示在两位静
态液晶显示器上显示更新后MSP430马上转入LPM3睡眠模式来降低功
耗基本定时器1被编程用来每205毫秒中断MSP430一次
基本定时器1
的中断信号唤醒MSP430并重复测量周期更新显示 图1显示的是本应用的电路原理图其中MSP430F413U1是系统的核心部分参考文献[1]是这个芯片的技术资料LCD1是一由MSP430F413
内部集成的LCD驱动器驱动的两位低压静态液晶显示器R03连接到Vss
R13和R23悬空将LCD外围电路设置为静态LCD驱动模式这里方便
的选用了一个40KHz的低频晶振与本应用中采用的超声波传感器的谐振
频率相匹配R12作为复位线的上拉电阻内部集成的掉电保护电路可以预防掉电情况C9位于靠近芯片电源线的位置
提供与MSP430
的电源耦
合14脚的接插件J1提供JTAG
接口与MSP430
相连可使用MSP430
FLASH仿真工具进行在线调试和编程LED1用来指示测量周期端口引
脚P1.5被定义为输出超声波发射器所需要的40KHz方波ACLK信号
传感器的输出驱动电路直接由9V
电池供电并提供18Vpp驱动超声波发
射器18Vpp是通过一个二进制非门CD4049(U4)桥电路实现的参考文献
[6]是它的技术资料其中一个非门用来为驱动器的一侧提供180度的相移
信号另一侧由相内信号驱动这种结构使输出端的电压提高了一倍为
发射传感器提供了18Vpp电压两个门并联连接以便每一侧能够为传感器
提供足够的驱动电流电容C6C7阻断了到传感器的直流通路因为
CD4049工作于9V而MSP430工作于Vcc 3.6VMSP430和输出驱动器之
间的逻辑电平是不匹配的双极性晶体管Q1就作为这两种逻辑电平之间的
转换器
运算放大器
U3是TI公司的高速运算放大器TLV2771参考文献[5]是它的技术资料这个放大器具有高增益带宽并在40KHz时提供充分的高增益运算放大器连接成反相放大器构造R7R5设置增益为55C5提供
高频滚降R3R4偏置非反相输入端为运算放大器的单输入工作提供一个虚拟中间值放大后的超声波信号在这个虚拟中间值上下波动传感器RX1的高Q值提供选择性并丢弃除了40KHz之外的频率运算放大器的输
出端连接到比较器A的输入端CA0即端口引脚P1.6电平内部选择为
0.5Vcc比较器A的参考当接收到回声时电压高于参考电平从而触发比
较器A的输出CAOUT调整R3可以得到需要的灵敏度并优化测量范围
MSP430和超声波信号放大器电路由
9V电池经TI公司的LDO芯片
TPS77001调制后的3.6V电压供电参考文献[4]是它的技术资料电阻R1
和R2调整稳压器输出电压为3.6VC1和C2是推荐使用的稳压器的正常
工作的供电电容发射器的驱动电路是由9V电池直接供电的开关S1是本应用的电源开关
图2显示的是12周期的40KHz脉冲序列的波形轨迹图我们注意到
19.2V的峰峰电压波动方波顶部的正弦响铃波是由于传感器内部的谐振
引起的
图3显示的是一个完整测量周期的波形轨迹轨迹1显示的是发射传感
器输出端的12周期的40KHz脉冲序列轨迹2显示的是接收传感器输出经
运算放大器放大后在引脚1上的输出轨迹上的第一个脉冲序列信号代表
直接从发射器上收到的信号被MSP430忽略接下去的脉冲序列代表目
标反射的回声被MSP430用于测量轨迹3显示的是MSP430测得的时
间间隔的宽度这个宽度代表该脉冲序列从系统到达目标再返回所花的时
间显然它取决于所测量的距离
图1 电路原理图
图2发射器40KHz脉冲波形轨迹图
图3一个测量周期的波形轨迹图
3 软件Ultrasonic.s43
31设备初始化子程序 这个子程序初始化及设置外围电路首先关闭看门狗电路采用一个软
件延时让低频晶振稳定将FLL+倍频器设置为64来产生
2.56MHz的MCLK
频率P1.0设置为输出控制
LED未使用的端口引脚设置为输出端口引
脚P1.5设置为输出带缓冲的40KHz ACLK频率基本定时器1启动并设置
为提供一个150Hz LCD频率并每205毫秒中断CPU开始一次测量周期比
较器A内部参考电平设置为0.5VccCAPD位设置为关闭比较器输入引脚
的输入缓冲LCD模块打开并在本应用中设置为静态模式驱动两位静态LCDLCD存储器清零LCD的初始显示为00基本定时器1中断和全局中断打开
3这样基本定时器1就可以周期性中断CPU 2主循环程序 主循环用存储在DIGITS缓冲区内的值更新液晶显示器然后将MSP430置于LPM3睡眠模式MSP430
维持在睡眠模式直至基本定时器1中断发生及其BT_ISR返回活动模式这时就开始一个测量周期定时器A设置为
16位增计数模式选择ALCK作为其时钟源CCR1设置为比较模式初
始值为12以便在P1.5引脚上输出12个周期的40KHz的脉冲序列接下去
是一个36ACLK周期的延时保证输出传感器稳定这是通过设置CCR1
为初始值36的比较模式实现的在CCR1处于比较等待状态时MSP430
保持LPM0状态
然后系统切换到通过接收传感器接收回声
声比较器A被设置为等待回在回声到达的瞬间提供一个捕获中断定时器A计数值从捕获比较
寄存器CCR1中得到这个值就是超声波序列从发射传感器到达目标然后
返回这段距离所需的时间计数值加上48加以调整以补偿12个周期脉
冲序列和36个周期发射传感器稳定延时的损失CCR1调整后的值就是脉
冲序列发出时刻到回声到达系统这段时间的准确值程序计算实际距离单位为英寸
并返回结果然后就调用计算子回声如果结果超出范围
信号就接收不到比较器A也不会产生捕获中断MSP430保持LPM状态
知道下一个基本定时器1中断将其唤醒通过检测其CCTL1控制寄存器中
的CAIFG位来确认回声没有接收到为了反映这种情况在DIGITS中存储值0XBE在LCD上显示E程序最终返回到主程序更新LCD显示
并返回LPM3睡眠模式下一个基本定时器1中断将MSP430唤醒至活动状态重复程序执行过程
33计算子程序
计算子程序负责本应用中的数学计算CCR1中调整后的16位数值存储
为变量Result这个值就代表超声波序列从系统到目标然后返回系统这段距
离所需的时间因为定时器A计数间隔为25
微秒对应的时间值为Result
25微秒假设室温下声音的速度为1100英寸/秒可以看出从定时器A
计数值得到的Result每6个值对应于1英寸的距离
为了采用MSP430现有的整数计算达到要求的精度16位的Result首
先乘以100然后除以616位16位的乘法是由子程序Mu100完成的32
位的结果存储在变量htX100_msw和htX100_lsw中然后除以6并将结果
保存在变量DIGITS中DIGITS中的值是二进制格式的由hex2bcd子程
序将这个二进制值转换成BCD码然后丢弃BCD码的最后两个数字来补
偿前面所作的与100
的乘法两位的结果值返回到变量DIGITS
中
34BT_ISR子程序
基本定时器1
中断子程序BT_ISR对保存在堆栈中的状态寄存器SR中的位进行操作以使MSP430能够返回活动状态继续执行主循环中LPM3
之后的程序代码
3 5显示子程序
这个子程序用变量DIGITS的值更新两位静态LCD显示静态显示器的
段值存储在查寻表LCD_Tab中通过将DIGITS中的数字与LCD_Tab查寻表中的位置相关联
3LCD存储器就可以装入所需要的段值 6延时子程序
这个子程序产生一个16位的软件延时由于软件减计数的变量处于堆
栈的顶部TOS寄存器不会受到影响延时时间到后子程序返回前堆
栈指针
SP恢复到原始值
4 结论
内部集成的模拟比较器A带硬件捕获/比较寄存器的16位定时器A
基本定时器1LCD驱动电路简化了超声波测距应用的设计提供了一种
单片系统解决方案本应用在15英寸距离测量中的平均功耗为1.3毫安
这包括LDO U2运算放大器U3和CMOS二进制反相器U4的静态电流
运算放大器自身就由1毫安的静态电流电路其他部分的功耗为300微安
LED工作时需5毫安电流MSP430在LCD连续工作时需2.1微安的平均
电流这是利用MSP430的低功耗特性实现的MSP430大部分时间处于
LPM3睡眠状态这时用到的CPU资源仅为5.6%
因为声波的速度与温度有关测量值在非室温下准确度会下降在本应用中引入一个简单的基于热电阻的温度测量和距离补偿
大的温度范围内精确测量如果需要可以使系统在很测得的距离和温度数据可以存储在
FLASH存储器中加上额外增益和使用多态LCD来读出尽可能多的位数
也可以增大测量范围
5 参考文献
1 MSP430x41x混合信号微控制器技术手册SLA340
2 MSP430x4xx系列用户手册SLAU056
3 MSP430系列混合信号微控制器用户报告SLAA024
4 TPS770xx超低功耗LDO线性稳压器技术手册SLVS210
5 TLV277x系列高速运算放大器技术手册SLOS209
6 CD4049UB,CMOS二进制缓冲反相器技术手册SCHS046A
附录A 程序代码
; THIS PROGRAM IS PROVIDED “AS IS”, TI MAKES NO WARRANTIES OR
; REPRESENTATIONS, EITHER EXPRESS, IMPLIED OR STATUTORY,
; INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
; FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
; COMPLETENESS OF RESPONSES, RESULTS AND LACK OF NEGLIGENCE.
; TI DISCLAIMS ANY WARRANTY OF TITLE, QUIET ENJOYMENT, QUIET
; POSSESSION, AND NON朓NFRINGEMENT OF ANY THIRD PARTY
; INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE PROGRAM OR
; YOUR USE OF THE PROGRAM.
;
; IN NO EVENT SHALL TI BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
; CONSEQUENTIAL OR INDIRECT DAMAGES, HOWEVER CAUSED, ON ANY
; THEORY OF LIABILITY AND WHETHER OR NOT TI HAS BEEN ADVISED
; OF THE POSSIBILITY OF SUCH DAMAGES, ARISING IN ANY WAY OUT
; OF THIS AGREEMENT, THE PROGRAM, OR YOUR USE OF THE PROGRAM.
; EXCLUDED DAMAGES INCLUDE, BUT ARE NOT LIMITED TO, COST OF
; REMOVAL OR REINSTALLATION, COMPUTER TIME, LABOR COSTS, LOSS
; OF GOODWILL, LOSS OF PROFITS, LOSS OF SAVINGS, OR LOSS OF
; USE OR INTERRUPTION OF BUSINESS. IN NO EVENT WILL TI扴
; AGGREGATE LIABILITY UNDER THIS AGREEMENT OR ARISING OUT OF
; YOUR USE OF THE PROGRAM EXCEED FIVE HUNDRED DOLLARS
; (U.S.$500).
;
; Unless otherwise stated, the Program written and copyrighted
; by Texas Instruments is distributed as 攆reeware? You may,
; only under TI抯 copyright in the Program, use and modify the
; Program without any charge or restriction. You may
; distribute to third parties, provided that you transfer a
; copy of this license to the third party and the third party
; agrees to these terms by its first use of the Program. You
; must reproduce the copyright notice and any other legend of
; ownership on each copy or partial copy, of the Program.
; You acknowledge and agree that the Program contains
; copyrighted material, trade secrets and other TI proprietary
; information and is protected by copyright laws,
; international copyright treaties, and trade secret laws, as
; well as other intellectual property laws. To protect TI’s
; rights in the Program, you agree not to decompile, reverse
; engineer, disassemble or otherwise translate any object code
; versions of the Program to a humanreadable form. You agree
; that in no event will you alter, remove or destroy any
; copyright notice included in the Program. TI reserves all
; rights not specifically granted under this license. Except
; as specifically provided herein, nothing in this agreement
; shall be construed as conferring by implication, estoppel,
; or otherwise, upon you, any license or other right under any
; TI patents, copyrights or trade secrets.
;
; You may not use the Program in nonTI devices.
;
;************************************************************
NAME ULTRASONIC_DISTANCE_MEASUREMENT
;AUTHOR Murugavel Raju
; MSP430 Applications
; Texas Instruments Inc.
; Feb 2001
#include “msp430x41x.h”; Standard Equations
;
;************************************************************
; MSP430F413 Ultrasonic Distance Measurement Demonstration Program
;
;*************************************************************
;Register definitions
;*************************************************************
#define DIGITS R11
#define Result R10
#define IRBT R9
#define IROP1 R4
#define IROP2L R5
#define IROP2M R6
#define IRACL R7
#define IRACM R8
;************************************************************
;Variables definition
;************************************************************
RSEG UDATA0
htX100_msw: DS 2 ; word variable stored in RAM 200h & 201h
Ultrasonic Distance Measurement With the MSP430 10
mov.w #CCIE,&CCTL1 ; Compare mode,interrupt
bis.w #LPM0,SR ; Wait for CCR1 interrupt
htX100_lsw: DS 2 ; 202h & 203h
;*************************************************************
RSEG CSTACK ; Directive to begin stack segment
DS 0
RSEG CODE ; Directive to begin code segment
RESET mov.w #SFE(CSTACK),SP ; Define stack pointer
call #Init_Device ; Initialize device
mov.w #0,DIGITS ; Initialize DIGITS to ??
Mainloop
bic.b #CAON,&CACTL1 ; Comparator_A OFF
call #Display ; Display Data on LCD
bis.w #LPM3,SR ; Wait in LPM3
;***************Start Ultrasonic Bursts and take measurements
clr.w &CCTL1 ; Disable CCTL1
clr.w &TACTL ; Disable timer_A
bis.b #BIT0,&P1OUT ; LED ON
SetupTimerA mov.w #TASSEL0+TACLR+MC1,&TACTL
; TACLK = ACLK, 16 bit up mode
bis.b #BIT5,&P1SEL ; ACLK o/p on P1.5
mov.w #12,&CCR1 ; 12 cycle 40KHz burst
mov.w #CCIE,&CCTL1 ; Compare mode,interrupt
bis.w #LPM0,SR ; Wait for CCR1 interrupt
bic.b #BIT5,&P1SEL ; ACLK o/p on P1.5 OFF
TimerCLR bis.w #TACLR,&TACTL
mov.w #36,&CCR1 ; Delay for transducer to settle
bis.b #CAON,&CACTL1 ; Comparator_A ON
bic.b #CAIFG,&CACTL1 ; Enable Comparator_A interrupt flag
mov.w #CM0+CCIS0+SCS+CAP+CCIE,&CCTL1
; Pos edge, CCIB,Cap,interrupt
push &TAR ; TOS = TAR at Start of measurement
bis.w #LPM0,SR ; Wait for CCR1 interrupt (Echo)
clr.w &CCTL1 ; Disable CCTL1
bic.b #BIT0,&P1OUT ; LED OFF
bit.b #CAIFG,&CACTL1 ; Check for Echo not received
jz Next ;’out of range’condition
mov.w &CCR1,Result ; Result = TAR (CCR1) at EOC
sub.w @SP+,Result ; Result = time taken
add.w #48,Result ; compensate 12Clks for the burst
; transmission time + 36Clks delay
;****************** Measurement Done *************************
call #Math_calc ; Call Math subroutine
swpb DIGITS ; Shift left by two digits for /100
jmp Mainloop ; next measurement cycle
Next mov.w #0beh,DIGITS ; No echo received display 扙?error
jmp Mainloop
;************************************************************
Init_Device ; Initialize MSP430x41x
;************************************************************
mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
bis.b #030h,&FLL_CTL0 ; Turn on internal load capacitors
; for the XTAL to start oscillation
call #Delay ; Delay for oscillator to stabilize
mov.b #03fh,&SCFQCTL ; MCLK = 40KhzX64 = 2.56Mhz
call #Delay ; Delay for FLL to stabilize
SetupP1 mov.b #000h,&P1OUT ; Clear P1 output register
bis.b #0bfh,&P1DIR ; Unused pins as o/p抯
bis.b #040h,&P1SEL ; Comp_A + i/p function
SetupP2 mov.b #000h,&P2OUT ; Clear P2 output register
bis.b #0ffh,&P2DIR ; Unused pins as o/p抯
SetupP6 mov.b #000h,&P6OUT ; Clear P6 output register
bis.b #0ffh,&P6DIR ; Unused pins as o/p抯
SetupBT mov.b #BTFRFQ0+BTFRFQ1+BTIP2+BTDIV,&BTCTL
; Enable BT with 150Hz LCD freq.
; and 205 millisecond interrupt
SetupCA mov.b #CAPD6,&CAPD ; o/p buffer disable for comp i/p
mov.b #P2CA0,&CACTL2 ; P1.6 to Comp + input
mov.b #CARSEL+CAREF1+CAON,&CACTL1
Ultrasonic Distance Measurement With the MSP430 12
bis.b #BTIE,&IE2 ; Enable Basic Timer interrupt
SLAA136A
; Comp_A ON, 0.5Vcc int. reference
SetupLCD bis.b #LCDON+LCDSON+LCDSG0_7,LCDCTL
; LCD module ON and in static mode
ClearLCD mov #15,R15 ; 15 LCD mem locations to clear
mov.b #LCDMEM,R14
Clear1 mov.b #0,0(R14) ; Write zeros in LCD RAM locations
inc.b R14
dec R15 ; All LCD mem clear?
jnz Clear1 ; More LCD mem to clear go
eint ; Enable interrupts
ret
;*************************************************************
BT_ISR ; Basic Timer ISR, CPU returns
; to active mode on RETI
;*************************************************************
bic #LPM3,0(SP) ; Clear LPM3 bits on TOS
reti ; on return from interrupt
;*************************************************************
TAX_ISR; Common ISR for CCR1? and overflow
;************************************************************
add.w &TAIV,PC ; Add TA interrupt offset to PC
reti ; CCR0 ?no source
jmp CCR1_ISR ; CCR1
reti ; CCR2
reti ; CCR3
reti ; CCR4
TA_over reti ; Timer_A overflow
CCR1_ISR bic.w #CCIFG,&CCTL1
bic.w #LPM0,0(SP) ; Exit LPM0 on reti
reti ;
;************************************************************
Display ;Subroutine to Display values DIGIT1 & DIGIT2
;CPU Registers used R15, R14, R13 and R12, not saved
;************************************************************
mov.w #LCDM1,R15 ; R15 points to first LCD location
mov.b DIGITS,R14 ; LSD value moved to R14
OutLCD mov.b R14,R13 ; Copy value in R14 to R13
rra.b R13 ; Right Shift
rra.b R13 ; four times to
rra.b R13 ; swap
rra.b R13 ; nibbles
and.b #0Fh,R14 ; low nibble now in R14
and.b #0Fh,R13 ; high nibble now in R13
mov.b LCD_Tab(R14),R12 ; Low nibble to LCD digit 1
mov.b R12,0(R15) ; Low nibble segments a & b to LCD
rra.w R12
inc.b R15
mov.b R12,0(R15) ; Low nibble segments c & d to LCD
rra.w R12
inc.b R15
mov.b R12,0(R15) ; Low nibble segments e & f to LCD
rra.w R12
inc.b R15
mov.b R12,0(R15) ; Low nibble segments g & h to LCD
rra.w R12
inc.b R15
mov.b LCD_Tab(R13),R12 ; High nibble to LCD digit 2
mov.b R12,0(R15) ; High nibble segments a & b to LCD
rra.w R12
inc.b R15
mov.b R12,0(R15) ; High nibble segments c & d to LCD
rra.w R12
inc.b R15
mov.b R12,0(R15) ; High nibble segments e & f to LCD
rra.w R12
inc.b R15
mov.b R12,0(R15) ; High nibble segments g & h to LCD
rra.w R12
ret
;*************************************************************
; LCD Type Definition
;*************************************************************
;Segments definition
a equ 001h
b equ 010h
c equ 002h
d equ 020h
e equ 004h
f equ 040h
g equ 008h
h equ 080h
Blank equ 000h
LCD_Tab db a+b+c+d+e+f ; Displays ??
db b+c ; Displays ??
db a+b+d+e+g ; Displays ??
db a+b+c+d+g ; Displays ??
db b+c+f+g ; Displays ??
db a+c+d+f+g ; Displays ??
db a+c+d+e+f+g ; Displays ??
db a+b+c ; Displays ??
db a+b+c+d+e+f+g ; Displays ??
db a+b+c+d+f+g ; Displays ??
db a+b+c+e+f+g ; Displays 擜?
db Blank ; Displays Blank
db a+d+e+f ; Displays 擟?
db b+c+d+e+g ; Displays 擠?d
db a+d+e+f+g ; Displays 擡?
db a+e+f+g ; Displays 擣?
;*************************************************************
Delay; Software delay
;************************************************************
push #0FFFFh ; Delay to TOS
DL1 dec.w 0(SP) ; Decrement TOS
jnz DL1 ; Delay over?
incd SP ; Clean TOS
ret ; Return from subroutine
;*************************************************************
Math_calc; calculation subroutine
;*************************************************************
mov.w #0h, DIGITS ; Initialize DIGIT to 0
cmp.w #0h, Result ; Check if Result count=0
jeq calc_over ; Exit if 0
call #Mul100 ; Multiply Result count by 100
call #Divide ; Divide the result with #06d
call #Hex2bcd ; Convert 16bit binary to BCD number
; Result xx.xx
calc_over ret ; Return from subroutine
;*************************************************************
Mul100 ;subroutine for multiplying Result with 100d
;inputs Result 16bit and constant 64h (100d) 16bit
;output 32bit htX100_msw & htX100_lsw
;*************************************************************
mov.w #100,IROP1 ; Load IROP1 with 100 (multiplier)
mpyu clr.w htX100_lsw ; Clear buffer for least
; Significant word
clr.w htX100_msw ; Clear buffer for most
; Significant word
macu clr.w IROP2M ; Clear multiplier high word
L$002 bit.w #1,IROP1 ; Test actual bit
jz L$01 ; If 0: do nothing
add.w Result,htX100_lsw ; If 1: Add multiplier to Result
addc.w IROP2M,htX100_msw ;
L$01 rla.w Result ; Multiplier X 2
rlc.w IROP2M ;
rrc.w IROP1 ; Next bit to test
jnz L$002 ; If bit in carry : finished
ret
;*************************************************************
Divide ;Subroutine for 32/16 bits division
;inputs 32bit htX100_msw & htX100_lsw and #06 16bit, output DIGIT
16bit
;************************************************************
clr.w DIGITS ; Clear buffer to hold new Result
mov.w #17,IRBT ; Initialize loop counter
div1 cmp.w #06,htX100_msw ; Compare divisor with dividend high
word
jlo div2 ; If less : jump to div2
sub.w #06,htX100_msw ; Subtract 6 from high word
div2 rlc.w DIGITS ; Rotate result left through carry 1
bit
jc div4 ; If carry set: finished
dec.w IRBT ; Decrement bit counter
jz div3 ; If counter = 0 : finished
rla.w htX100_lsw ; Dividend X 2
rlc.w htX100_msw ;
jnc div1 ; If carry not set jump to step div1
sub.w #06,htX100_msw ; Subtract 6 from high word
setc ; Set carry
jmp div2 ; Jump to repeat
div3 clrc ; Clear carry
div4 ret ; Return from subroutine
;************************************************************
Hex2bcd ;Subroutine for converting 16bit hexadecimal value to BCD value
;input in DIGITS 16bit hexadecimal, output in DIGITS 16bit BCD
;*************************************************************
mov #16,r9 ; R9 no of bits
clr r8 ; Clear R8
clr r7 ; Clear R7
L$1 rla DIGITS ; Rotate left arithmetic DIGITS
dadd r7,r7 ; Add source and carry decimally
dadd r8,r8 ; to destination
dec r9 ; Decrement bit counter
jnz L$1 ; Is 16 bits over ?
mov r7,DIGITS ; Result in DIGITS
ret ; Return from subroutine
;*************************************************************
COMMON INTVEC ; MSP430x41x Interrupt vectors
;*************************************************************
ORG BASICTIMER_VECTOR
BT_VEC DW BT_ISR ; Basic Timer Vector
ORG TIMERA1_VECTOR ; Timer_AX Vector
TIMA_VEC DW TAX_ISR ;
ORG RESET_VECTOR
RESET_VEC DW RESET ; POR, ext. Reset, Watchdog
;************************************************************
END
郑 重 申 明
利尔达单片机技术有限公司 杭州市文二路199号文欣大厦3楼A座
德州仪器公司和它的分支机构保留在任何时候对其产品和服务进行更正声明修改增加完善和其他变化以及终止产品和服务的权利无须另外用户应当在订货前获取最新消息并验证获得信息是完整和当前的
所有产品的销售以订单确认时TI
的货期和销售状况为准 TI根据销售时说明书的标准授权对其硬件产品履行授权TI在认为有
必要支持该授权的范围内采取测试和其他质量控制技术
求
对每一产品所有参数进行测试是不必要的
除非政府委托要
TI
没有责任提供应用帮助或者用户产品设计用户使用TI元器件时自
行对他们的产品和应用负责
供足够的设计和操作安全措施为了降低用户产品和应用的风险 用户应提
TI不对任何其产品或服务中使用到的与联合机器或过程相关的知识
产权比如
TI的专利
版权
源代码等不论是明确的或是暗含的许可证
进行授权TI印刷的关于第三方产品或服务的信息不代表TI对使用这些产
品和服务的许可授权或者签注使用这些信息也许需要得到第三方的专
利许可或第三方的其他知识产权许可或者获得TI的专利和知识产权许可
TI技术手册和技术资料内信息的复制品仅在没有改变的情况下才被允
许而且不得对其中的附属的授权条件限制和声明进行删减任何对
复制品信息的变动都是不公正的和欺骗性的商业行为TI不会对这些改动
后的文件负责
传售TI产品或服务时如果超出了TI公司对该产品和服务的参数的
声明就侵犯了与产品或服务相关的明确的或者暗含的授权
是一种不公正的欺骗性的商业行为TI不对此类声明负责