老古开发网首页
导航:老古开发网首页文章索引文章分类经验总结→[PIC单片机软件开发的小技巧]
| -文章搜索 - 最新文章 - |

PIC单片机软件开发的小技巧

发布时间:2006年3月4日 点击次数:666
来源:单片机与嵌入式系统应用   作者:中国矿业大学 胡伊兰 程红;中国科学院自动化研究所 岳红强
 

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

1  动作标志位的使用

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

  listp=16c73

  call lefthandup
  callrighthandup
L0callreadinsignal
  btfsscs1_v,lefthandlight3
  calllefthandstop
  btfsccs1_v,righthandlight4
  gotoL0
  callrighthandstop
L1callreadinsignal
  btfsccs1_v,lefthandlight3
  gotoL1
  calllefthandstop

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

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

  listp=16c73

  actionstopflagequ 0x6e; 位定义
  lefthandflagequ 0x0; 0表示停止左手动作
  righthandflagequ 0x1; 0表示停止右手动作

  movlw0x03
  movwfactionstopflag
  calllefthandup
  callrighthandup
L2callreadinsignal
  btfss cs1_v,lefthandlight3
  calllefthandstop
  btfsscs1_v,righthandlight4
  callrighthandstop
  movlw0x00
  subwfactionstopflag,w
  btfssstatus,z
  gotoL2
  继续下面的程序

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

2  GOTO,CALL指令的不同使用

  在PIC的汇编程序中,CALL与GOTO指令使用的场合不同。一般情况下,在子程序与主程序之间大多用CALL指令;而状态转换模块之间大多用GOTO指令,即由此状态进入另一种状态不需返回。由于PIC单片机的堆栈有限,在程序中,不能无止境地使用GOTO语句,这样会使堆栈溢出,程序无法正常运行。各个小程序内部循环占用堆栈的级数不多,使用GOTO指令是可行的,但在大的程序中用GOTO则无法返回到调用前程序的下一条指令。CALL指令完成调用完子程序后返回到调用前的程序。程序如下:

  listp=16c76
start:callsetcpu
  call automatismstate1
L3callreadinsignal
  btfsccs2_v,ultrasonicdetect1
  gotoL3
  gotoautomatismstate2

automatismstate2:
  
  return
  
  automatismstate1、automatismstate2表示两种状态,ultrasonicdetect1表示一个输入超声检测信号。上面程序描写调用automatismstate1状态,执行完后进行下面的检测ultrasonicdetect1,没有触发就一直循环检测,触发就进入automatismstate2状态,执行完也不再回到下面的程序。

3  状态标志位Z、C的不同使用情况

  在进行判断标志位时,Z(零标志)、C(借位标志)是不同的。Z为1时,表示上面的结果为0,Z为0时,则结果不为0。C为1时,借位,C为0时,没有借位。在使用定时器的时候,一般使用C标志位,这是由于当完成某一动作去检查定时器时,时间可能没到,或是正好,或是已经超过时间,只要到了或超过时间,都要按照要求关闭定时器,如下面程序所述。如果用Z标志位,等于0时可能没有检测到,无法判断停止的状态,而用Z可以很好地控制时间定时。进行一般的计算时大多用Z,如前面的动作标志位中就是如此使用的。

  listp=16c76
  callopentimer0
L4movlwd’30’
  subwft0_v2,w
  btfssstatus,c
  gotoL4
  callclosetimer0

  程序检测时间是否到达1.5 s,没有则循环等待,到了或检测时间过了就关闭定时器,执行下面的程序。

  总之,在PIC单片机的编程中采用合适的方法,可以使整个程序运行稳定,而且程序空间的使用也将有所减小,避免了调试中的Bug。这是笔者在实际中的一点体会,还有许多不足或没有考虑到的问题,希望在和大家的探讨中不断学习PIC单片机的精髓。

参考文献

1  蔡纯洁,等. PIC全系列单片机原理与开发. 北京:中国科学技术大学出版社,2003
2  窦振中,等. PIC系列单片机应用设计和实例. 北京:北京航空航天大学出版社,1999
3  Microchip Technology Inc. PIC16F7X Date Sheet. 2002
4  Microchip Technology Inc. PICmicro中档单片机系列参考手册. 2004

 

欢迎进入老古论坛进行讨论
[经验总结] 相关文章:
关于单片机多机通信系统稳定性的探讨
简介:
  本刊2001年第8期刊登的《单片机多机通信系统的稳定性研究》(以下简称《稳定性》)一文中,陈晓英老师提出了在单片机多机通信系统研制过程中,由RS-485接口构成半双工通信网络时所遇到的两个问题及解决方法。   笔者在研制单片机多机通信系统过程中,采用其它设计方法,消除了系统的不稳定因素,整个系统2年来一直运行稳定、可靠,希望在此能与大家作进一步的探讨。   由RS-485接口构成的半双工通信网络,其结构如图1所示,其中R=120Ω,为匹配电阻,作用为消除反射、吸收噪声。这样,无论系统处于什么状态,线路上都不会出现噪声干扰。这就很好地解决了《稳定性》一文中所提出的第2个问题。 ......

单片机系统加密中的动态反跟踪措施
ADμC812中A/D转换器的安全应用
DSP虚拟I²C总线软件包的设计及应用实例
使用PWM得到精密的输出电压
AVR单片机定点运算及数制转换子程序
数字电位器X9241与PIC单片机的接口及程序设计
远程通信节点的系统测试方法
MCS-96/196三字节浮点库
AD采样注意的事项
 
下一个:[嵌入式系统]飞思卡尔为消费电子应用提供双轴向传感器
简介:
1 概述   对手机等各种手持设备和硬盘驱动器等消费电子设备而言,体积在产品设计中的地位日益重要。通过采用一颗具有双轴向监测功能的传感器,开发商能够减少元件数量,这样可以节省可观的PCB空间、加快散热、降低成本。   飞思卡尔创新的MMA62xxQ系列MEMS传感器专为终端产品和嵌入式系统而设计,满足它们对倾斜、运动、定位、震动和振动等微小变化的测量需求。该系列高灵敏度、低重力小量程加速度的传感器件具有5种感应功能,能够满足开发商的广泛应用需求。   MMA6200Q系列XY-轴高灵敏度加速度传感器能够检测来自于倾斜、运动、定位、冲击或者振动中较小的力。市......
 

上一个:[嵌入式系统]数字信号控制器(DSC)适用于成本敏感的应用需求

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:否 执行时间:31毫秒