历史上的今天
返回首页

历史上的今天

今天是:2025年02月27日(星期四)

正在发生

2020年02月27日 | PIC单片机程序编写和动作标志位的使用方法解析

2020-02-27 来源:elecfans

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

PIC单片机程序编写和动作标志位的使用方法解析

1、动作标志位的使用

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

listP=16c73

calllefthandup

callrighthandup

LOcallreadinsignal

bdsscsl_v,1efthandlIGBTs

calllefthandstop

btfsccsl_v,righthandlight4

gotoL0

callrighthandstop

L1callreadinsignal

btfsccsl_v,lefthandlight3

gotoL1

calllefthandstop


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


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

listp=16c73

actlonstopflagequOx6e;位定义

lefthandfla8cqu0x0;0表示停止左手动作

rightbandflagequOxl;O表示停止右手动作

MOV lwOx03

MOV Wfactionstopflag

calllefthanduo

callrighthandup

L2callreadinsignal

btfsscsl_v,lefthandhght3

calllefthatldotop

btfsscsl_v,righthandlight4

callrighthandstop

MOV lwOx00

subwfacTIonstopflag,w

btfssstatus,z

gotoL2

继续下面的程序

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


2、GOTO,CALL指令的不同使用

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

listD=16c76

start:ca11setcpu

callautomatlsn、statel

L3callreadinsignal

btfsccs2_v,ultrasonicdetectl

gotoL3

gotoautonatlsmstate2

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,如前面的动作标志位中就是如此使用的。


listD=16c76

callopentimerO

L4 MOV lwd’30’

subwft0_v2,W

btfssstatus,c

gotoL4

cauclosetimer0


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


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

推荐阅读

史海拾趣

杰力(EMC)公司的发展小趣事

随着环保意识的不断提高和可持续发展理念的普及,杰力也开始注重环保和可持续发展方面的工作。公司采用环保材料和生产工艺,降低产品对环境的污染和破坏。同时,杰力还积极参与各类环保公益活动和社会责任项目,为推动电子行业的可持续发展做出贡献。这些努力使得杰力在行业中树立了良好的环保形象和社会责任感。

HEICO Corporation公司的发展小趣事

随着业务的不断发展,HEICO Corporation开始在全球范围内布局其电子业务。公司建立了完善的供应链管理体系,与全球供应商建立了长期稳定的合作关系。这种全球化布局不仅有助于HEICO获取更优质的原材料和零部件,还降低了生产成本和风险。同时,HEICO还注重本地化生产和服务,以满足不同地区客户的需求。通过优化供应链管理和提升本地化服务能力,HEICO在电子行业中保持了强劲的增长势头。

Hengstler GmbH公司的发展小趣事

随着业务的不断发展,HEICO Corporation开始在全球范围内布局其电子业务。公司建立了完善的供应链管理体系,与全球供应商建立了长期稳定的合作关系。这种全球化布局不仅有助于HEICO获取更优质的原材料和零部件,还降低了生产成本和风险。同时,HEICO还注重本地化生产和服务,以满足不同地区客户的需求。通过优化供应链管理和提升本地化服务能力,HEICO在电子行业中保持了强劲的增长势头。

Diodes公司的发展小趣事

随着科技的快速发展和市场的不断变化,客户需求也在不断更新。为了满足客户不断变化的需求,Diodes公司始终保持敏锐的市场洞察力和创新力。公司不断推出新产品、新技术和新应用方案,以满足客户在性能、可靠性、成本等方面的需求。同时,Diodes还积极与客户沟通交流,了解客户的实际需求和反馈意见,不断优化产品和服务。这些努力使得Diodes能够紧跟市场步伐、满足客户需求,在激烈的市场竞争中保持领先地位。

Endicott Research Group Inc (ERG)公司的发展小趣事

面对日益激烈的市场竞争,ERG始终坚持技术研发和创新。他们与多所知名大学和科研机构建立合作关系,共同研发新型电源技术和照明解决方案。这些合作不仅为ERG带来了先进的技术和研发资源,还使其在行业中保持了技术领先地位。通过与科研机构的紧密合作,ERG不断推出更具创新性和竞争力的产品。

Cypress Industries公司的发展小趣事

Cypress Semiconductor于1982年在美国加州的硅谷成立,这里是全球半导体行业的发源地之一。公司起初专注于高性能IC产品的研发和生产,为数据传输、远程通讯等领域提供解决方案。随着技术的不断发展和市场的扩大,Cypress逐渐将业务拓展至全球,并在多个国家和地区建立了生产基地和设计中心。

问答坊 | AI 解惑

TFT液晶显示原理

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 [;)][ip]TFT液晶显示原理TFT型的液晶显示器较为复杂,主要的构成包括了,萤光管、导光板、偏光板、滤光板、玻璃基板、配向膜、液晶材料、薄模式晶体管等等。首先液晶显示器必须先利用背光源, ...…

查看全部问答>

未来中国安防市场IP产品的增长成为热点

IMSResearch最近发布了一份名为《中国安防产业IP趋势》的研究,目的是希望了解IP相关技术如何在安防领域应用以及发展前景等问题。该研究针对中国本土提供电子物理安防产品的系统集成商和工程商,根据他们对IP安防产品的经验,对市场进行了分析。这 ...…

查看全部问答>

急需Tornado 2.2.1 for PowerPC!

如题,急需Tornado 2.2.1 for PowerPC,请问什么途径可以得到?欢迎来电13971652738,王先生。…

查看全部问答>

winpcap在evc下使用

winpcap在evc下怎么使用? D:\\PROGRAM FILES\\INCLUDE\\packet32.h(53): Could not find the file airpcap.h. D:\\PROGRAM FILES\\INCLUDE\\packet32.h(62): Could not find the file dagc.h. 有这样的提示。。。找不到系统的头文件 可有谁在E ...…

查看全部问答>

WinCE LCD驱动配置问题

各位大虾:     目前正在搞WinCE下LCD驱动, 在一个现有模板的基础上,进行了简单的修改。     引脚配置 跟 LCD控制器部分的设置应该是没有什么问题的。也将屏幕的一些配置参数进行了修改,原来的是320*240,现在我用的是800 ...…

查看全部问答>

malloc频繁申请大内存会导致异常吗

我在程序中 { ...... malloc 400K字节的缓冲区   ...... free ~ } 请问如果频繁的反复以上操作会导致异常或者死机吗 我的程序 疯狂进行30次会出现异常  不知道是不是这个原因引起的…

查看全部问答>

driver中调用MmAllocateNonCachedMemory向系统申请1MB空间,请问各位,怎么才能验证,申请到的空间是连续的?

我在driverentry中直接调用的MmAllocateNonCachedMemory函数,想要申请1MB空间,但不知道怎么用最简单的方式,得知空间是否连续?我是想申请1MB连续空间.   …

查看全部问答>

请问各位过来人IC封装测试是干什么的呢

    最近找工作,请问大家“IC封装测试”是干什么的呢? 主要是以下几个问题,谢谢了哈 1.工作的主要内容是什么的呢? 2.工作的前景如何,以后发展方向主要是怎样的呢? 3.行业的待遇具体怎么样呢?  …

查看全部问答>

别扭的1640

这两天,板子焊好了,一点一点在翻阅此前做的各种笔记,想起当时没太仔细考虑 充电程式的问题。   于是开始想MAX1640充电程式的设置问题。   做一个高质量点的 锂电池充电器 自然希望能实现典型的三段式充电程式CCCV。 然而,在这方 ...…

查看全部问答>