在线情况
楼主
  • 头像
  • 级别
  • 门派
  • 职务总版主
  • 声望+9
  • 财富5
  • 积分3065
  • 经验390701
  • 文章6744
  • 注册2006-03-07
MSP430F413制作超声波测距仪[玩家推荐]
    最近有不少网友们在QQ群讨论起关于超声波距离测量的话题,本人听了此话题以后也感到有所触动。在此,本人推荐一个超声波距离测量DIY活动给广大的MSP430爱好者,希望有兴趣的朋友们一起来参与此次DIY活动。本次活动以公开的形式推荐给大家,所有的电路原理图、电路原理、超声波距离测量原理、计算公式、源程序代码都将一一公开给MSP430爱好者,因为这是TI官方一个典型范例,相信大家参与后会有很大的收获。
   因为此资料是TI官方一个典型范例,同时由利尔达公司将原理注释翻译成中文。所以这是一份较为实用和符合大众的制作资料,希望有兴趣的能一起参加。
  摘要
   本应用报告描述了一种采用MSP430F413 超低功耗微控制器的基于超声波的距离测量系统。系统向测量目标发射超声波脉冲然后接收相应的反射波。MSP430 集成的模拟比较器A 用于检测到达系统的回声。超声波脉冲从系统到目标然后反射回系统所需的时间可以由MSP430精确的测量。假设声波室温下在空气中的速度为1100 英尺/秒,MSP430 计算系统与目标间的距离并采用内部集成的LCD 驱动器将其显示在一两位的静态液晶显示器上。距离以英寸为单位显示,精度为1 英寸本系统能够测量的最小距离是8 英寸,因为受到发射器传感器稳定时间;能够测量的最大距离为99英寸,回声的强度取决于反射物的材质形状、和尺寸。地毯之类的吸音材料或者反射面积小于两平方英尺的物体反射能力很弱,这类目标最大测量范围相对较小。如果系统接收到的回声的强度很小以至于比较器A 无法检测到就超出了系统的测量范围。这时系统将显示错误信息“E”。
                                DIY样品图如下:
                     [IMGA=0,absMiddle]../../upload/2006/04/30/223251.gif[/IMGA]

以下将按几个部分来讲述此次超声波距离测量步骤:
  1-工作原理
  2-电路描述
  3-软件
   Ultrasonic.s43
   设备初始化子
   程序主循环程序
   计算子程序
   BT_ISR 子程序
   显示子程序
   延时子程序

工作原理
   本应用基于声波的反射。声波在其传播的介质中被定义为纵波。当声波受到尺寸大于其波长的目标物阻挡时就会发生反射;反射波称为回声。如果声波在介质中传播的速度是已知的,而且测量到声波从声源到达目标然后返回声源的时间,从声源到目标的距离就可以精确地计算出来。这就是本应用的测量原理。这里声波传播的介质就是空气,采用不可见的超声波。
   假设室温下声波在空气中的传播速度是1100 英尺/秒,测量到的声波从声源到达目标然后返回声源的时间是t,秒距离d可以由下列公式计算:
                                   d=1100 12 t (英寸)
    因为声波经过的距离是声源与目标之间距离的两倍,声源与目标之间的实际距离应该为d/2。

