kingman 发表于 2009-4-18 19:45:03

PC操作错误

在进行查表操作时需要对PCL进行操作,这项操作也比较容易出错。举个例子来说:
……
00CA bcf PCLATH,0
00CB movf RTCCSIG,W
00CC addwf PCL,1
00CD goto main
00CE goto RtccS1
00CF goto RtccS2
00D0 goto Rtccs3
00D1 goto Rtccs4
……
0130 bsf PCLATH,0
0131 movf RTCCSIG1,W
0132 addwf PCL,1
0133 goto SetHour
0134 goto SetMins
……
上面的程序是高奇ICD教学实验套件的演示程序CLKTEST.ASM编译完成之后的List文件中的一段,前面的4位数据是16进制数,代表了该程序行在单片机内程序存储器的装载位置。其中00CA句和0130句保证了执行“addwf PCL,1”语句后PC能跳转到正确的位置,感兴趣的朋友可以将这两句屏蔽后看一下结果。
在PIC16F877单片机中PCLATH寄存器是一个低5位有效的寄存器,单片机在执行“addwf PCL,1”语句时,会将PCLATH和PCL寄存器的值(PCLATH:PCL)一起送入程序计数器PC。以上面的程序0132H句为例,此时PCL=32H如果此时PCLATH=00H,RTCCSIG1=1则执行完该句后PC=PCLATH:PCL=0033H,这样在下一个指令周期到来时就发生了错误。本来该执行第0134H句的,却变成了执行第0034H句。同样的,我们能够知道第00CAH句的作用。避免发生这样错误的方法是:在调试程序的时候调出List文件,特别关注一下有这类操作的语句,再根据实际的情况来决定PCLATH的值。
页: [1]
查看完整版本: PC操作错误