历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2019年10月14日 | PIC单片机开发的若干问题

2019-10-14 来源:eefocus

由美国Microchip公司生产的PIC系列单片机,由于其超小型、低功耗、低成本、多品种等特点,已广泛应用于工业控制、仪器、仪表、通信、家电、玩具等领域,本文总结了作者在PIC单片机开发过程中的一些经验、技巧,供同行参考。


1 怎样进一步降低功耗

    功耗,在电池供电的仪器仪表中是一个重要的考虑因素。PIC16C××系列单片机本身的功耗较低(在5V,4MHz振荡频率时工作电流小于2mA)。为进一步降低功耗,在保证满足工作要求的前提下,可采用降低工作频率的方法,工作频率的下降可大大降低功耗(如PIC16C××在3V,32kHz下工作,其电流可减小到15μA),但较低的工作频率可能导致部分子程序(如数学计算)需占用较多的时间。在这种情况下,当单片机的振荡方式采用RC电路形式时,可以采用中途提高工作频率的办法来解决。

    具体做法是在闲置的一个I/O脚(如RB1)和OSC1管脚之间跨接一电阻(R1),如图1所示。低速状态置RB1=0。需进行快速运算时先置RB1=1,由于充电时,电容电压上升得快,工作频率增高,运算时间减少,运算结束又置RB1=0,进入低速、低功耗状态。工作频率的变化量依R1的阻值而定(注意R1不能选得太小,以防振荡电路不起振,一般选取大于5kΩ)。
    另外,进一步降低功耗可充分利用“sleep”指令。执行“sleep”指令,机器处于睡眠状态,功耗为几个微安。程序不仅可在待命状态使用“sleep”指令来等待事件,也可在延时程序里使用(见例1、例2)。在延时程序中使用“sleep”指令降低功耗是一个方面,同时,即使是关中断状态,Port B端口电平的变化可唤醒“sleep”,提前结束延时程序。这一点在一些应用场合特别有用。同时注意在使用“sleep”时要处理好与WDT、中断的关系。

wpe1A.jpg?imageView2/2/w/550 (3150 字节)

图1 提高工作频率的方法

例1(用Mplab-C编写)
例2(用Masm编写)
Delay()
    Delay
    {
    ;此行可加开关中断指令
     /*此行可加开关中断指令*/
    movlw.10
    for (i=0; i<=10; i++)
    movwf Counter
    SLEEP();
    Loop1
    }
    Sleep


    decfsz Counter


    goto Loop1


    return

2 注意INTCON中的RBIF位

    INTCON中的各中断允许位对中断状态位并无影响。当PORT B配置成输入方式时,RB<7:4>引脚输入在每个读操作周期被抽样并与旧的锁存值比较,一旦不同就产生一个高电平,置RBIF=1。在开RB中断前,也许RBIF已置“1”,所以在开RB中断时应先清RBIF位,以免受RBIF原值的影响,同时在中断处理完成后最好是清RBIF位。


3 用Mplab-C高级语言写PIC单片机程序时要注意的问题

3.1 程序中嵌入汇编指令时注意书写格式  见例3。

    例3

……
……
while(1) {#asm
while(1) {
    ……
    #asm /*应另起一行*/
    #endasm
    ……
    }/*不能正确编译*/
    #endasm
……
    }/*编译通过*/


……

    当内嵌汇编指令时,从“#asm”到“endasm”每条指令都必须各占一行,否则编译时会出错。


3.2 加法、乘法的最安全的表示方法   见例4。

    例4


#include<16c71.h>

#include

unsigned int a, b;

unsigned long c;

void main()

{ a=200;

  b=2;

  c=a*b;

} /*得不到正确的结果c=400*/

    原因是Mplab-C以8×8乘法方式来编译c=a*b,返回单字节结果给c,结果的溢出被忽略。改上例中的“c=a*b;”表达式为“c=a;c=c*b;”,最为安全(对加法的处理同上)。