电路描述
   本应用中中用来发射和接收超声波的装置是40KHz 的陶瓷超声波传感器。MSP430 采用晶体振荡器产生的一个40KHz 方波信号的12 周期脉冲序列驱动发射传感器,接收传感器则接收回声。MSP430 的定时器A被定义为40KHz 晶振频率计数器,因此时间测量精度为25 微秒,这对本应用来说足够用了。测量的时间基准是非常稳定的因为它由石英晶体振荡器产生。接收传感器收到的回声由运算放大器放大后送到比较器A 的输入端。比较器A 检测到其输入端的回声信号后触发定时器A 计数值的捕捉来捕获比较寄存器CCR1 的值。捕捉在回声到达系统的瞬间进行。捕获的计数值就是超声波脉冲序列从系统出发到达目标然后返回系统的时间。从系统到目标的距离(用英寸表示)就可由MSP430 用测得的时间算出并显示在两位静态液晶显示器上。显示更新后MSP430 马上转入LPM3 睡眠模式来降低功耗。基本定时器1 被编程用来每205 毫秒中断MSP430 一次。基本定时器1的中断信号唤醒MSP430 并重复测量周期更新显示。
    图1 显示的是本应用的电路原理图。其中MSP430F413 U1 是系统的核心部分。参考文献[1]是这个芯片的技术资料。LCD1 是一由MSP430F413内部集成的LCD 驱动器驱动的两位低压静态液晶显示器。R03 连接到Vss R13 和R23, 悬空将LCD 外围电路设置为静态LCD 驱动模式。这里方便的选用了一个40KHz 的低频晶振,与本应用中采用的超声波传感器的谐振频率相匹配。R12 作为复位线的上拉电阻,内部集成的掉电保护电路可以预防掉电情况。C9 位于靠近芯片电源线的位置,提供MSP430 的电源耦合。14 脚的接插件(J1) 提供JTAG 接口与MSP430 相连,可使用MSP430FLASH 仿真工具进行在线调试和编程LED1 用来指示测量周期。端口引脚P1.5 被定义为输出超声波发射器所需要的40KHz 方波ACLK信号。
   传感器的输出驱动电路直接由9V 电池供电并提供18Vpp 驱动超声波发射器。18Vpp 是通过一个二进制非门CD4049(U4)桥电路实现的。参考文献[6]是它的技术资料。其中一个非门用来为驱动器的一侧提供180 度的相移信号。另一侧由相内信号驱动。这种结构使输出端的电压提高了一倍,为发射传感器提供了18Vpp 电压。两个门并联连接以便每一侧能够为传感器提供足够的驱动电流。电容C6 C7 阻断了到传感器的直流通路。因为CD4049 工作于9V 而MSP430 工作于Vcc 3.6V。 MSP430 和输出驱动器之间的逻辑电平是不匹配的,双极性晶体管Q1 就作为这两种逻辑电平之间的转换器。
   运算放大器U3 是TI 公司的高速运算放大器TLV2771 。参考文献[5]是它的技术资料。这个放大器具有高增益带宽并在40KHz 时提供充分的高增益。运算放大器连接成反相放大器构造。R7、R5 设置增益为55、C5 提供高频滚降。R3、R4 偏置非反相输入端,为运算放大器的单输入工作提供一个虚拟中间值。放大后的超声波信号在这个虚拟中间值。上下波动传感器RX1 的高Q 值提供选择性并丢弃除了40KHz 之外的频率。运算放大器的输出端连接到比较器A 的输入端CA0 (即端口引脚P1.6)。 比较器A 的参考电平内部选择为0.5Vcc 。当接收到回声时电压高于参考电平从而触发比较器A 的输出CAOUT 。调整R3 可以得到需要的灵敏度并优化测量范围。
   MSP430 和超声波信号放大器电路由9V 电池经TI 公司的LDO 芯片TPS77001 调制后的3.6V 电压供电。参考文献[4]是它的技术资料。电阻R1和R2 调整稳压器输出电压为3.6V。 C1和C2 是推荐使用的稳压器的正常工作的供电电容。发射器的驱动电路是由9V 电池直接供电的。开关S1 是本应用的电源开关。
   图2 显示的是12 周期的40KHz 脉冲序列的波形轨迹图。我们注意到19.2V 的峰峰电压波动。方波顶部的正弦响铃波是由于传感器内部的谐振。
   图3 显示的是一个完整测量周期的波形轨迹。轨迹1显示的是发射传感器输出端的12周期的40KHz脉冲序列。轨迹2 显示的是接收传感器输出经运算放大器放大后在引脚1上的输出。轨迹上的第一个脉冲序列信号,代表直接从发射器上收到的信号被MSP430忽略。接下去的脉冲序列代表目标反射的回声,被MSP430 用于测量。轨迹3 显示的是MSP430 测得的时间间隔的宽度。这个宽度代表该脉冲序列从系统到达目标再返回所花的时间,显然它取决于所测量的距离。
[IMGA=0,absMiddle]../../upload/2006/04/30/223541.gif[/IMGA]
                           图1

     [IMGA=0,absMiddle]../../upload/2006/04/30/223637.gif[/IMGA]
                           图2

     [IMGA=0,absMiddle]../../upload/2006/04/30/223657.gif[/IMGA]
                           图3
