在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

            單片機page和bank切換問題

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

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

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

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

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

            bank0 macro

            bc 0x04,6

            bc 0x04,7

            endm

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

            bank1 macro

            bs 0x04,6

            bc 0x04,7

            endm

            這里就定義了兩個宏,分別是 bank0,bank1,用的時候直接用就可以。而這里想說說程序開始初始化的時候清bank的程序,相對于156是需要改程序的,反而這個跟 468非常相似,倒是可以直接跟 468通用了(468相應修改成4個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 ,因為xor會受R4最高兩位選擇bank位的影響。

            (2) 切換 page 問題

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

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

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

            page1

            jmp process

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

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

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

            page0

            ……..

            page1

            call subprogram

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

            page0

            ………..

            page1

            call subprogram

            page0

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

            關于中斷

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

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



            評論


            技術專區(qū)

            關閉