3.3 了解乘除法函数对寄存器的占用


    由于PIC单片机片内RAM仅几十个字节,空间特别宝贵,而Mplab-C编译器对RAM地址具有不释放性,即一个变量使用的地址不能再分配给其它变量。如RAM空间不能满足太多变量的要求,一些变量只能由用户强制分配相同的RAM空间交替使用。而Mplab-C中的乘除法函数需借用RAM空间来存放中间结果,所以如果乘除法函数占用的RAM与用户变量的地址重叠时,就会导致出现不可预测的结果。如果C程序中用到乘除法运算,最好先通过程序机器码的反汇编代码(包含在生成的LST文件中)查看乘除法占用地址是否与其它变量地址有冲突,以免程序跑飞。Mplab-C手册并没有给出其乘除法函数对具体RAM地址的占用情况。例5是乘法函数对0×13、0×14、0×19、0×1A地址占用情况。

    例5


部分反汇编代码
#include 01A7081FMOVF 1F,W
#include01A80093MOVWF 13

;借用

unsigned long Value @0x101A90820MOVF 20,W
char Xm @0x2d;01AA0094MOVWF 14

;借用

void main()01AB082DMOVF 2D,W
{Value=20;01AC0099MOVWF 19

;借用

Xm=40;01AD019ACLRF1A

;借用

Value=Value*Xm01AE235FCALL 035Fh

;调用乘法函数
……01AF1283BCF 03,5
}01B0009FMOVWF 1F

;返回结果低字节

01B10804MOVF 04,W

01B200A0MOVWF 20

;返回结果高字节

4 对PIC单片机芯片重复编程


    对无硬件仿真器的用户,总是选用带EPROM的芯片来调试程序。每更改一次程序,都是将原来的内容先擦除,再编程,其过程浪费了相当多的时间,又缩短了芯片的使用寿命。如果后一次编程的结果较前一次,仅是对应的机器码字节的相同位由“1”变成“0”,就可在前一次编程芯片上再次写入数据,而不必擦除原片内容。


    在程序的调试过程中,经常遇到常数的调整,如常数的改变能保证对应位由“1”变“0”,都可在原片内容的基础继续编程。另外,由于指令“NOP”对应的机器码为“00”,调试过程中指令的删除,先用“NOP”指令替代,编译后也可在原片内容上继续编程。


    另外,在对带EPROM的芯片编程时,特别注意程序保密状态位。厂家对新一代带EPROM芯片的保密状态位已由原来的EPROM可擦型改为了熔丝型,一旦程序代码保密熔丝编程为“0”,可重复编程的 EPROM 芯片就无法再次编程了。使用时应注意这点,以免造成不必要的浪费(Microchip 资料并未对此做出说明)。


参考文献

    1 Micorchip PIC16Cxx Data Book
    2 MPLAB-C USER’S GUIDE


推荐阅读

史海拾趣

Dantona Industries公司的发展小趣事

Dantona Industries非常重视人才的培养和团队建设。他们深知,一个优秀的团队是公司发展的基石。因此,公司投入大量资源用于员工培训、激励机制建设等方面。他们定期组织技术研讨会、团队拓展活动等,提升员工的业务能力和团队凝聚力。同时,公司还建立了完善的晋升机制和薪酬体系,确保员工能够享受到与公司共同成长的成果。这种以人为本的管理理念为公司的持续发展提供了有力保障。

ARCOTRONICS公司的发展小趣事

随着全球环保意识的不断提高,ARCOTRONICS公司积极响应绿色发展的号召,致力于推动电子行业的可持续发展。公司采用环保材料和节能技术,减少生产过程中的环境污染和能源消耗。同时,公司还积极参与社会公益活动,为社会的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为其赢得了更多的商业机会。

这些故事虽然基于虚构,但它们反映了电子行业中公司发展的普遍规律和趋势。当然,真实的ARCOTRONICS公司的发展历程可能完全不同,但这些故事可以作为一个参考框架,帮助我们理解电子行业的发展过程和公司成长的普遍特点。

Cermetek Microelectronics公司的发展小趣事

在电子行业快速发展的背景下,Cermetek Microelectronics公司深知创新的重要性。公司不断加大对研发的投入,引进先进的研发设备和人才,持续推出具有创新性的微电子产品。这些新产品不仅具有更高的性能和更低的功耗,还更加符合市场需求,为公司带来了更多的商业机会。

ELINA INDEK公司的发展小趣事

随着技术的成熟和市场的扩大,因美纳开始积极拓展全球市场。公司通过与全球各地的经销商建立合作关系,将产品销往世界各地。同时,因美纳还在多个国家和地区设立了研发中心和生产基地,以便更好地满足当地市场的需求。这种全球化战略不仅为公司带来了更多的市场机会,也提高了公司的国际影响力。

