📄 上海齐济电子-应用技巧-pic单片机开发的若干问题.htm
字号:
<TD width="8%"></TD>
<TD width="92%"><SPAN style="FONT-SIZE: 9pt">
c=a*b;</SPAN></TD></TR>
<TR>
<TD width="8%"></TD>
<TD width="92%"><SPAN style="FONT-SIZE: 9pt">}
/*得不到正确的结果c=400*/</SPAN></TD></TR></TBODY></TABLE>
<P align=justify><SPAN style="FONT-SIZE: 9pt">
原因是Mplab-C以8×8乘法方式来编译c=a*b,返回单字节结果给c,结果的溢出被忽略。改上例中的“c=a*b;”表达式为“c=a;c=c*b;”,最为安全(对加法的处理同上)。</SPAN></P><B>
<P align=justify><FONT color=#008080><SPAN style="FONT-SIZE: 9pt">3.3
了解乘除法函数对寄存器的占用</SPAN></FONT></P></B>
<P align=justify><SPAN style="FONT-SIZE: 9pt">
由于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地址占用情况。</SPAN></P>
<BLOCKQUOTE>
<P align=justify><FONT color=#008080><STRONG><SPAN
style="FONT-SIZE: 9pt">例5</SPAN></STRONG></FONT></P></BLOCKQUOTE>
<TABLE border=0 width="100%">
<TBODY>
<TR>
<TD width="29%"></TD>
<TD colSpan=3 width="71%"><SPAN
style="FONT-SIZE: 9pt">部分反汇编代码</SPAN></TD></TR>
<TR>
<TD width="29%"><SPAN style="FONT-SIZE: 9pt">#include
<pic16c71></SPAN></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01A7</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">081F</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">MOVF 1F,W</SPAN></TD></TR>
<TR>
<TD width="29%"><SPAN
style="FONT-SIZE: 9pt">#include<math.h></SPAN></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01A8</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">0093</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">MOVWF 13</SPAN></TD></TR>
<TR>
<TD width="29%"></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">;借用</SPAN></TD>
<TD width="15%"></TD>
<TD width="40%"></TD></TR>
<TR>
<TD width="29%"><SPAN style="FONT-SIZE: 9pt">unsigned long Value
@0x1</SPAN></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01A9</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">0820</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">MOVF 20,W</SPAN></TD></TR>
<TR>
<TD width="29%"><SPAN style="FONT-SIZE: 9pt">char Xm
@0x2d;</SPAN></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01AA</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">0094</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">MOVWF 14</SPAN></TD></TR>
<TR>
<TD width="29%"></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">;借用</SPAN></TD>
<TD width="15%"></TD>
<TD width="40%"></TD></TR>
<TR>
<TD width="29%"><SPAN style="FONT-SIZE: 9pt">void main()</SPAN></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01AB</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">082D</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">MOVF 2D,W</SPAN></TD></TR>
<TR>
<TD width="29%"><SPAN style="FONT-SIZE: 9pt">{Value=20;</SPAN></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01AC</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">0099</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">MOVWF 19</SPAN></TD></TR>
<TR>
<TD width="29%"></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">;借用</SPAN></TD>
<TD width="15%"></TD>
<TD width="40%"></TD></TR>
<TR>
<TD width="29%"><SPAN style="FONT-SIZE: 9pt">Xm=40;</SPAN></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01AD </SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">019A</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">CLRF1A</SPAN></TD></TR>
<TR>
<TD width="29%"></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">;借用</SPAN></TD>
<TD width="15%"></TD>
<TD width="40%"></TD></TR>
<TR>
<TD width="29%"><SPAN
style="FONT-SIZE: 9pt">Value=Value*Xm</SPAN></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01AE</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">235F</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">CALL 035Fh</SPAN></TD></TR>
<TR>
<TD width="29%"></TD>
<TD colSpan=3 width="71%"><SPAN
style="FONT-SIZE: 9pt">;调用乘法函数</SPAN></TD></TR>
<TR>
<TD width="29%"><SPAN style="FONT-SIZE: 9pt">……</SPAN></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01AF</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">1283</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">BCF 03,5</SPAN></TD></TR>
<TR>
<TD width="29%"><SPAN style="FONT-SIZE: 9pt">}</SPAN></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01B0</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">009F</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">MOVWF 1F</SPAN></TD></TR>
<TR>
<TD width="29%"></TD>
<TD colSpan=3 width="71%"><SPAN
style="FONT-SIZE: 9pt">;返回结果低字节</SPAN></TD></TR>
<TR>
<TD width="29%"></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01B1</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">0804</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">MOVF 04,W</SPAN></TD></TR>
<TR>
<TD width="29%"></TD>
<TD width="16%"><SPAN style="FONT-SIZE: 9pt">01B2</SPAN></TD>
<TD width="15%"><SPAN style="FONT-SIZE: 9pt">00A0</SPAN></TD>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">MOVWF 20</SPAN></TD></TR>
<TR>
<TD width="29%"></TD>
<TD colSpan=3 width="71%"><SPAN
style="FONT-SIZE: 9pt">;返回结果高字节</SPAN></TD></TR></TBODY></TABLE><B>
<P align=justify><FONT color=#008080><SPAN style="FONT-SIZE: 9pt">4
对芯片重复编程</SPAN></FONT></P></B>
<P align=justify><SPAN style="FONT-SIZE: 9pt">
对无硬件仿真器的用户,总是选用带EPROM的芯片来调试程序。每更改一次程序,都是将原来的内容先擦除,再编程,其过程浪费了相当多的时间,又缩短了芯片的使用寿命。如果后一次编程的结果较前一次,仅是对应的机器码字节的相同位由“1”变成“0”,就可在前一次编程芯片上再次写入数据,而不必擦除原片内容。<BR>
在程序的调试过程中,经常遇到常数的调整,如常数的改变能保证对应位由“1”变“0”,都可在原片内容的基础继续编程。另外,由于指令“NOP”对应的机器码为“00”,调试过程中指令的删除,先用“NOP”指令替代,编译后也可在原片内容上继续编程。<BR>
另外,在对带EPROM的芯片编程时,特别注意程序保密状态位。厂家对新一代带EPROM芯片的保密状态位已由原来的EPROM可擦型改为了熔丝型,一旦程序代码保密熔丝编程为“0”,可重复编程的
EPROM 芯片就无法再次编程了。使用时应注意这点,以免造成不必要的浪费(Microchip 资料并未对此做出说明)。</SPAN></P>
<P align=left><FONT face=楷体_GB2312 size=3></FONT><FONT
color=#008080><STRONG><SPAN
style="FONT-SIZE: 9pt">参考文献</SPAN></STRONG></FONT></P>1 Micorchip PIC16Cxx
Data Book
<P></P>2 MPLAB-C USER’S GUIDE <!-- InstanceEndEditable --></SPAN></TD></TR>
<TR>
<TD> </TD></TR>
<TR align=middle>
<TD><A href="http://www.chipgem.com.cn/refer/yyjq80.htm#"><IMG border=0
src="上海齐济电子-应用技巧-PIC单片机开发的若干问题.files/img_top_cn.gif"></A> <A
href="javascript:window.print()"><IMG border=0
src="上海齐济电子-应用技巧-PIC单片机开发的若干问题.files/img_print_cn.gif"></A> <A
href="javascript:window.close()"><IMG border=0
src="上海齐济电子-应用技巧-PIC单片机开发的若干问题.files/img_close_cn.gif"></A></TD></TR></TBODY></TABLE>
<TABLE align=center border=0 borderColor=#0099ff width=768>
<TBODY>
<TR>
<TD>
<HR align=center class=hr SIZE=1 width="100%">
</TD></TR>
<TR align=middle>
<TD class=footer>上海市大连路1548号莱克大厦26D(200092) 电话:021-65630199 65630173
65630142 传真:021-65630332<BR>上海齐济电子有限公司 <A
href="http://www.chipgem.com.cn/refer/yyjq80.htm#"
onclick="javascript:window.external.addFavorite('http://www.chipgem.com.cn','上海齐济电子有限公司')">http://www.chipgem.com.cn/refer/yyjq80.htm#</A>
Copyright©2003-2004</TD></TR></TBODY></TABLE><!-- InstanceEnd --></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -