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