新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PIC單片機(jī)基礎(chǔ)知識之一

PIC單片機(jī)基礎(chǔ)知識之一

作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
PIC16中檔單片機(jī)的基本架構(gòu)

PIC16中檔系列單片機(jī)是精簡指令集的單片機(jī),它具有以下特性:
——內(nèi)部為哈佛結(jié)構(gòu)
——指令流水線操作
——文檔寄存器的概念
——單指令周期
——所有指令為單字指令
——長字指令
——指令數(shù)很少
——指令實現(xiàn)的功能基本不重復(fù)
接下來分別介紹上面各個特性。
1)哈佛結(jié)構(gòu)-介紹哈佛結(jié)構(gòu)通常要和馮.紐曼結(jié)構(gòu)對比來介紹。我們熟悉的8086就是一種典型的馮.紐曼結(jié)構(gòu),它的程序和數(shù)據(jù)是共用同一個存儲空間,CPU也是使用同一個總線來訪問它們。那么,取指令和取數(shù)據(jù)勢必分時來進(jìn)行,這就限制了數(shù)據(jù)的流量。和它相對應(yīng)的哈佛結(jié)構(gòu),則是不同。哈佛結(jié)構(gòu)的典型特點就是程序和數(shù)據(jù)是分立的空間,CPU對程序和數(shù)據(jù)的訪問也是使用完全獨立的兩套總線。所以,相對于馮.紐曼結(jié)構(gòu),它可以同時從兩個空間取指令和取數(shù)據(jù),這就增加了數(shù)據(jù)流量。而且,因為兩個總線互不相干,所以,程序總線和數(shù)據(jù)總線可以做得不一樣寬。PIC單片機(jī)在設(shè)計之初選擇了哈佛結(jié)構(gòu),并基于程序總線的寬度,發(fā)展出了12位,14位和16位指令寬度的單片機(jī)系列,分別對應(yīng)的是PIC低檔系列,PIC16中檔系列,以及PIC18系列單片機(jī)。這里要說明的是,數(shù)據(jù)總線的寬度始終是8位,所以不管它的指令寬度是多少,它仍然還是8位單片機(jī)。

2)指令流水線操作-大部分的單片機(jī),取指令和執(zhí)行的過程是順序進(jìn)行的。PIC單片機(jī)在設(shè)計時引入了指令流水線的設(shè)計,使得單片機(jī)的取指和執(zhí)行可以同步進(jìn)行。我們來看下面的指令取指和執(zhí)行過程圖示。

Tcy0 Tcy1 Tcy2 Tcy3 Tcy4 ……指令周期
1.MOVLW 0x55 取指1 執(zhí)行1
2.MOVWF PORTB 取指2 執(zhí)行2
3.CALL SUB_1 取指3 執(zhí)行3
4.BSF PORTA,3 取指4* 刷掉錯誤的取指4
取SUB_1標(biāo)號處指令
從這個圖示上,我們可以看到取指和執(zhí)行是如何同步進(jìn)行的,也可以理解到,指令可以在一個指令周期內(nèi)執(zhí)行。但是,當(dāng)有程序分支時(如CALL,GOTO或直接修改PC)是例外的,需要多花一個指令周期。圖示上標(biāo)有*號的地方,你可以看到,在執(zhí)行CALL SUB_1這條指令時,同時預(yù)取了第4條指令BSF PORTA,3,程序是要調(diào)用SUB_1子程序,那么這條指令顯然是錯誤預(yù)取的。但是不用擔(dān)心,單片機(jī)的硬件會自動在下一個指令周期里刷掉被錯誤預(yù)取的指令4,同時在該指令周期內(nèi)預(yù)取SUB_1標(biāo)號處的指令,那么接下來的Tcy5就是執(zhí)行子程序的指令了。從這個過程我們就可以理解,為什么程序分支時,需要兩個指令周期了。

