pic單片機(jī)教程之13位程序計(jì)數(shù)器存儲器的組成
[導(dǎo)讀]本節(jié)主要講解PICMicro中檔系列單片機(jī)13位程序計(jì)數(shù)器的程序存儲器構(gòu)成。包括存儲器尋址方式、存儲器分頁、程序存儲器頁之間的跳轉(zhuǎn)實(shí)現(xiàn)及相關(guān)跳轉(zhuǎn)指令、技術(shù)原理。
本文引用地址:http://www.ex-cimer.com/article/201608/295777.htm關(guān)鍵詞:程序存儲器PIC單片機(jī)
單片機(jī)的兩種存儲器模塊:程序存儲器與數(shù)據(jù)存儲器。每個(gè)存儲模塊都有自己的數(shù)據(jù)總線,能在同一時(shí)間戳內(nèi)對模塊同時(shí)進(jìn)行數(shù)據(jù)存儲與指令操作。
程序存儲器構(gòu)成
中檔系列單片機(jī)有一個(gè)13位的程序計(jì)數(shù)器,可以尋址8K×14位的程序存儲空間。程序存儲器總線寬度(指令字)為14位。由于所有的指令均為單字指令,所以一個(gè)具有8K×14位程序存儲器的器件可以存儲8K條指令。很易于確定是否有充足的程序存儲空間來實(shí)現(xiàn)應(yīng)用程序。
中檔系列單片機(jī)把程序存儲器分成4頁,每頁2K字(0h - 7FFh,、800h - FFFh、1000h - 17FFh和1800h - 1FFFh)。圖6-1所示為程序存儲器映射和一個(gè)8級深度硬件堆棧。實(shí)際上單片機(jī)可能只實(shí)現(xiàn)了圖中所示存儲器的一部分,這與器件型號有關(guān)。關(guān)于單片機(jī)所提供的存儲器,請查閱單片機(jī)的數(shù)據(jù)手冊。
為了能在程序存儲器頁之間跳轉(zhuǎn),必須修改程序計(jì)數(shù)器(PC)的高位。這是通過在PCLATH(程序計(jì)數(shù)器高位鎖存器)中寫入需要的值來完成的。如果指令連續(xù)運(yùn)行,無需任何用戶的干預(yù),程序計(jì)數(shù)器即可以跨越程序頁面跨頁。對于那些程序存儲器不足8K字的器件,訪問超過物理地址空間的存儲單元時(shí),會(huì)回到有效的程序存儲空間。也就是說,在一個(gè)有4K字存儲空間的單片機(jī)中,尋址17FFh實(shí)際就是尋址7FFh。2K字或更少程序存儲空間的器件不需要分頁。
復(fù)位向量
對于任何單片機(jī),復(fù)位都將使程序計(jì)數(shù)器指向地址0h,我們稱這個(gè)地址為“復(fù)位向量地址”,也就是單片機(jī)發(fā)生復(fù)位時(shí),程序執(zhí)行的入口地址。
任何復(fù)位操作都會(huì)將PCLATH寄存器的內(nèi)容清零。這表明,復(fù)位向量地址(0h)處的任何轉(zhuǎn)移指令都將跳轉(zhuǎn)到程序存儲器的第0頁(PAGE0)。
中斷向量
當(dāng)響應(yīng)中斷時(shí),PC指向地址0004h,我們稱這個(gè)地址為“中斷向量地址”。當(dāng)PC指向中斷向量時(shí),PCLATH寄存器的值并不會(huì)被修改。這意味著,在中斷服務(wù)程序中,在改寫PC實(shí)現(xiàn)程序跳轉(zhuǎn)前,應(yīng)按目的地址所處的實(shí)際程序頁面先設(shè)定PCLATH寄存器。在中斷服務(wù)程序修改PCLATH寄存器前,應(yīng)將原PCLATH的內(nèi)容保存起來,以便從中斷服務(wù)程序返回時(shí)恢復(fù)PCLATH。
標(biāo)定信息
某些器件在程序存儲器中存儲標(biāo)定信息。在器件最終測試時(shí),Microchip將標(biāo)定信息寫入程序存儲器。應(yīng)用程序利用這些值可以獲得更好的運(yùn)行結(jié)果。標(biāo)定信息通常放在程序存儲器的末尾,并以RETLW指令形式實(shí)現(xiàn),該指令所帶的立即數(shù)就是標(biāo)定信息。
*注:對于窗口型器件,在擦除器件內(nèi)容前(同時(shí)會(huì)擦除標(biāo)定信息),務(wù)必先記下所有的標(biāo)定值。這樣在重新燒寫器件時(shí)能恢復(fù)標(biāo)定值。建議將標(biāo)定值寫在封裝上。
程序計(jì)數(shù)器(PC)
程序計(jì)數(shù)器指定要取出執(zhí)行的指令的地址,其寬度為13位,其中低8位來自PCL寄存器,該寄存器可讀寫的,而高5位(PC<12:8>)來自PCH寄存器(不可直接讀寫)。PCH寄存器的值只能通過PCLATH寄存器來更新。
圖6-2所示為裝載PC值的四種情況。情況1為寫PCL時(shí),如何裝載PC(PCLATH<4:0>→PCH);情況2為執(zhí)行GOTO指令時(shí),如何裝載PC(PCLATH<4:3>→ PCH);情況3為執(zhí)行CALL指令時(shí),如何裝載PC(PCLATH<4:3> → PCH)以及PC值如何壓入棧頂;情況4為執(zhí)行返回指令時(shí),如何裝載PC,此時(shí)PC值從棧頂裝載(彈出)。
相對跳轉(zhuǎn)指令
程序的相對跳轉(zhuǎn)指令是通過向程序計(jì)數(shù)器加一個(gè)偏移量來實(shí)現(xiàn)的(ADDWF PCL),當(dāng)使用相對跳轉(zhuǎn)指令方法對表進(jìn)行讀操作時(shí),要注意表地址是否超過了PCL寄存器的尋址范圍(每塊256個(gè)字節(jié))。
*注:對程序計(jì)數(shù)器(PCL)的任何寫操作,都會(huì)使PCLATH的低五位裝載到PCH中。
堆棧
堆棧允許8級深度的子程序嵌套調(diào)用和中斷。堆棧包含了程序執(zhí)行分支的返回地址。
中檔系列單片機(jī)有一個(gè)8級深度、13位寬的硬件堆棧。堆棧既不占用程序存儲空間也不占用數(shù)據(jù)存儲空間,棧指針不能讀寫。當(dāng)執(zhí)行CALL指令或響應(yīng)中斷發(fā)生跳轉(zhuǎn)時(shí),PC值被壓入堆棧(PUSH)。而執(zhí)行RETURN、RETLW或RETFIE指令時(shí),PC值從堆棧彈出(POP)。執(zhí)行壓?;虺鰲2僮鲿r(shí),不會(huì)修改PCLATH寄存器。 壓棧(PUSH)8次之后,進(jìn)行第9次壓棧時(shí),進(jìn)棧的數(shù)據(jù)將覆蓋第1次壓棧存儲的數(shù)據(jù),而第10次壓棧時(shí)進(jìn)棧的數(shù)據(jù)將覆蓋第2次壓棧存儲的數(shù)據(jù),依此類推。一個(gè)堆棧被覆蓋的例子如圖6-3所示。
*注1:沒有用于表示堆棧溢出或堆棧下溢條件的狀態(tài)位。
*注2:沒有稱為PUSH或POP的指令或助記符。而實(shí)現(xiàn)類似效果的操作是執(zhí)行CALL、RETURN、RETLW和RETFIE指令,或轉(zhuǎn)到中斷向量地址。
程序存儲器分頁
某些器件的程序存儲器空間大于2K字,但是CALL和GOTO指令只有11位地址范圍,這11位地址只允許在2K存儲空間范圍內(nèi)跳轉(zhuǎn)。為了使CALL和GOTO指令可以訪問整個(gè)8K的程序存儲地址范圍,必須有另外兩位來指定程序存儲器頁。將PCLATH<4:3>位作為頁面選擇位(圖6-2)。在執(zhí)行CALL或GOTO指令前,用戶必須確保正確設(shè)置頁面選擇位PCLATH<4:3>,以便指向需要的程序存儲頁面(圖6-2)。當(dāng)執(zhí)行一條返回指令時(shí),整個(gè)13位PC地址值都從堆棧彈出,不需要再對PCLATH<4:3>位進(jìn)行設(shè)置。
*注:當(dāng)器件的程序存儲器空間小于或等于2K字時(shí),可忽略用來存取有多個(gè)頁面的程序存儲器的頁面選擇位(PCLATH<4:3>)。但不推薦將PCLATH<4:3>位作為一般讀寫位使用,因?yàn)檫@樣做可能影響與將來產(chǎn)品的向上兼容性。對于程序存儲器空間在2K到4K字之間的器件,可忽略頁面選擇位PCLATH<4>,因?yàn)樗怯脕韺ぶ?、3頁(1000h~1FFFh)的。通常也不推薦將PCLATH<4>作為一般讀寫位使用,因?yàn)檫@樣做可能影響與將來產(chǎn)品的向上兼容性。
例6-1是調(diào)用在程序存儲器第1頁上子程序的例子。本例假使PCLATH寄存器由中斷服務(wù)程序保存和恢復(fù)(如果使用了中斷)。
例6-1:從第0頁調(diào)用第1頁的子程序
評論