本文介绍项目是有关机器人操控的完结。操控部分选用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句子,这样会使仓库溢出,程序无法正常运转。各个小程序内部循环占用仓库的级数不多,运用GOTO指令是可行的,但在大的程序顶用GOTO则无法回来到调用前程序的下一条指令。CALL指令完结调用完子程序后回来到调用前的程序。程序如下:
list D=16c76
start:ca11 setcpu
call automatlsn、statel
L3 call readinsignal
btfsc cs2_v,ultrasonicdetectl
goto L3
goto autonatlsmstate2
:
automatlsmstate2:
return
auatomaTIsmstatel、 automaTIsmstate2表明两种状况,uhrasonicdetectl表明一个输入超声检测信号。上面程序描绘调用 automatistmstate1状况,履行完后进行下面的检测ultrasonicdetect],没有触发就一向循环检测,触发就进入 autornatismstate2状况,履行完也不再回到下面的程序。
3 、状况标志位Z、C的不同运用情况
在进行判别标志位时,Z(零标志)、C(借位标志)是不同的。Z为l时,表明上面的成果为0,Z为0时,则成果不为0。C为l时,借位,C为0时,没有借位。在运用守时器的时分,一般运用C标志位,这是因为当完结某一动作去查看守时器时,时刻或许没到,或是正好,或是现已超越时刻,只需到了或超越时刻,都要依照要求封闭守时器,如下面程序所述。假如用Z标志位,等于0时或许没有检测到,无法判别中止的状况,而用z能够很好地操控时刻守时。进行一般的核算时大多用Z,如前面的动作标志位中便是如此运用的。
list D=16c76
call opentimerO
L4 movlw d’30’
subwf t0_v2,W
btfss status,c
goto L4
cau closetimer0
程序检测时刻是否抵达1.5s,没有则循环等候,到了或检测时刻过了就封闭守时器,履行下面的程序。
总归,在PIC单片机的编程中选用适宜的办法,能够使整个程序运转安稳,并且程序空间的运用也将有所减小,避免了调试中的Bug。这是笔者在实践中的一点领会,还有许多缺乏或没有考虑到的问题,期望在和我们的讨论中不断学习PIC单片机的精华。