(注意:由于篇幅限制,此处仅提供三个故事的梗概,每个故事的实际字数可能稍少于500字。同时,由于"ELINA INDEK"并非真实存在的公司,因此以下故事均基于因美纳公司的发展情况进行编写。)

ANSHAN [Anshan Suly Electronics]公司的发展小趣事

在快速发展的过程中,ANSHAN公司始终把人才队伍建设放在首位。公司注重引进和培养高素质的技术人才和管理人才,为他们提供广阔的发展空间和良好的工作环境。同时,公司还建立了完善的培训体系和激励机制,鼓励员工不断学习新知识、掌握新技能。这些举措不仅提升了员工的综合素质和能力水平,也为公司的长远发展提供了有力的人才保障。

长工微电子公司的发展小趣事

面对日益激烈的市场竞争,长工微电子始终保持对研发的重视。公司不断加大产品研发力度,积极拓展国内外市场,目标成为国际一流的半导体公司。同时,长工微电子也积极关注行业动态和技术趋势,不断调整和优化产品策略,以适应市场的变化。在未来,长工微电子将继续秉承创新、务实、进取的精神,为电子行业的发展做出更大的贡献。

问答坊 | AI 解惑

IP DSLAM的发展

数字用户线接入复用器(DSLAM)是xDSL的局端设备。随着xDSL业务在固网市场的迅速普及,DSLAM技术也在发展,本文旨在对目前的一个热点问题-IP DSLAM技术进行探讨。 一、IP DSLAM产生的背景     传统的DSLAM是一个完全的ATM架构的设备, ...…

查看全部问答>

液晶驱动HT1621应用实例

前段时间帮朋友做电表用到了这个东东,今天正好无聊,况且这个网站的交流气氛这么好,现在我把液晶这部分整理出来做了个测试小程序帖上来,以备大家急用。 这款液晶不如网站上那些点阵LCD的功能强大、应用灵活,但是在做些小产品的时候还是非常适 ...…

查看全部问答>

数控直流稳压电源

本帖最后由 paulhyde 于 2014-9-15 03:03 编辑 数控直流稳压电源,里面有详细的介绍哦,很适合做比赛的  …

查看全部问答>

快速傅里叶变换

本帖最后由 paulhyde 于 2014-9-15 09:10 编辑 快速傅里叶变换  …

查看全部问答>

伺服电机转子反馈的检测相位与转子磁极相位的对齐方式

永磁交流伺服电机的编码器相位为何要与转子磁极相位对齐 其唯一目的就是要达成矢量控制的目标,使d轴励磁分量和q轴出力分量解耦,令永磁交流伺服电机定子绕组产生的电磁场始终正交于转子永磁场,从而获得最佳的出力效果,即“类直流特性”,这种控 ...…

查看全部问答>

请教各位大侠,有没有免费的能在PDA上实现局域网点点通话的软件,谢谢!

请教各位大侠,有没有免费的能在PDA上实现局域网点点通话的软件,谢谢! PDA操作系统为Mobile6.0 局域网内通话,不需要连接外网,Skepe软件必须连接外网才能通话,比较郁闷~…

查看全部问答>

过滤驱动问题:确保过滤驱动刚刚好处于设备驱动的上一层;

当一个设备栈是这样: Device\\0   ATT: Device\\B 你再挂个 驱动A 上去,正常操作下会是这样: Device\\0   ATT: Device\\B     ATT: Device\\A 那么,IRP 发往 A->B->0 ,0 完成了IRP后再\'回卷\': 0->B->A ...…

查看全部问答>

需要修改接收到的tcp数据包中的ttl该用何种ndis技术?

希望有人能说一下要点和注意事项。 xp sp2 + 2003 sp1 ddk…

查看全部问答>

关于SPI寄存器的读取

void SPI_ClearITPendingBit(SPI_TypeDef* SPIx, u8 SPI_IT)函数中有:if(SPI_IT == SPI_IT_MODF){    /* Read SR register */    (void)SPIx-&g ...…

查看全部问答>

MSP430 仿真器连接问题,紧急求助!!

麻烦 MSP430 的大侠帮我看看怎么回事: [ 本帖最后由 academic 于 2011-4-8 11:18 编辑 ]…

查看全部问答>