位置:51电子网 » 技术资料 » 测试测量

PIC单片机软件开发技巧

发布时间:2008/5/27 0:00:00 访问次数:468

        

    

    

    笔者的项目是有关机器人控制的实现。控制部分采用picl6f7x系列单片机,运用汇编语言编程,运行速度较快,能够达到系统的要求。在这里使用的大多是数字信号的控制,电机的控制只有开和合两种状态。在动作的过程中需要两只手臂、身体、头部、脚部等的协调动作。整个控制系统比较复杂,因而在pic程序编写和空间分配方面需要注意一些问题。

    

    1 动作标志位的使用

    

    在整个控制中,组合的动作很多,当所有动作定位都通过光电开关控制时,在程序编写上就有一些问题。如要求左手上升到鼓掌位、右手上升到举手位(手初始位置在最下的放下位),光电开关0有效(即为0时是挡住),到达正确位置。用简单的理解可以写成下面的程序:

    list p=16c73

    call lefthandup

    call righthandup

    lo call readinsignal

    bdss csl_v,1efthandligbts

    call lefthandstop

    btfsc csl_v,righthandlight4

    goto l0

    call righthandstop

    l1 call readinsignal

    btfsc csl_v,lefthandlight3

    goto l1

    call lefthandstop

    :

    

    lefthandlight表示光电开关,由此判断是否到相应的位置。1表示在手臂最下面的位置;2表示在手臂的握手位置;3表示在手臂的鼓掌位置;4表示在手臂的高举手位置。上面程序描写左手臂上升到举手位置和右手臂上升到鼓掌位置并停止的过程。先判断左手到达否,到达则左手停止,接着看右手是否到达举手位,到达则停止,否则循环上述的检测,直到左手到达鼓掌位,右手到达举手位。

    

    注意,这里的3,4表示的就是鼓掌位,举手位。经过循环检测可以让手臂停在各位上,然而机械动作是有惯性的,机械停止位可能在该位的上一点或下一点,这就影响下面动作的进行,可能在若干动作后机械动作出现失常,也就是程序没法正常的运行。在此情况下,需要修改程序的编写方式,采用标志位来控制动作的进行。如果采用控制标志位,一定要在动作子函数中对标志位置零。程序如下:

    list p=16c73

    :

    actlonstopflag equ ox6e ;位定义

    lefthandfla8 cqu 0x0 ;0表示停止左手动作

    rightbandflag equ oxl ;o表示停止右手动作

    :

    movlw ox03

    movwf actionstopflag

    call lefthanduo

    call righthandup

    l2 call readinsignal

    btfss csl_v,lefthandhght3

    call lefthatldotop

    btfss csl_v,righthandlight4

    call righthandstop

    movlw ox00

    subwf actionstopflag,w

    btfss status,z

    goto l2

    继续下面的程序

    

    actionstopflag表示动作标志位参数,给动作标志位赋值,动作停止函数中将清零标志位的值。上述程序和前面所述程序的功能一样,实现两支手臂的动作。上面程序描写左手是否到达鼓掌位,到达停止,右手是否到达举手位,到达停止。看动作标志位是否为零,不是,不断地循环检测;是,执行下面的程序。

    

    2 goto,call指令的不同使用

    

    在pic的汇编程序中,call与got0指冷使用的场合不同。一般情况下,在于程序与主程序之间大多用call指令;而状态转换模块之间大多用goto指令,即由此状态进入另一种状态不需返回。由于pic单片机的堆栈有限,在程序中,不能无止境地使用goto语句,这样会使堆栈溢出,程序无法正常运行。各个小程序内部循环占用堆

        

    

    

    笔者的项目是有关机器人控制的实现。控制部分采用picl6f7x系列单片机,运用汇编语言编程,运行速度较快,能够达到系统的要求。在这里使用的大多是数字信号的控制,电机的控制只有开和合两种状态。在动作的过程中需要两只手臂、身体、头部、脚部等的协调动作。整个控制系统比较复杂,因而在pic程序编写和空间分配方面需要注意一些问题。

    

    1 动作标志位的使用

    

    在整个控制中,组合的动作很多,当所有动作定位都通过光电开关控制时,在程序编写上就有一些问题。如要求左手上升到鼓掌位、右手上升到举手位(手初始位置在最下的放下位),光电开关0有效(即为0时是挡住),到达正确位置。用简单的理解可以写成下面的程序:

    list p=16c73

    call lefthandup

    call righthandup

    lo call readinsignal

    bdss csl_v,1efthandligbts

    call lefthandstop

    btfsc csl_v,righthandlight4

    goto l0

    call righthandstop

    l1 call readinsignal

    btfsc csl_v,lefthandlight3

    goto l1

    call lefthandstop

    :

    

    lefthandlight表示光电开关,由此判断是否到相应的位置。1表示在手臂最下面的位置;2表示在手臂的握手位置;3表示在手臂的鼓掌位置;4表示在手臂的高举手位置。上面程序描写左手臂上升到举手位置和右手臂上升到鼓掌位置并停止的过程。先判断左手到达否,到达则左手停止,接着看右手是否到达举手位,到达则停止,否则循环上述的检测,直到左手到达鼓掌位,右手到达举手位。

    

    注意,这里的3,4表示的就是鼓掌位,举手位。经过循环检测可以让手臂停在各位上,然而机械动作是有惯性的,机械停止位可能在该位的上一点或下一点,这就影响下面动作的进行,可能在若干动作后机械动作出现失常,也就是程序没法正常的运行。在此情况下,需要修改程序的编写方式,采用标志位来控制动作的进行。如果采用控制标志位,一定要在动作子函数中对标志位置零。程序如下:

    list p=16c73

    :

    actlonstopflag equ ox6e ;位定义

    lefthandfla8 cqu 0x0 ;0表示停止左手动作

    rightbandflag equ oxl ;o表示停止右手动作

    :

    movlw ox03

    movwf actionstopflag

    call lefthanduo

    call righthandup

    l2 call readinsignal

    btfss csl_v,lefthandhght3

    call lefthatldotop

    btfss csl_v,righthandlight4

    call righthandstop

    movlw ox00

    subwf actionstopflag,w

    btfss status,z

    goto l2

    继续下面的程序

    

    actionstopflag表示动作标志位参数,给动作标志位赋值,动作停止函数中将清零标志位的值。上述程序和前面所述程序的功能一样,实现两支手臂的动作。上面程序描写左手是否到达鼓掌位,到达停止,右手是否到达举手位,到达停止。看动作标志位是否为零,不是,不断地循环检测;是,执行下面的程序。

    

    2 goto,call指令的不同使用

    

    在pic的汇编程序中,call与got0指冷使用的场合不同。一般情况下,在于程序与主程序之间大多用call指令;而状态转换模块之间大多用goto指令,即由此状态进入另一种状态不需返回。由于pic单片机的堆栈有限,在程序中,不能无止境地使用goto语句,这样会使堆栈溢出,程序无法正常运行。各个小程序内部循环占用堆

相关IC型号

热门点击

 

推荐技术资料

音频变压器DIY
    笔者在本刊今年第六期上着重介绍了“四夹三”音频变压器的... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!