软件Ultrasonic.s43
   设备初始化子程序
   这个子程序初始化及设置外围电路。首先关闭看门狗电路,采用一个软件延时让低频晶振稳定,将FLL+倍频器设置为64 来产生2.56MHz 的MCLK频率。P1.0 设置为输出控制LED。未使用的端口引脚设置为输出,端口引脚P1.5 设置为输出带缓冲的40KHz ACLK。频率基本定时器1 启动并设置为提供一个150Hz LCD 频率并每205 毫秒中断CPU 开始一次测量周期比较器A 内部参考电平设置为0.5Vcc ,CAPD 位设置为关闭比较器输入引脚的输入缓冲。LCD 模块打开并在本应用中设置为静态模式驱动两位静态LCD 。LCD 存储器清零,LCD 的初始显示为00。基本定时器1 中断和全局中断打开,这样基本定时器1 就可以周期性中断CPU。

   主循环程序
   主循环用存储在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 位来确“E” 。程序最终返回到主程序,更新LCD 显示并返回LPM3 睡眠模式。下一个基本定时器1 中断将MSP430 唤醒至活动状态重复程序执行过程。

计算子程序
   计算子程序负责本应用中的数学计算。CCR1 中调整后的16 位数值存储为变量Result, 这个值就代表超声波序列从系统到目标然后返回系统这段距离所需的时间。因为定时器A 计数间隔为25 微秒,对应的时间值为Result25 微秒假设室温下声音的速度为1100 英寸/秒,可以看出,从定时器A计数值得到的Result 每6 个值对应于1 英寸的距离。
   为了采用MSP430 现有的整数计算达到要求的精度,16 位的Result 首先乘以100 然后除以6。16位*16位的乘法是由子程序Mu100 完成的,32位的结果存储在变量htX100_msw 和htX100_lsw 中,然后除以6 并将结果保存在变量DIGITS 中DIGITS 中的值是二进制格式的,由hex2bcd 子程序将这个二进制值转换成BCD码然后丢弃BCD 码,的最后两个数字来补偿前面所作的与100 的乘法。两位的结果值返回到变量DIGITS中。

   BT_ISR 子程序
   基本定时器1 中断子程序BT_ISR 对保存在堆栈中的状态寄存器SR 中的位进行操作以使MSP430 能够返回活动状态继续执行主循环中LPM3之后的程序代码。

  显示子程序
  这个子程序用变量DIGITS 的值更新两位静态LCD 显示。静态显示器的段值存储在查寻表LCD_Tab 中。通过将DIGITS中的数字与LCD_Tab 查寻表中的位置相关联,LCD 存储器就可以装入所需要的段值。

  延时子程序
这个子程序产生一个16 位的软件延时。由于软件减计数的变量处于堆栈的顶部(TOS),寄存器不会受到影响。延时时间到后,子程序返回前堆栈指针(SP)恢复到原始值。

  结论
内部集成的模拟比较器A、带硬件捕获/比较寄存器的16 位定时器A、基本定时器1、 LCD 驱动电路简化了超声波测距应用的设计,提供了一种单片系统解决方案。本应用在15 英寸距离测量中的平均功耗为1.3 毫安。这包括LDO U2, 运算放大器U3 和CMOS 二进制反相器U4 的静态电流,运算放大器自身就由1 毫安的静态电流,电路其他部分的功耗为300 微安。LED 工作时需5 毫安,电流MSP430 在LCD 连续工作时需2.1 微安的平均电流。这是利用MSP430 的低功耗特性实现的,MSP430 大部分时间处于LPM3 睡眠状态,这时用到的CPU 资源仅为5.6%。
因为声波的速度与温度有关,测量值在非室温下准确度会下降。在本应用中引入一个简单的基于热电阻的温度测量和距离补偿,可以使系统在很大的温度范围内精确测量。如果需要测得的距离和温度数据可以存储在FLASH 存储器中。加上额外增益和使用多态LCD 来读出尽可能多的位数也可以增大测量范围。
 
MSP430源程序(汇编)请下贴
--------------------------------------------------------------------------------
                 [LIGHT] 此活动资料如此的完整,你还不快动手?[/LIGHT]

