<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > PIC單片機的bank和PC的出錯問(wèn)題分析

PIC單片機的bank和PC的出錯問(wèn)題分析

作者: 時(shí)間:2012-06-10 來(lái)源:網(wǎng)絡(luò ) 收藏

1、 BANK設置錯誤:

本文引用地址:http://dyxdggzs.com/article/171323.htm

  先來(lái)看一段程序:

  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

  ……

  上面的是一個(gè)將D口的發(fā)光二極管循環(huán)點(diǎn)亮的小程序,實(shí)際運行發(fā)現并不能達到點(diǎn)亮的效果。通過(guò)設置斷點(diǎn)和觀(guān)察變量的手段發(fā)現,在執行“clrf TRISD”這一語(yǔ)句后,TRISD寄存器的值為0FFH,而PORTD的值被清成了0。這是因為未設置BANK的緣故,此時(shí)BANK=0,而TRISD寄存器卻是位于BAKN1的。因此,在該語(yǔ)句前要加上一句“bsf STATUS,RP0”,使BANK=1。

  經(jīng)過(guò)改動(dòng),運行后發(fā)現程序仍然不正常。同樣使用設置斷點(diǎn)和觀(guān)察變量的手段來(lái)程序,發(fā)現同樣由于BANK設置的錯誤,并未對位于BANK0的PORTD、 PORTDB操作。因此,在該語(yǔ)句前要加上一句“bcf STATUS,RP0”,使BANK=0。經(jīng)過(guò)這樣的調整后,程序運行正常了。

  實(shí)際上,這樣的錯誤很容易發(fā)生,在編寫(xiě)比較復雜的需要常常切換BANK的程序時(shí)更是如此。建議初學(xué)者在寫(xiě)程序時(shí)在有可能的情況下,在每次對BANK0以外的寄存器操作完成后都將BANK切換回BANK0。這樣做雖然會(huì )麻煩一些,但會(huì )減少錯誤的發(fā)生,使調試更為簡(jiǎn)單一些。

  2、 操作錯誤:

  在進(jìn)行查表操作時(shí)需要對L進(jìn)行操作,這項操作也比較容易。舉個(gè)例子來(lái)說(shuō):

  ……

  00CA bcf LATH,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教學(xué)實(shí)驗套件的演示程序CLKTEST.ASM編譯完成之后的List文件中的一段,前面的4位數據是16進(jìn)制數,代表了該程序行在內程序存儲器的裝載位置。其中00CA句和0130句保證了執行“addwf PCL,1”語(yǔ)句后PC能跳轉到正確的位置,感興趣的朋友可以將這兩句屏蔽后看一下結果。

  在16F877單片機中PCLATH寄存器是一個(gè)低5位有效的寄存器,單片機在執行“addwf PCL,1”語(yǔ)句時(shí),會(huì )將PCLATH和PCL寄存器的值(PCLATH:PCL)一起送入程序計數器PC。以上面的程序0132H句為例,此時(shí)PCL=32H如果此時(shí)PCLATH=00H,RTCCSIG1=1則執行完該句后PC=PCLATH:PCL=0033H,這樣在下一個(gè)指令周期到來(lái)時(shí)就發(fā)生了錯誤。本來(lái)該執行第0134H句的,卻變成了執行第0034H句。同樣的,我們能夠知道第00CAH句的作用。避免發(fā)生這樣錯誤的方法是:在調試程序的時(shí)候調出List文件,特別關(guān)注一下有這類(lèi)操作的語(yǔ)句,再根據實(shí)際的情況來(lái)決定PCLATH的值。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>