3)單字指令,長字指令-因為程序和數(shù)據(jù)是完全獨立存儲的,所以指令和數(shù)據(jù)的寬度可以不一樣。PIC單片機(jī)的指令寬度有12位,14位和16位幾種,分別對應(yīng)低中高三檔的系列。以中檔PIC16系列單片機(jī)為例,它的指令字長是14位的,我們把它叫做長字指令。如何個“長”法,來看一個例子
PIC單片機(jī) 指令示例: MOVLW 0x55 (解釋,給W工作寄存器賦立即數(shù)55H)
指令機(jī)器碼: 1100XX 0101 0101
操作碼 操作數(shù)

MC68HC05 指令示例: LDAA #55H (解釋,給A累加器賦立即數(shù)55H)
指令機(jī)器碼:1000 0110 <-操作碼
0101 0101 <-操作數(shù)
從圖示上,你可以清楚的看到PIC16的一條指令是一個14位的長字,這個長字的前面部分是操作碼,后半部分是操作數(shù)。和其他單片機(jī)比較來看,同樣功能操作的指令,會被翻譯成操作碼字節(jié)和操作數(shù)字節(jié),兩個字節(jié)。所以,從這里,你可以得到一個概念,就是,PIC的一條長字指令,大約等于其他單片機(jī)的兩個字節(jié)的指令。反映到程序空間上,就是PIC的1K字的程序空間,大約相當(dāng)于其他單片機(jī)的2K字節(jié)的程序空間。當(dāng)然,這個比例不是絕對的,不同的代碼會有不一樣的比例結(jié)果,但是這個1:2的近似結(jié)果有助于你在選擇PIC單片機(jī)型號時作為參考。對于長字指令,還有著另一個好處,就是:程序指針PC指向的任何地方都是一個指令長字,即使PC跑飛,所指向的也是一條合法的長字指令(因為操作碼的設(shè)計覆蓋了所有的二進(jìn)制組合),這樣你就可以方便地用“陷阱”或“填充”等手段來減小PC跑飛帶來的誤操作。相對應(yīng)地,操作碼和操作數(shù)分為兩個字節(jié)的單片機(jī),一定程序上,存在PC跑飛后把操作數(shù)當(dāng)成操作碼來譯碼的風(fēng)險。盡管現(xiàn)在的單片機(jī)設(shè)計都有一定手段來克服這種PC錯位,但是它還是沒有PIC單片機(jī)這種單字指令來得方便。

4)精簡指令集,指令功能不重復(fù)
字節(jié)操作指令
NOP - 空操作
MOVWF f 把W內(nèi)容送f
CLRW - 清除W
CLRF f 清除f
SUBWF f,d f減去W
DECF f,d f遞減1
IORWF f,d W和f邏輯或
ANDWF f,d W和f邏輯與
XORWF f,d W和f邏輯異或
ADDWF f,d W和f相加
MOVF f,d 傳送f
COMF f,d f取反
INCF f,d f遞增1
DECFSZ f,d f遞減1, 結(jié)果為0則跳
RRF f,d 帶進(jìn)位循環(huán)右移
RLF f,d 帶進(jìn)位循環(huán)左移
SWAPF f,d f高低4位內(nèi)容交換
INCFSZ f,d f遞增1, 結(jié)果為0則跳
位操作指令
BCF f,b f位清0
BSF f,b f位置1
BTFSC f,b f位測試, 為0則跳
BTFSS f,b f位測試, 為1則跳
立即數(shù)和控制操作指令
SLEEP - 進(jìn)入低功耗休眠模式
CLRWDT - 清看門狗
RETLW k W帶立即數(shù)返回
RETFIE - 中斷返回
RETURN - 子程序返回
CALL k 調(diào)用子程序
GOTO k 強(qiáng)行跳轉(zhuǎn)(k為9位地址描述)
MOVLW k W置立即數(shù)
IORLW k W和立即數(shù)邏輯或
ADDLW k W和立即數(shù)相加
SUBLW k 立即數(shù)減去W
ANDLW k W和立即數(shù)邏輯與
XORLW k W和立即數(shù)邏輯異或
注:f = 寄存器, k = 立即數(shù) (8位), b = 位地址 <0,7>, d = 目的地 (1=f, 0=W)
上面就是PIC中檔單片機(jī)的全部35條指令,這些指令可能對于初學(xué)者,顯得很陌生,但是當(dāng)你去看英文數(shù)據(jù)手冊時,就會理解,這些指令,基本都是一句英文的首字母縮寫,比如BTFSC,就是Bit Test File register Skip if Clear(位測試某f寄存器,如果為0則跳過一條指令)。一共就這35條指令,就算你一開始不習(xí)慣,要不斷看指令表,但我想如果你開始寫程序,一天下來應(yīng)該就能記住所有的指令。想想別的單片機(jī)一百多條指令,某些日系的8位單片機(jī)竟有四百多條指令,不是那么容易背下來吧。

