历史上的今天
今天是:2025年02月12日(星期三)
2020年02月12日 | PIC单片机中的bank和PC问题
2020-02-12 来源:eefocus
简介:PIC单片机的bank和PC的问题往往在我们进行查表时和BANK设置时很容易出错。下面小编就大家来着重来介绍下面这俩点。希望能对大家有所帮助。
1、 BANK设置错误:
先来看一段程序:
include
PORTDB EQU 20H
……
START
movlw b‘11110000’
movwf PORTDB
clrf TRISD
MAIN
bcf STATUS,C
rlf PORTDB,1
btfsc STATUS,C
bsf PORTDB,0
movf PORTDB,W
movwf PORTD
call DELAY
goto MAIN
……
上面的是一个将D口的发光二极管循环点亮的小程序,实际运行发现并不能达到点亮的效果。通过设置断点和观察变量的手段发现,单片机在执行“clrf TRISD”这一语句后,TRISD寄存器的值为0FFH,而PORTD的值被清成了0。这是因为未设置BANK的缘故,此时BANK=0,而TRISD寄存器却是位于BAKN1的。因此,在该语句前要加上一句“bsf STATUS,RP0”,使BANK=1。
经过改动,运行后发现程序仍然不正常。同样使用设置断点和观察变量的手段来分析程序,发现同样由于BANK设置的错误,单片机并未对位于BANK0的PORTD、 PORTDB操作。因此,在该语句前要加上一句“bcf STATUS,RP0”,使BANK=0。经过这样的调整后,程序运行正常了。
实际上,这样的错误很容易发生,在编写比较复杂的需要常常切换BANK的程序时更是如此。建议初学者在写程序时在有可能的情况下,在每次对BANK0以外的寄存器操作完成后都将BANK切换回BANK0。这样做虽然会麻烦一些,但会减少错误的发生,使调试更为简单一些。
2、 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的值。
上一篇:PIC单片机程序基本结构框架
下一篇:PIC单片机编程格式和风格
史海拾趣
|
请问是否支持mmc/sdcard就能从sdcard启动呢?这个过程是怎样的 比如samxung 6410之类有从mmc/sdcard启动的寄存器定义,并且板子做了开关,这是怎么回事,叫它从sdcard启动它就从sdcard启动吗,,这个过程能给讲一下吗 其他的arm或者非arm的芯片,其他公司的arm芯片呢,又是怎样从sdcard启动的啊, sdcard上放上 ...… 查看全部问答> |
|
请教关于S3C2440A+MDK ULINK2环境下JTAG的故障? 我的开发环境是S3C2440A+KEIL MDK ULINK2 当OM[1:0]=01时,JTAG工作是正常的,能调试;但OM[1:0]=00时就不正常了,出现“can not stop ARM device , check JTAG cable ”,我已经改了JTAG的时钟,还是不行,请高手指点。… 查看全部问答> |
|
cyclone IV AS 和 jtag 配置问题。求助 开发环境QUARTUS II 10.1SP1 . 器件:altera ep4ce22e22c8(144脚 QFP封装) 配置芯片M25P16(兼容EPCS16的) 下载线是USB 下载线(在c III 上用完全是O ...… 查看全部问答> |
|
示波器是一种用途十分广泛的电子测量仪器。它能把肉眼看不见的电信号变换成看得见的图象,便于人们研究各种电现象的变化过程。 下面给大家推荐一本学习示波器电子书,书有点老,但讲的都是基础,新童靴可以认真看看,,肯定有用,,, &n ...… 查看全部问答> |
|
德州仪器.郑可忠《物联网的无线连接》 [摘要] TI德州仪器BD业务拓展.郑可忠:随着物联网产品在我们的生活中越来越流行,这里我将展示德州仪器的无线连接解决方案在不同领域中的应用并介绍TI的开发工具和软件 ...… 查看全部问答> |
|
故障:转向灯常亮,顶灯常亮。。。 描述:下雨后出现然后跑一跑就好了。。。 车进场后接车留电话开始检修,这种问题都快修烂了不用再去检查就知道是什么问题 直接检查车身电脑绝对是进水腐蚀了,拔下板子 车设计缺陷, 解决办法把 ...… 查看全部问答> |
|
我在main.c定义了 int a=3; 但是在 it.c 中extern int a; 为什么不正确,报错如下,要是想在it.c中得到main。c的a变量怎么办 #error cpstm8 stm8s_it.c:459(9+5) missing ; #error cpstm8 stm8s_it.c:460(10+5) missing ;… 查看全部问答> |




