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