5)文檔寄存器 - 英文的原文是file Register。在PIC單片機(jī)中只有兩類寄存器,一類是W,Working Register工作寄存器,只有一個,相當(dāng)于51的A累加器,其他的所有寄存器都是F寄存器,也就是文檔寄存器。這里的“文檔”,是一個形象的描述,你可以理解除了W之外的所有通用RAM和特殊功能寄存器都是一個個的文檔,當(dāng)需要操作的時候,取出某個文檔,和W經(jīng)過ALU中央運算單元運算后,結(jié)果既可以放到W里,也可以放到該文檔寄存器里。這里要強(qiáng)調(diào)的是,所有的通用RAM和特殊功能寄存器(如端口,控制寄存器等)都是文檔寄存器,所以對他們操作的指令都是一樣的。象有些單片機(jī),對端口訪問,對普通RAM,對特殊功能寄存器的操作都要用不同的指令,相比起來,PIC單片機(jī)要方便得多。


PIC單片機(jī)的內(nèi)部結(jié)構(gòu)框圖

下圖是PIC單片機(jī)內(nèi)部結(jié)構(gòu)框圖。當(dāng)然在學(xué)習(xí)單片機(jī)時,不是必須要了解芯片內(nèi)部究竟時如何工作的。但是,大略地看看這個圖,可以對PIC的某些特點有個初步的印象。從圖上你可以看到程序總線和數(shù)據(jù)總線是相互獨立的,在圖的左下角你可以看到片內(nèi)已經(jīng)做好了上電復(fù)位,掉電復(fù)位,看門狗,振蕩器起振延時器等為了增強(qiáng)單片機(jī)運行可靠性的模塊,在程序指針(Program Counter)下面,你會看到一個和其他單片機(jī)不一樣的地方,堆棧(Stack)。PIC單片機(jī)的堆棧是硬件堆棧,它和PC的寬度是一樣的。當(dāng)發(fā)生中斷或者程序調(diào)用時,當(dāng)前指令的PC+1(要清楚,前面講過流水線,執(zhí)行某條指令時,同時在預(yù)取PC+1處的指令)整個壓入堆棧,返回時整個退棧。硬件堆棧和某些單片機(jī)在RAM空間里開辟的堆棧相比,有一個好處,就是不用擔(dān)心因為堆棧的錯誤溢出而影響RAM區(qū)域,而且,你可以選擇壓棧后并不退棧,直接GOTO到其他處理。但是它也有自己的局限性,因為它是硬件的,所以堆棧的級數(shù)是有限的。對于PIC中檔單片機(jī),硬件堆棧只有8級,所以CALL的嵌套不要超過7級;對于PIC18系列,硬件中斷則有31級?;蛟S,你會擔(dān)心堆棧不夠用,但是,實際上,一個程序CALL嵌套超過7級的實在很少,而且,完全可以通過改變程序流程來保證堆棧不會溢出的。




評論


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

關(guān)閉