PIC單片機基礎(chǔ)知識之一
PIC16中檔系列單片機是精簡指令集的單片機,它具有以下特性:
——內(nèi)部為哈佛結(jié)構(gòu)
——指令流水線操作
——文檔寄存器的概念
——單指令周期
——所有指令為單字指令
——長字指令
——指令數(shù)很少
——指令實現(xiàn)的功能基本不重復
接下來分別介紹上面各個特性。
1)哈佛結(jié)構(gòu)-介紹哈佛結(jié)構(gòu)通常要和馮.紐曼結(jié)構(gòu)對比來介紹。我們熟悉的8086就是一種典型的馮.紐曼結(jié)構(gòu),它的程序和數(shù)據(jù)是共用同一個存儲空間,CPU也是使用同一個總線來訪問它們。那么,取指令和取數(shù)據(jù)勢必分時來進行,這就限制了數(shù)據(jù)的流量。和它相對應的哈佛結(jié)構(gòu),則是不同。哈佛結(jié)構(gòu)的典型特點就是程序和數(shù)據(jù)是分立的空間,CPU對程序和數(shù)據(jù)的訪問也是使用完全獨立的兩套總線。所以,相對于馮.紐曼結(jié)構(gòu),它可以同時從兩個空間取指令和取數(shù)據(jù),這就增加了數(shù)據(jù)流量。而且,因為兩個總線互不相干,所以,程序總線和數(shù)據(jù)總線可以做得不一樣寬。PIC單片機在設(shè)計之初選擇了哈佛結(jié)構(gòu),并基于程序總線的寬度,發(fā)展出了12位,14位和16位指令寬度的單片機系列,分別對應的是PIC低檔系列,PIC16中檔系列,以及PIC18系列單片機。這里要說明的是,數(shù)據(jù)總線的寬度始終是8位,所以不管它的指令寬度是多少,它仍然還是8位單片機。
2)指令流水線操作-大部分的單片機,取指令和執(zhí)行的過程是順序進行的。PIC單片機在設(shè)計時引入了指令流水線的設(shè)計,使得單片機的取指和執(zhí)行可以同步進行。我們來看下面的指令取指和執(zhí)行過程圖示。
1.MOVLW 0x55
2.MOVWF PORTB
3.CALL SUB_1
4.BSF PORTA,3
從這個圖示上,我們可以看到取指和執(zhí)行是如何同步進行的,也可以理解到,指令可以在一個指令周期內(nèi)執(zhí)行。但是,當有程序分支時(如CALL,GOTO或直接修改PC)是例外的,需要多花一個指令周期。圖示上標有*號的地方,你可以看到,在執(zhí)行CALL SUB_1這條指令時,同時預取了第4條指令BSF PORTA,3,程序是要調(diào)用SUB_1子程序,那么這條指令顯然是錯誤預取的。但是不用擔心,單片機的硬件會自動在下一個指令周期里刷掉被錯誤預取的指令4,同時在該指令周期內(nèi)預取SUB_1標號處的指令,那么接下來的Tcy5就是執(zhí)行子程序的指令了。從這個過程我們就可以理解,為什么程序分支時,需要兩個指令周期了。
3)單字指令,長字指令-因為程序和數(shù)據(jù)是完全獨立存儲的,所以指令和數(shù)據(jù)的寬度可以不一樣。PIC單片機的指令寬度有12位,14位和16位幾種,分別對應低中高三檔的系列。以中檔PIC16系列單片機為例,它的指令字長是14位的,我們把它叫做長字指令。如何個“長”法,來看一個例子
PIC單片機
MC68HC05
從圖示上,你可以清楚的看到PIC16的一條指令是一個14位的長字,這個長字的前面部分是操作碼,后半部分是操作數(shù)。和其他單片機比較來看,同樣功能操作的指令,會被翻譯成操作碼字節(jié)和操作數(shù)字節(jié),兩個字節(jié)。所以,從這里,你可以得到一個概念,就是,PIC的一條長字指令,大約等于其他單片機的兩個字節(jié)的指令。反映到程序空間上,就是PIC的1K字的程序空間,大約相當于其他單片機的2K字節(jié)的程序空間。當然,這個比例不是絕對的,不同的代碼會有不一樣的比例結(jié)果,但是這個1:2的近似結(jié)果有助于你在選擇PIC單片機型號時作為參考。對于長字指令,還有著另一個好處,就是:程序指針PC指向的任何地方都是一個指令長字,即使PC跑飛,所指向的也是一條合法的長字指令(因為操作碼的設(shè)計覆蓋了所有的二進制組合),這樣你就可以方便地用“陷阱”或“填充”等手段來減小PC跑飛帶來的誤操作。相對應地,操作碼和操作數(shù)分為兩個字節(jié)的單片機,一定程序上,存在PC跑飛后把操作數(shù)當成操作碼來譯碼的風險。盡管現(xiàn)在的單片機設(shè)計都有一定手段來克服這種PC錯位,但是它還是沒有PIC單片機這種單字指令來得方便。
4)精簡指令集,指令功能不重復
字節(jié)操作指令
NOP
MOVWF
CLRW
CLRF
SUBWF
DECF
IORWF
ANDWF
XORWF
ADDWF
MOVF
COMF
INCF
DECFSZ
RRF
RLF
SWAPF
INCFSZ
位操作指令
BCF
BSF
BTFSC
BTFSS
立即數(shù)和控制操作指令
SLEEP
CLRWDT
RETLW
RETFIE
RETURN
CALL
GOTO
MOVLW
IORLW
ADDLW
SUBLW
ANDLW
XORLW
注:f = 寄存器, k = 立即數(shù) (8位), b = 位地址 <0,7>, d = 目的地 (1=f, 0=W)
上面就是PIC中檔單片機的全部35條指令,這些指令可能對于初學者,顯得很陌生,但是當你去看英文數(shù)據(jù)手冊時,就會理解,這些指令,基本都是一句英文的首字母縮寫,比如BTFSC,就是Bit Test File register Skip if Clear(位測試某f寄存器,如果為0則跳過一條指令)。一共就這35條指令,就算你一開始不習慣,要不斷看指令表,但我想如果你開始寫程序,一天下來應該就能記住所有的指令。想想別的單片機一百多條指令,某些日系的8位單片機竟有四百多條指令,不是那么容易背下來吧。
5)文檔寄存器 - 英文的原文是file Register。在PIC單片機中只有兩類寄存器,一類是W,Working Register工作寄存器,只有一個,相當于51的A累加器,其他的所有寄存器都是F寄存器,也就是文檔寄存器。這里的“文檔”,是一個形象的描述,你可以理解除了W之外的所有通用RAM和特殊功能寄存器都是一個個的文檔,當需要操作的時候,取出某個文檔,和W經(jīng)過ALU中央運算單元運算后,結(jié)果既可以放到W里,也可以放到該文檔寄存器里。這里要強調(diào)的是,所有的通用RAM和特殊功能寄存器(如端口,控制寄存器等)都是文檔寄存器,所以對他們操作的指令都是一樣的。象有些單片機,對端口訪問,對普通RAM,對特殊功能寄存器的操作都要用不同的指令,相比起來,PIC單片機要方便得多。
PIC單片機的內(nèi)部結(jié)構(gòu)框圖
下圖是PIC單片機內(nèi)部結(jié)構(gòu)框圖。當然在學習單片機時,不是必須要了解芯片內(nèi)部究竟時如何工作的。但是,大略地看看這個圖,可以對PIC的某些特點有個初步的印象。從圖上你可以看到程序總線和數(shù)據(jù)總線是相互獨立的,在圖的左下角你可以看到片內(nèi)已經(jīng)做好了上電復位,掉電復位,看門狗,振蕩器起振延時器等為了增強單片機運行可靠性的模塊,在程序指針(Program Counter)下面,你會看到一個和其他單片機不一樣的地方,堆棧(Stack)。PIC單片機的堆棧是硬件堆棧,它和PC的寬度是一樣的。當發(fā)生中斷或者程序調(diào)用時,當前指令的PC+1(要清楚,前面講過流水線,執(zhí)行某條指令時,同時在預取PC+1處的指令)整個壓入堆棧,返回時整個退棧。硬件堆棧和某些單片機在RAM空間里開辟的堆棧相比,有一個好處,就是不用擔心因為堆棧的錯誤溢出而影響RAM區(qū)域,而且,你可以選擇壓棧后并不退棧,直接GOTO到其他處理。但是它也有自己的局限性,因為它是硬件的,所以堆棧的級數(shù)是有限的。對于PIC中檔單片機,硬件堆棧只有8級,所以CALL的嵌套不要超過7級;對于PIC18系列,硬件中斷則有31級?;蛟S,你會擔心堆棧不夠用,但是,實際上,一個程序CALL嵌套超過7級的實在很少,而且,完全可以通過改變程序流程來保證堆棧不會溢出的。
評論