PIC 程序设计需要注意的问题
月城清浅 2022-06-27

  美国微芯公司开发的CMOS工艺PIC系列单片机,特别是采用内置第二代Flash存储器的在快速应用方面具有独到之处。系列内大都包含运算器、存储器、A/D、PWM、输入和输出I/O、通信等常用接口。自由灵活的定义功能可以适应不同的控制要求。

  PIC单片机采用精简指令集,例如对于PIC16F716单片机,只有35条单字节指令。要用这么少的指令实现复杂的控制或计算,显然要在程序设计上多做文章,以下就程序设计需要注意的问题谈一些看法。

  一、区分指令的大小写

  编写PIC单片机的源程序,除了源程序的开始处需要严格的列表指令外,还须注意源程序中字母符号的大小写规则,否则在PC机上汇编程序时不会成功。在源程序中都会使用伪指令INCLUDE。这条指令将列表中指定的单片机文件(在MPLAB中)渎入源程序作为源程序的一部分,所以凡是MPLAB中有关该单片机已有的寄存器在源程序中无须再用赋值指令(EQU)赋值,这就使所建立的源程序大为简化。

  此外,由于有了伪指令INCLUDE,所以根据MPLAB软件中的格式,在源程序中的操作数凡是涉及MPLAB已规定的寄存器名称的,其字母一律只能大写,不能小写。其余操作码、符号字母可任意大小写,但0x中的X应小写。否则汇编不会成功。鉴于上述原因,为了书写方便,在使用MPLAB软件时,PIC单片机的源程序均用大写字母为宜(0x例外)。

  以下举例有关机器人控制的实现。控制部分采用PIC16F7X系列单片机,运用汇编语言编程,运行速度较快,能够达到系统的要求。

 二、动作标志位的使用

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

  list P=16c73

  call lefthandup

  call righthandup

  L0 call readinsignal

  bdss csl_v,lefthandligbts

  call lefthandstop

  bfsc csl_v,righthandlight4

  goto L0

  call righthandstop

  L1 call readinsignal

  bfsc csl_v,lefthandlight3

  goto L1

  call lefthandstop

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

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

  三、区分GOTO和CALL指令的使用场合

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

  list D=16c76

  start:call setcpu

  call automaflsmstate1

  L3 call readinsignal

  bfsc es2_v,ultrasonicdetect1

  goto L3

  goto automatlsmstate2:

  automatlsmstate2:

  return

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

  由于PIC单片机的堆栈有限,在程序中不能无止境地使用GOTO指令,否则会使堆栈溢出,程序无法正常运行。但是在有些时候,例如当程序出现分支时,则不得不使用GOTO指令。对于PIC16F7X系列单片机,程序出现分支时只能通过STATUS寄存器的z位或c位进行判断。这时在两种情况的前一种情况下,必须使用GOTO指令进行转移;否则在执行完第一种情况后,紧接着又执行第二种情况。因此,在使用汇编语言进行程序设计时,应该将程序分解成一级级的子程序;然后在程序之间进行调用,尽量将GOTO指令跳转的范围缩小。

  四、注意状态标志位Z、C的不同使用情况

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

  list D=16c76

  call openfimer0

  L4 movlw d'30'

  subwf t0_v2,W

  bfsc status,c

  goto L4

  call dosetimer0

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

  总之,在PIC单片机的编程中采用合适的方法,可以使整个程序运行稳定,而且程序空间的使用也将有所减小,避免了调试中的Bug。

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 基于单片机的LED水族光源的设计

      1引言  生态水族的主角是鱼、水草,视觉欣赏是其主要功能。光照是其首要解决的三大技术问题之一。  常用的水族照明光源主要有荧光灯、水银灯、卤钨灯等,但其发射

    12小时前
  • 简述8位MCU的触摸按键设计方案

      0前言  MCU(MicroControllerUnit)中文名称为多点控制单元,又称单片微型计算机(SingleChipMicrocomputer),是指

    12小时前
  • 基于嵌入式的无线智能家居网关设计方案

      0引言  随着人们生活水平的提高以及计算机技术、通信技术和网络技术的发展,智能家居逐渐成为未来家居生活的发展方向。智能家居不仅能给用户提供安全、健康和舒适的

    12小时前
  • RISC的结构特征和设计原则

    (作者:凌朝东柯志斌)  1.引言  微控制器(Microcontroller)自上世纪70年代出现以来,在将近30年的时间里得到了迅猛的发展和广泛的应用。随着

    昨天
  • 单片机编程的6个实例经验

      1.某单片机系统的P2口接一数模转换器DAC0832输出模拟量,现在要求从DAC0832输出连续的三角波,实现的方法是从P2口连续输出按照三角波变化的数值,

    昨天
  • 单片机中断响应的最短时间和最长时间

    中断响应时间:从外部中断请求有效(外部中断请求标志置1)到转向中断入口地址所需要的响应时间。每个机器周期的S5P2时刻,INTx引脚的电平被锁存到内部寄存器中,

    前天
  • 开发高可靠性嵌入式系统的7个技巧

    尽管许多嵌入式工程师充满了希望和梦想,但高可靠性的代码不是一蹴而就的。它是一个艰苦的过程,需要开发人员维护和管理系统的每个比特和字节。当一个应用程序被确认为“成

    前天
  • 单片机电流的一些经验理解

    [导读]1、按理说,一个东西的负载电流,应该是它供给外部的电流,这时候也就是流出时,应该为正。2、外接电阻一般是上拉,通常情况这种接法输出高电平时,内部输出开关

    08-17
  • 51单片机中断心得整理

    [导读]如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题:1、中断服务函数使用 using 指定与主函数不同的寄存器组(主函数一

    08-17
  • 关于51单片机P0口的结构及上拉问题

    [导读]1.P0作为地址数据总线时,V1和V2是一起工作的,构成推挽结构。高电平时,V1打开,V2截止;低电平时,V1截止,V2打开。这种情况下不用外接上拉电阻

    08-17
  • 单片机十个基本概念的含义

    1、单片机执行指令我们来思考一个问题,当我们在编程器中把一条指令写进单片机内部,然后取下单片机,单片机就可以执行这条指令。那么这条指令一定保存在单片机的某个地方

    08-17
  • MCU存储知识:怎样使数据在掉电后不丢失?

    单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM或FLASHROM

    08-17
下载排行榜
更多
广告