[ 这个贴子最后由DC在2006-5-1 11:02:30编辑过 ]
[COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
在线情况
2
  • 头像
  • 级别
  • 门派
  • 职务总版主
  • 声望+9
  • 财富5
  • 积分3065
  • 经验390701
  • 文章6744
  • 注册2006-03-07
;******************************************************************************
;    MSP430F413 超声波距离测量示范程序
;    
;******************************************************************************
;    寄存器定义
;******************************************************************************
#define      DIGITS  R11
#define      Result  R10
#define      IRBT    R9
#define      IROP1   R4
#define      IROP2L  R5
#define      IROP2M  R6
#define      IRACL   R7
#define      IRACM   R8

;******************************************************************************
;   变量定义
;******************************************************************************
             RSEG UDATA0             
             htX100_msw: DS 2 ;         字变量存贮在RAM 200h和201h
             htX100_lsw: DS 2 ;                         202h和203h
                       
;******************************************************************************
             RSEG    CSTACK                  ; 指向开始堆栈段区
             DS      0                         
             RSEG    CODE                    ; 指向开始代码段区
RESET        mov.w   #SFE(CSTACK),SP         ; 定义堆栈
             call    #Init_Device            ; MSP430 初始化
             mov.w   #0,DIGITS               ; 初始化DIGITS 为'0'
Mainloop    
             bic.b   #CAON,&CACTL1           ; 比较器A关闭
             call    #Display                ; 显示数据在LCD上
             bis.w   #LPM3,SR                ; 在LPM3模式等待
            
;************************开始超声波发出和捕获测量******************************                                      
            
             clr.w   &CCTL1                  ; 不使用CCTL1
             clr.w   &TACTL                  ; 不使用timer_A      
             bis.b   #BIT0,&P1OUT            ; LED开           
SetupTimerA  mov.w   #TASSEL0+TACLR+MC1,&TACTL
                                             ; TACLK = ACLK,16位向上模式
             bis.b   #BIT5,&P1SEL            ; ACLK o/p on P1.5
             mov.w   #12,&CCR1               ; 12 周期 40KHz爆发
             mov.w   #CCIE,&CCTL1            ; 比较模式中断
             bis.w   #LPM0,SR                ; 等待CCR1中断
             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                                     
             mov.w   #CCIE,&CCTL1            ; 比较模式中断
             bis.w   #LPM0,SR                ; 等待CCR1中断                          
             bis.b   #CAON,&CACTL1           ; 比较器A 开
             bic.b   #CAIFG,&CACTL1          ; 使能比较器A中断标志
             mov.w   #CM0+CCIS0+SCS+CAP+CCIE,&CCTL1
                                             ; 正边沿, CCIB,Cap,中断
             push    &TAR                    ; TOS = TAR 在测量的开始
             bis.w   #LPM0,SR                ; 等待CCR1中断(Echo)
             clr.w   &CCTL1                  ; 不使用CCTL1
             bic.b   #BIT0,&P1OUT            ; LED关闭
             bit.b   #CAIFG,&CACTL1          ; 检查回声波不接收
             jz      Next                    ; '超出范围'条件
             mov.w   &CCR1,Result            ; Result = TAR (CCR1) at EOC
             sub.w   @SP+,Result             ; Result = time taken
             add.w   #48,Result              ; 补偿爆发12个时钟
                                             ; 传递时间 + 36个时钟延时
                                                                              
;****************** 测量完成 **************************************************             

             call    #Math_calc              ; 调用数学子程序
             swpb    DIGITS                  ; Shift left by two digits for /100        
             jmp     Mainloop                ; 下一次测量周期          
Next         mov.w   #0beh,DIGITS            ; 不回声接收显示'E' 表示错误
             jmp     Mainloop
            
;******************************************************************************
Init_Device                                  ; 初始化MSP430x41x             
;******************************************************************************
             mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; 停止WDT
             bis.b   #030h,&FLL_CTL0         ; 开启负载电容器对于XTAL振荡器开始振荡
                                             ;  
             call    #Delay                  ; 延时对于振荡器到稳定为止
             mov.b   #03fh,&SCFQCTL          ; MCLK = 40KhzX64 = 2.56Mhz  
             call    #Delay                  ; 延时对于FLL到稳定为止
SetupP1      mov.b   #000h,&P1OUT            ; 清除P1 输出寄存器
             bis.b   #0bfh,&P1DIR            ; 不用的Pin设置为输出          
             bis.b   #040h,&P1SEL            ; 比较器A输入功能                         
SetupP2      mov.b   #000h,&P2OUT            ; 清除P2输出寄存器
             bis.b   #0ffh,&P2DIR            ; 不用的Pin设置为输出                                                 
SetupP6      mov.b   #000h,&P6OUT            ; 清除P6输出寄存器
             bis.b   #0ffh,&P6DIR            ; 不用的Pin设置为输出
SetupBT      mov.b   #BTFRFQ0+BTFRFQ1+BTIP2+BTDIV,&BTCTL
                                             ; Enable BT with 150Hz LCD freq.
                                             ; and 205 milli-second interrupt
SetupCA      mov.b   #CAPD6,&CAPD            ; o/p buffer disable for comp i/p          
             mov.b   #P2CA0,&CACTL2          ; P1.6为比较输入          
             mov.b   #CARSEL+CAREF1+CAON,&CACTL1           
                                             ; 比较器A开, 0.5Vcc整. 参考
SetupLCD     bis.b   #LCDON+LCDSON+LCDSG0_7,LCDCTL
                                             ; LCD模块开和静态模式
ClearLCD     mov     #15,R15                 ; 15 LCD mem位置清除
             mov.b   #LCDMEM,R14
Clear1       mov.b   #0,0(R14)               ; 写零在LCD RAM中
             inc.b   R14                      
             dec     R15                     ; 是否清除所有LCD mem?
             jnz     Clear1                  ; 清除更多LCD mem              
             bis.b   #BTIE,&IE2              ; 使能基本定时器中断
             eint                            ; 使能中断                                            
             ret
;******************************************************************************
[COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
在线情况
3
  • 头像
  • 级别
  • 门派
  • 职务总版主
  • 声望+9
  • 财富5
  • 积分3065
  • 经验390701
  • 文章6744
  • 注册2006-03-07
;******************************************************************************
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-4 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 "0"
             db      b+c                     ; Displays "1"
             db      a+b+d+e+g               ; Displays "2"
             db      a+b+c+d+g               ; Displays "3"
             db      b+c+f+g                 ; Displays "4"
             db      a+c+d+f+g               ; Displays "5"
             db      a+c+d+e+f+g             ; Displays "6"
             db      a+b+c                   ; Displays "7"
             db      a+b+c+d+e+f+g           ; Displays "8"
             db      a+b+c+d+f+g             ; Displays "9"
             db      a+b+c+e+f+g             ; Displays "A"
             db      Blank                   ; Displays  Blank
             db      a+d+e+f                 ; Displays "C"
             db      b+c+d+e+g               ; Displays "D" d
             db      a+d+e+f+g               ; Displays "E"
             db      a+e+f+g                 ; Displays "F"
;******************************************************************************
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             ; Initialise 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
                [LIGHT] 此活动资料如此的完整,你还不快动手?[/LIGHT]
 
[COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
在线情况
4
  • 头像
  • 级别
  • 门派
  • 职务总版主
  • 声望+9
  • 财富5
  • 积分3065
  • 经验390701
  • 文章6744
  • 注册2006-03-07
     我连材料清单都提供给你,问你心动吗?
-----------------------------------------------------------------------------
元件编号                                   参数值
R1                               200K  1 % - 0805 SMD
R2, R3, R4, R6, R7, R12          100K  1 % - 0805 SMD
R5                               1.8K  0.1 % - 0805 SMD
R8, R9, R10                    10K  0.1 % - 0805 SMD
R11                               560  5 % - 0805 SMD
C1, C3, C4, C8, C9                    0.1uF 16V PPS 1210 SMD
C6, C7                               2 X 0.1uF 16V PPS 1210 SMD
C5                               22pF 50V CERM  0805 SMD
C2                               4.7F 10V CERM 0805 SMD
Q1                               NPN 三极管 MMBT3904
X1                                40KHz Quartz Crystal
TX1                                TRANS 40KHz 超声波 S类型
RX1                                RCVR 40KHz 超声波 S类型
LED1                                  RED LED
S1                                  滑动开关
9V                                     电池合(PCB装配式)
9V                                     9V碱性的电池
U1                                  MSP430F413 单片机
U2                                  TI LDO稳压器 TPS77001
U3                                  TI 运放 TLV2771
U4                                  十六进制反相缓冲器 SO-16
J1                                   14 Pin插座
LCD1                                  LCD 0.5” 2 Digit
PCB                                    自制PCB
---------------------------------------------------------------------
           [em11]还不快动手[em09]
[COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
在线情况
5
  • 头像
  • 级别
    • 积分4
    • 经验990
    • 文章20
    • 注册2006-03-31
    一手抓51,一手抓低功耗
    在线情况
    6
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
      超声波是由机械振动产生的,可在不同介质中以不同的速度传播,具有定向性好、能量集中、传输过程中衰减较小、反射能力较强等优点。超声波传感器可广泛应用于非接触式检测方法,它不受光线、被测物颜色等影响,对恶劣的工作环境具有一定的适应能力,因此在水文液位测量、车辆自动导航、物体识别等领域有着广泛的应用。

                            [IMGA]http://www.microcontrol.cn/mcbbs/images/upload/2006/05/27/031221.jpg[/IMGA]

                            [IMGA]http://www.microcontrol.cn/mcbbs/images/upload/2006/05/27/031211.jpg[/IMGA]

     [imga]../../upload/2006/06/22/163214.gif[/imga]
     这是超声波DIY实验调试过程中所测量到的波形,所使用到是的DSO2010虚拟示波器所测量到的。虚拟示波器在我的开发中帮助了不少,带来较大的方便。[em07]
    [ 这个贴子最后由DC在2006-6-23 2:28:36编辑过 ]
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    7
    • 头像
    • 级别
      • 积分10
      • 经验3406
      • 文章27
      • 注册2006-04-30
      有兴趣,怎么开始?
      微控网感谢您的参与
      在线情况
      8
      • 头像
      • 级别
      • 门派
      • 职务总版主
      • 声望+9
      • 财富5
      • 积分3065
      • 经验390701
      • 文章6744
      • 注册2006-03-07
       根据材料清单,购买材料开始动手。
       如果大家有兴趣召集资金来做PCB的话,我可以负责layout PCB,然后再打板。
       参加人数越多,人均投入金钱就越少。
       如有更好的方法,可以各自发表意见。。。

       如果你想参与以上活动而购买元件又不方便的话,可以联系我。
       如有更好的方案,请提出来与大家一起来讨论。
      [ 这个贴子最后由DC在2006-5-1 17:05:17编辑过 ]
      [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
      在线情况
      9
      • 头像
      • 级别
        • 积分4
        • 经验195
        • 文章7
        • 注册2006-04-25
        非常有兴趣,只是没能力,等我再练练,磨出我利器!
        菜鸟先飞
        在线情况
        10
        • 头像
        • 级别
          • 积分11
          • 经验1202
          • 文章52
          • 注册2006-04-07
          汇编弄的这么长
          分析 很费时
          [FLY]
          [COLOR=RED]清钟沁桐[/COLOR]

          [COLOR=BLUE][LIGHT]非常高兴能与大家一起交流,并非常感谢大家指点与帮助[/LIGHT][/COLOR]
          [/FLY]
          [IMGA]http://www.dabaoku.com/gif/173/gif004.gif[/IMGA][COLOR=RED]爱祖国[/COLOR]
          在线情况
          11
          • 头像
          • 级别
            • 积分1
            • 经验245
            • 文章4
            • 注册2006-05-04
            好像已经有人做出来了,呵呵
            我也想做一个
            微控网感谢您的参与
            在线情况
            12
            • 头像
            • 级别
            • 门派
            • 职务总版主
            • 声望+9
            • 财富5
            • 积分3065
            • 经验390701
            • 文章6744
            • 注册2006-03-07
            很多东西都有人做过,只要你有兴趣都可以做。。。加油吧!
            [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
            Powered by LeadBBS 9.2 .
            Page created in 0.1738 seconds with 5 queries.