PIC经验交流贴子收集.docx
《PIC经验交流贴子收集.docx》由会员分享,可在线阅读,更多相关《PIC经验交流贴子收集.docx(16页珍藏版)》请在冰豆网上搜索。
PIC经验交流贴子收集
PIC经验交流贴子收集
afanti经验交流
我先说一下我得小经验:
经过一阵的忙碌终于写了一个片子,接上电源发现不停的在复位,经过将近一天的探讨,才发现是电源的功率太小,单片机复位时耗电过大,有较大的电压降,于是单片机就不停地复位,原来试小毛病:
)。
但是一开始我曾经怀疑好多地方,当我把显示部分(LED)去掉,发现工作正常,才考虑到是电源功率问题,呵呵
发表于:
2003-02-2422:
00:
16
hh_up我也来谈谈
首先,出现问题,第一步要查硬件,确保硬件连接无误后,才来查软件。
我记得我开始做LCD显示时,因为将数据线接反(我开始以为那个不重要,没在意),无论我怎样努力,程序写了又写,改了又改,到处找人家写好的程序,可就是不行。
后来折磨了一个多星期,偶然才发现了这个接线错误,当时ft的要死!
!
!
后来做IIC也是,因为原来用51写过模拟的iic,所以我以为很简单。
但是后来焊接过程中改掉了一根线,而我毫不在意,于是又导致我3天没有进展,气愤的要死。
所以说硬件没做好,软件就别做了,做了也是瞎忙活。
还有一些小经验。
有点仿真器可以使用仿真器自带的晶振,也可以使用目标板上的晶振,这点要注意。
我当时因为没注意这点,做串口通信时,死活调不好波特率,也是ft!
其他的想到了再补充!
欢迎大家踊跃发言!
帮助别人也是帮助自己!
发表于:
2003-02-2422:
46:
46
greatddq我的一点教训
我在用16c72的时候。
没有仔细的看资料。
就直接用以前直到的模拟I2c通讯协议,经过同学提示,可以用硬件的。
因为他有I2C口。
当时也觉得好笨,这个都没有注意,这才开始看书,通过大概3天看书,直到了可以用它的寄存器控制硬件的协议,简单很多。
于是就开始画流程,选方式。
后来怎么也找不到主控怎么设定。
多亏各位大虾的指教,我才注意到ssp和mssp的区别。
于是重新详细的看了芯片的资料。
最后搞定!
呵呵
发表于:
2003-02-2500:
28:
30
qiuyongyang看门狗
让我也来谈一下自己伤心的往事吧,我刚开始学PIC的时候,由于经济困难,买不起仿真器,就买了一个下载器,后来我写程序的时候看门狗位没有移除,发现LED老是不停地闪烁,折腾了差不多一个月,因为又没有人教,有无资料,只在自己慢慢地苦想,那段日子真是不堪回,甚至到了失望的田地了,后来偶尔把看门狗位清0,一切大功靠成了.,,,,,
发表于:
2003-02-2518:
56:
55
QIBAOENA/D结果转换成BCD码
前些日子编了个LCD显示A/D转换结果的程序,其中要求将10位数据转换成电压值,进行读取字符显示表,动了一番脑筋后,找到了好办法,不仅很快,而且不用调用复杂的乘除法及BCD码转换,结果已经是BCD码,还有一个优点,只要需要,可以很方便的多算几位小数。
先拿出来,让大家看一下。
转换结果右移,ADRESH中是高2位,思路是,10位结果,对应5V电压,求电压值应x5/1024,程序如下:
MOVFADRESH,0
MOVWFADDBH
MOVFADRESL,0
MOVWFADDBL
CALLSUM2K
MOVFTEMP,0
MOVWF30H;整数送回30H
CALLSUM2K
SWAPFTEMP,0;交换4位
MOVWF31H;小数第一位送回31H,在高4位
CALLSUM2K
MOVFTEMPH2,0
IORWF31H;31H低4位中是小数第二位
;=====================================
D_ADD;双字节加法ADDA+ADDB->ADDB
MOVFADDAL,0;ADDB和ADDA低半字节相加
ADDWFADDBL
BTFSCSTATUS,C;有进位否?
INCFADDBH;有,ADDB高字节加1,再加ADDAHI
MOVFADDAH,0;ACCA、ACCB高半字节相加
ADDWFADDBH
RETURN;子程序返回
;=====================================
SUM2K
CALLSUM10;ADDB*10
DIV2K;ADDB/2048
CLRFTEMP
CALLSUB8;ADDBH/8
RETLW0
;======================================
SUB8;ADDBH/8,结果整数在TEMPH2,余数在ADDB
MOVLW08H
SUBWFADDBH
BTFSSSTATUS,C
GOTOSUB81
INCFTEMP
GOTOSUB8
SUB81
ADDWFADDBH
RETLW0
;=====================================
SUM10;ADDB*10=>ADDB
CALLSUM2
MOVFADDBH,0
MOVWFADDAH;ADDBX2->ADDA
MOVFADDBL,0
MOVWFADDAL
CALLSUM2
CALLSUM2;ADDBX8=>ADDB
CALLD_ADD;ADDA+ADDB=>ADDB
RETLW0
;======================================
SUM2;ADDB*2=>ADDB
BCFSTATUS,C
RLFADDBH
BCFSTATUS,C
RLFADDBL
BTFSCSTATUS,C
BSFADDBH,0
RETLW0
DIV2;ADDB/4
BCFSTATUS,C
RRFADDBL
BCFSTATUS,C
RRFADDBH
BTFSCSTATUS,C
BSFADDBL,7
RETLW0
发表于:
2003-02-2801:
52:
38
picuser我也谈谈
我在用串口通讯试验时,因mcu未接滤波电容,所以在仿真时总是复位,去掉RS232芯片,一切正常。
反复修改硬件电路,结果依旧。
最后想到可能是电源不稳。
加了一个滤波电容。
终于搞定。
感叹芯片如此禁不起干扰。
发表于:
2003-02-2808:
41:
05
lhj6132002老调重弹
书中自有黄金屋,书中自有颜如玉。
多看书,多看资料,其实书上什么都有。
不管你学什么,第一步就是尽可能地把它的所有资料找到,认真仔细地看透它,先从理论上把自己武装起来,再在实践中对照理论来验证,把书上的东西化为自己所有。
发表于:
2003-03-0122:
50:
53
afantiRE
我用164(串入并出移位寄存器)做静态显示时,在送数据时发现数码管闪烁,由于在CLK当有电平变化时,164就把数据移一位,造成数码管闪烁。
于是,用一个I/O口控制数码管的显示,当向164传送数据时,就把显示关掉,当数据传送完毕,点亮数码管;由于和164通讯的时间非常短,所以看不到闪烁
发表于:
2003-03-0316:
30:
21
王大林RE
曾经用一个164控制11个数码管 没有用专门的I/O口线控制数码管的只是在重新输出数据的时候 先给一个全灭的段码 也可以不闪
发表于:
2003-03-0318:
16:
39
agency也说A/D结果转换成BCD码
对于X5/1024,我的方法是算出5/1024,即0.0048828(BCD码),取5个寄存器,分别赋值为8,2,8,8,4!
再对48828进行BCD码自加X次,最后结果取一位整数,小数为6位!
我做的是直流电压表,显示很精确的
我感觉我说的很清楚了啊!
对于X5/1024,我的方法是算出5/1024,即0.0048828(BCD码),取5个寄存器,分别赋值为8,2,8,8,4!
再对48828进行BCD码自加X次,最后结果取一位整数,小数为6位!
我做的是直流电压表,显示很精确的
发表于:
2003-03-0512:
27:
18
zhaoke999
偶然发现的,PIC的片子复位脚直接接5V电源抗干扰能力最强,可以用2000V高压打在距芯片1CM处,而工作正常。
发表于:
2003-03-1419:
45:
46
小丁
这个主题很好,我也谈谈个人经验
软件上也有很多容易疏忽的地方,比如:
堆栈溢出,真是的,最近本人连续犯此错误:
(由于程序正常运行时,不会出现溢出情况,需满足特定条件(举例:
开通TIMR1,定时到后进入相应的处理程序,此时发生串行通讯中断,处理中断程序,此时往往容易导致溢出),而这种情况在仿真时很难遇到,我是在客户反映死机的情况下才找到的,希望大家看了此贴后,不会犯这种错误。
查表时页面溢出(非跨页)导致指针跑飞等情况。
发表于:
2003-03-2114:
51:
46
procat打高压不能证明抗干扰能力强
打高压不能证明抗干扰能力强,高压只是静电,只能说明线路的绝缘性能是否合格。
发表于:
2003-03-2408:
13:
51
zhaoke999
关于中断时的堆栈溢出
pic16f876堆栈只有8级,每发生一次子程序调用(或中断),将当前13位地址压到堆栈,PC=子程序起始地址低8位+PCLATH(或04H),子程序返回时将13位地址从堆栈中弹出=PC。
堆栈的操作由CPU控制不可监控,溢出不报警,子程序调用(或中断)超过8次嵌套时,最先压到堆栈的13位地址被冲掉,子程序返回时将回不到调用前的PC,程序。
一般使用不会达到8次嵌套,但如果有5、6次子程序嵌套,而中断服务程序中有1、2次子程序调用便相当危险。
调试时很难完全模拟所有实际情况,
一般的避免方法:
1、一般的子程序调用不要超过6次子程序嵌套,在开始编程前最好画一下流程。
2、尽量避免在不可确定发生时刻的中断(如串口接收、定时器)程序中加子程序调用。
中断服务程序中尽量用GOTO语句。
3、在6次子程序嵌套发生前屏蔽总中断。
4、厂家提供的器件读写驱动例子一般喜欢用很多子程序,用之前最好改一下。
5、可以将CALL改用GOTO,比如:
AAA.......
REYURN
.......
BBBCALLAAA
可以改为:
AAA......
MOVFWPCLATH_TEMP
MOVWFPCLATH
MOVFWPC_RETURN
MOVWFPCL
......
BBB
MOVFWHIGHCCC
MOVWFPCLATH_TEMP
MOVFWHIGHAAA
MOVWFPCLATH
MOVLWCCC
MOVWFPC_RETURN
GOTOAAA
CCCNOP
................
6、如果嫌麻烦,可以用C编程,C编译出来之所以大,与为避免堆栈溢出而作的绕弯处理不无关系
发表于:
2003-04-0500:
33:
30
shalky
PIC的一些问题
我使用PIC单片机的次数不算多,这种单片机有它的优点,也有缺点。
这里只说主要的几个缺点。
1,低档PIC无中断功能,在许多情况下,这是一个比较严重的问题,需要使用一定的系统设计技巧;
2,堆栈的深度有限。
低档的深度为2,高档的也就是31吧?
这也需要使用技巧;
3,RAM分区访问,造成一定的麻烦;
其中前面2个问题,只要在系统分析阶段,有针对性地下点功夫,是完全可以绕过去的。
主要是把那些比较杂、用时不多、偶尔发生的事件处理好就行。
这些事件很多人喜欢在主程序中处理,我不这样做。
我的做法是做一个或多个高效率的子程序,它就负责所有的杂事,如LED刷新,键盘输入,A/D采集,信号检测等。
对于主程序,为了访问某些资源,只要访问与具体资源相对应的RAM区即可。
如显示用的VRAM,键盘的KRAM等。
对于堆栈的溢出,记住一点就行,主程序中用的子程序不允许再访问子程序,即只允许出现一级子程序。
或许有人会说这做不到,其实不然。
如果PIC的堆栈比较多,可以多出现几层。
发表于:
2003-04-0508:
13:
43
FANZENGTING
关于LED显示
display()
{//显示
displaycount++//用于调整刷新率
if(displaycount!
=5){return;}
else
{
displaycount=0;
if(displaybit>=6)
{
displaybit=0;
}
displaybit++;//用于显示位转换
count1=0;//假设为控制段的口线
count2=0;//假设为控制位的口线
switch(displaybit)
{
case1:
display1();//一位的段码
one=1;//选通位
return;
case2:
display2();
two=1;
return;
case3:
display3();
three=1;
return;
case4:
display4();
four=1;
return;
case5:
display5();
five=1;
return;
case6:
display6();
six=1;
return;
default:
return;
}
}
我的LED显示是这样做的;把display()放到主函数中去通过displaycount++(软延时)调整刷新率;若是程序量比较大时,可在主函数中多放一些display();
发表于:
2003-04-1016:
06:
31
John
eeprom读写问题
完成一个项目,程序中用到eeprom的读写,编了相应的读写eeprom子程序,用着一直很正常。
最后要交工了却发现,有一处的读eeprom出错。
反复检查程序正确,又用PIC的sim仿真也没有错误,可是实际运行就出错,后来费了很大的周折才发现,读eeprom的上面就是一个写eeprom的程序,因写过程没完成,读eeprom就出错了。
发表于:
2003-05-0211:
53:
49
刘骁奖
关于用RB口做按键输入时体会
我用873做了一个板子,用RB口做按键输入,按键按下时,通过1.2K的电阻与地导通,外部接程序中因为打开了RB口的上拉,而使RB口的状态在仿真器上没有变化。
PIC的RB口内部上拉是非常可靠的,如果因为其它原因要使用外部上拉时,一定要关闭内部上拉位(OPTION_REG,7),否则输入不能被拉到0。
把这个放在这里,大家不要犯我这样菜的问题!
发表于:
2003-06-2717:
40:
17
zhaoke999
关于在单片机程序设计中利用梯形图设计控制逻辑的经验
梯形图在自动控制和PLC编程中几乎是必用的,大家应该都比较熟。
大家在单片机编程时,可能比较习惯用流程图做辅助设计。
其实在设计比较复杂的逻辑控制时,利用梯形图辅助设计会更直观、快速,主要是与、或、非的逻辑算法,程序是顺序下来的,可读性、可评估性强,有利于发现逻辑中的缺陷,添加功能也很方便。
复杂的逻辑控制用流程图做辅助设计时,会有好多的分支、跳转,调试和修改程序时多有不便。
如果是用C编程,与某些PLC和PAL、GAL的输入方式是一样的。
51系列汇编可利用布尔运算,PIC汇编需要一些技巧。
发表于:
2003-07-2611:
45:
37
supertask
今天才发现RB6、RB7的独特之处
以前用RB4~7的电平变化中断时,好像都很简单,今天才发现RB6和RB7不仅仅做I/O口,做电平变化中断,还在单片机烧写编程时,作为串行时钟输入线PGC和串行数据输入线PGD,所以如果在调试模式下,这两个端口的电平变化中断是不会响应的,必须烧写进去,然后才行。
发表于:
2003-08-0523:
33:
09
张政波
出现问题,硬件优先考虑的原则
我在用CCP模块实现脉冲捕捉功能时,因为在中断程序中有一定的处理程序,每次来脉冲时,系统都不能按照设计的思路执行,调试发现只要进入CCP中断系统就复位。
开始怀疑软件中断入口有问题,反复查找!
!
后来才怀疑到硬件问题,用示波器慢频率扫描才发现,脉冲的边沿很粗,在细看,原来有许多小的矩形脉冲!
导致CCP多次中断出错。
我是用的LM311输出脉冲信号,在输出端加一个滤波电容,问题解决了,波形很漂亮。
发表于:
2003-08-0623:
28:
10
blue2001
PIC的片子复位脚直接接5V电源抗干扰能力最强,是否是偶然发现?
拿PIC16C54C来说把:
在16c54的datasheet中提到:
5.1Power-OnReset(POR)
ThePIC16C5Xfamilyincorporateson-chipPower-OnReset(POR)circuitrywhichprovidesaninternalchipRESETformostpower-upsituations.Tousethisfeature,
theusermerelytiestheMCLR/VPPpintoVDD.Asimplifiedblockdiagramoftheon-chipPower-OnResetcircuitisshowninFigure5-1.
而PIC16C54C/55A/56A/57C/58B(Rev.ASilicon)ErrataSheet(
有更详细的描述。
对不同的MCU,又会有些微的差别,比如18Fxx8的datasheet中提到:
3.1Power-onReset(POR)APower-onResetpulseisgeneratedon-chipwhenaVDDriseisdetected.TotakeadvantageofthePORcircuitry,connecttheMCLRpindirectly(orthrougha
resistor)toVDD.
其实仔细研究和比较一下关于POR部分的文档,我们就能了解到PIC系列单片机在复位电路部分的设计思路。
为了保证复位的可靠性,某些型号的MCU都提供了PowerOnReset,了解了这些,对于实际的设计应该会有很大的帮助把。
其实,我的想法是技术上的问题都是能够找到原因的,我们不但要做到知其然,还应该要知其所以然。
henanboy我的经验
我曾经采用pic16c74b写过一个程序,当时我将RB口作为输入口,我曾经在编写程序的时候将该口的弱上拉功能取消了,但是在调试得过程当中,我不小心将该口的弱上拉取消指令屏蔽掉了。
这是我的程序运行出现了混乱,我当时不知道到是什么原因造成的。
经过我的反复调试,最后才知道是他在捣鬼。
发表于:
2003-09-2821:
31:
58
afantisubject
最近在用16F877做温度控制时,用其内部A/D时,选用内部电源作为REF+,然而在使用时,总是使采样结果不稳定(多次采样平均),后来纠其原因是采用LED显示,有时电流变化较大,、使REF+变化,造成采样的变化波动较大。
后来采用一个模拟口作为REF+,马上见效,结果很稳定。
所以,要尽量采用一个模拟口作为REF+(如果允许)。
另外,在测量温度时,有一段温度不能分辨出来,于是我采样32次,结果除以16,这样不改动硬件配置,很轻松做出来。
哈哈,相当于11位AD了这种办法使用的范围有限,以上是我的做法,数据仅供参考``````
发表于:
2003-10-0420:
13:
00
afanti
保护PCLATH
程序超过1page,若使用中断,也应当保护PCLATH,本来以为堆栈的宽度=PC的长度,发生中断时会保护PCLATH。
开始时不注意,后来调试时发现错误,查了好长时间才发现PCLATH没被保护,不能自动恢复,TNND!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
发表于:
2003-10-0420:
23:
46
tanjunbi
中断应保护W,STATUS
PIC单片机的不足之处就是中断时不保护数据,为稳重起见,我的程序中断保护W和STATUS,由于PCLATH的值对我的中断无影响,且中断程序也未改变它,故未保护。
发表于:
2003-10-0815:
23:
23
wanglixin
LCD的电平匹配问题
由于我是第一次使用液晶,切我们的产品用的CPU是3v的工作电压,而液晶是定做的,说工作电压在3---5v,因为我们自己焊接的一个产品的实验板有点问题,所以我就把液晶接在拉PICLF877的模拟板上,结果怎么都调试不成功,经过一翻努力终于调试的显示拉,但是乱码,总是在软件上找原因,就这么折腾拉3,4天,后来决定把产品的实验板修好,接在它上面.虽然在几天的努力中也曾怀疑过是硬件的问题,但由于用的是PIC的模拟板,总觉得硬件没有问题.接在实验板上后,运行一切正常.这才发现是由于电平不匹配的原因.虽然LCD的工作电压是接在3V的电源上的,但由于单片机是5v的,导致单片机I/O输出的低电平相对于LCD要求的低电平过高,使其在误认为为高电平而工作不正常.
发表于:
2003-10-2811:
25:
19
afanti
烧写片子时要注意PB,3
当我把调试好的程序烧写到片子(877A)时,发现PB,3作为输出时不起作用,起初以为片子有问题,再上仿真器,没问题,烧个片子,又这样,经过多次试验,才发现是烧写片子的问题,后来查了一下datasheet,才发现在一个不起眼的地方有这样一句话:
Inthismode(LowVoltageICSPProgramming),theRB3/PGMpinisdedicatedtotheprogrammingfunctionandceasestobeageneralpurposeI/Opin.原来如此!
!
!
所以在烧写片子时,要把选项:
lowvoltageprogram选择disable,这样就OK了
发表于:
2003-11-1019:
56:
26
alexshao1978
简单的问题:
KEY1/KEY2输入,LED1/LED2输出,KEY1按下,100ms去抖,LED1输出,KEY1松开,200ms去抖,LED1输出。
KEY2和LED2关系同KEY1/LED1关系。
两路互相独立。
此题看起来很简单,但是做好好像不易。
特别提醒,比如KEY1输入50ms后KEY2输入,那么怎么处理?
所以不能用简单的延时方式.
问:
使用何种编程的整体思路?
大家有没有兴趣探讨一下。
偶使用有限状态机方式,各两个态(输出0态和输出1态)。
通过判定输入条件在两个状态下互转。
发表于:
2004-02-1215:
00:
51
senst
钱的教训,编程心得
当程序出现怪现象时,查不出某程序段有问题,一般毛病出在如下几方面。
1.看门狗问题。
2.堆栈问题,堆栈空间不够,被其他数据破坏。
3.变量或寄存器没保护,主要在中断服务程序中。
4.压栈出栈不对等。
即PU