<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)page和bank切換問題

          單片機(jī)page和bank切換問題

          作者: 時(shí)間:2016-11-17 來源:網(wǎng)絡(luò) 收藏
          (1) 切換bank 問題

          458一共有兩個(gè)bank,每個(gè)都是由20-3f 。

          本文引用地址:http://www.ex-cimer.com/article/201611/315474.htm

          如果需要切換bank來用的話,則需要改變操作寄存器 R4的第6和第7位來實(shí)現(xiàn)。我定義一個(gè)宏來處理:

          ;-----------------------macro defination---------------------

          bank0 macro

          bc 0x04,6

          bc 0x04,7

          endm

          ;------------------------

          bank1 macro

          bs 0x04,6

          bc 0x04,7

          endm

          這里就定義了兩個(gè)宏,分別是 bank0,bank1,用的時(shí)候直接用就可以。而這里想說說程序開始初始化的時(shí)候清bank的程序,相對于156是需要改程序的,反而這個(gè)跟 468非常相似,倒是可以直接跟 468通用了(468相應(yīng)修改成4個(gè)bank就可以了。),簡單用了一下二重循環(huán)搞定。

          程序清單:

          ;----------------------clear rams of all banks----------------------

          clear_all_ram:

          mov a,@0x10

          mov r4,a

          bank0

          call clr_ram

          bank1

          call clr_ram

          ret

          clr_ram:

          clr r0

          inc r4

          mov a,@0x3f

          and a,r4

          jbs psw,z

          jmp clr_ram

          mov a,@0x10

          mov r4,a

          ret

          這里的

          and a,r4

          jbs psw,z

          不能換成 xor ,因?yàn)閤or會(huì)受R4最高兩位選擇bank位的影響。

          (2) 切換 page 問題

          實(shí)際用的話是在是太簡單了,所以這里著重分析原理。

          首先R2是PC和堆棧,都是12位寬。 不要和程序代碼的13位寬度搞反了。參看datasheet的第7頁的內(nèi)容:

          這個(gè)就是PC的結(jié)構(gòu),一個(gè)page一共就是1K字節(jié)(1024字節(jié)),也就是210 ,顯然需要用到 A0-A9 一共10個(gè)位來尋址。A11和A10是用來切換Page的。Call和jmp 指令(也只有這兩個(gè)指令是需要切換page的了。),有個(gè)共同點(diǎn),操作的時(shí)候的步驟:都是將R2低10位的值載入,這樣可以訪問 210 個(gè)地址,也就是1個(gè)page的程序頁,不切page的話他們都可以訪問整個(gè)程序頁。Jmp是直接跳轉(zhuǎn),不用考慮返回問題,所以這個(gè)屬于比較簡單的,只需要

          page1

          jmp process

          這樣就可以跳到其他頁面了,之后PC指針也在后來的頁面工作。這個(gè)比較簡單,pass掉吧。

          Call是需要考慮程序調(diào)用后的返回的問題。

          首先跟jmp一樣,先將PC+1壓入堆棧,然后裝載低10位的地址,然后根據(jù)10和11位來決定在哪個(gè)頁面工作

          page0

          ……..

          page1

          call subprogram

          這樣就調(diào)用了page1的子程序了。當(dāng)子程序結(jié)束,執(zhí)行ret返回的時(shí)候,由于堆棧和PC都是12位的,所以PC出棧的時(shí)候能直接恢復(fù),這個(gè)時(shí)候的PC指針是正常的,也就是之前壓入堆棧的PC+1值了。但是有個(gè)問題,雖然PC值正常,但是實(shí)際上 R3里面的5,6位的PS0和PS1位是并沒有改變的,這樣有個(gè)隱患,如果不執(zhí)行 jmp 的話那是正常的沒有問題,但是一旦執(zhí)行了jmp,PC的10和11位會(huì)自動(dòng)裝載 R3 的PS0,PS1位,變成了上次執(zhí)行call的時(shí)候切換的那個(gè)頁面了。程序跑飛。如果這個(gè)時(shí)候想執(zhí)行同一個(gè)page的子程序,沒有切換page的指令,那么call指令同樣會(huì)出錯(cuò)。所以對于call指令應(yīng)該是:

          page0

          ………..

          page1

          call subprogram

          page0

          調(diào)用完子程序之后記得切換回原來的Page

          關(guān)于中斷

          中斷發(fā)生的時(shí)候是將這個(gè)PC壓入堆棧,盡管PC指針已經(jīng)跳到0x08的中斷入口處,但是R3的PS0和PS1位并沒有被改變,所以,如果在中斷服務(wù)程序中,不執(zhí)行call和jmp指令就沒有關(guān)系,一旦執(zhí)行就會(huì)出錯(cuò)。所以需要進(jìn)行一次切換Page的動(dòng)作的,切換回page0就可以了,這樣可以保證jmp的時(shí)候是在中斷服務(wù)程序的范圍之內(nèi)跳。退出中斷之前是恢復(fù)了R3的值的,所以是不需要在結(jié)尾切換page了。

          雖然說能切換,但是基本上個(gè)人不是很建議多次來回的切換,盡量將比較整體的部分寫在同一個(gè)page,這樣可以減少出錯(cuò)的機(jī)會(huì)。



          關(guān)鍵詞: 單片機(jī)pagebank切換問

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();