PIC16F887與MPLAB之應(yīng)用設(shè)計(jì)
前言 |
近年來(lái)由於半導(dǎo)體技術(shù)發(fā)展快速,使得電子產(chǎn)品的製造成本大幅降低,電子產(chǎn)品的使用也逐漸成為日常生活之中人們不可或缺的一部份,由於使用者的需求不同,電子產(chǎn)品也需不斷的求新求變。目前許多電子產(chǎn)品需利用單晶片微電腦(Single Chip Microcomputer) 作為控制核心,這一類的產(chǎn)品特色在於,只要將寫好的控制程式寫入單晶片的記憶體中,而且在單晶片外接一些週邊的電子元件,就可以形成一個(gè)新的電子產(chǎn)品,這一類電子產(chǎn)品在日常生活中隨處可見,例如生日卡片上的音樂(lè)IC、各式遙控器、行動(dòng)電話,以及家電用品和汽車等其他產(chǎn)品均有單片機(jī)的運(yùn)用,除此之外在個(gè)人電腦(PC)以及相關(guān)週邊也都需利用單片機(jī),另外工業(yè)控制應(yīng)用上更是少不了單片機(jī)。 |
繼學(xué)習(xí)和使用Intel MCS-51系列單片機(jī)之後,我們決定再研究Microchip PIC16F87X系列單片機(jī),以PIC16F877為研究目標(biāo),來(lái)探討單片機(jī)微電腦的組成架構(gòu),程式開發(fā)及控制應(yīng)用技術(shù),以此作為基礎(chǔ),再擴(kuò)展於其他類型單晶片的運(yùn)用與應(yīng)用電路設(shè)計(jì)。 |
I簡(jiǎn) 介 |
1.1單片機(jī)基本架構(gòu) |
單片機(jī)係指由中央處理單元(CPU),記憶體單元(Memory)及輸入/輸出單元三大部分所組成。其中CPU可分為兩部分,即算數(shù)邏輯(ALU)及控制單元(CU),CPU透過(guò)匯流排(BUS)執(zhí)行程式碼的Fetch、Decode、算數(shù)邏輯運(yùn)算及讀寫時(shí)序信號(hào)的控制。記憶體單元提供存放程式與資料之空間,包含唯讀記憶體(ROM)與隨機(jī)存取記憶體(RAM)。而輸入/輸出單元提供與外界週邊設(shè)備或元件溝通的管道。 |
1.1.1單片機(jī)微電腦 |
單片機(jī)微電腦(Single Chip Microcomputer)簡(jiǎn)稱為單片機(jī),而所謂單片機(jī)微電腦就是構(gòu)成一部微電腦系統(tǒng)所需的元件,如中央處理單元(CPU)、記憶體單元(Memory)、輸入/輸出(I/O)、時(shí)脈產(chǎn)生單元及相關(guān)週邊裝置製作在同一晶片上,而成為一能夠獨(dú)立運(yùn)作的控制系統(tǒng)。 |
1.2 PIC16F877 單晶片微電腦 |
PIC 16F87X系列單晶片是Microchip 公司所推出的產(chǎn)品,它為一顆RISC的八位元微電腦控制單晶片,搭配了高達(dá)8K的採(cǎi)用Flah型式的程式記憶體及5組的I/O PORT,和支援達(dá)14個(gè)中斷。 |
PIC16F877的特性說(shuō)明如下: |
●採(cǎi)用高性能的RISC CPU核心 |
1.3 MPLAB |
MPLAB是Microchip 公司對(duì)PIC系列單片機(jī)所發(fā)展的一套整合發(fā)展環(huán)境(Integrated Development Environment , IDE) MPLAB包含下列工具: |
☆MPLAB Editor─程式編輯器 ☆MPASM Assembler─程式組譯器 ☆MPLAB-SIM Software Simulator─軟體模擬器 ☆MPLAB-ICEMULATOR─硬體模擬器 ☆MPLAB-ICD─ICD元件的偵錯(cuò)模擬環(huán)境 |
II 系統(tǒng)架構(gòu) |
2.1 PIC16F87X單片機(jī)核心架構(gòu) |
PIC系列單片機(jī)為RISC架構(gòu)單片機(jī),它所採(cǎi)用的Harvard結(jié)構(gòu)和過(guò)去一般單晶片所採(cǎi)用的Von Neumann架構(gòu)最大的差異在於匯流排的改變。Von Neumann結(jié)構(gòu)是傳統(tǒng)的單晶片結(jié)構(gòu),程式記憶體和資料記憶體是在同一個(gè)記憶體區(qū)塊,記憶體與CPU之間只使用單一匯流排,不論是要對(duì)程式記憶體或資料記憶體作存取都是使用此匯流排,因此要完成一個(gè)指令通常必須依序使用匯流排,從指令的擷取、解碼、資料讀取、執(zhí)行到資料的寫入,最後的結(jié)果是一個(gè)指令大都需要等待好幾個(gè)週期才能完成。Harvard結(jié)構(gòu)改善了這樣的缺點(diǎn),主要是程式記憶體和資料記憶體使用不同的記憶體區(qū)塊,而且也有各自獨(dú)立的匯流排,這樣的做法大大的改善了指令執(zhí)行的頻寬,兩個(gè)匯流排可以同時(shí)的工作,最大的優(yōu)點(diǎn)是當(dāng)一個(gè)指令在執(zhí)行時(shí),已經(jīng)可以去抓下一個(gè)指令,因此對(duì)於運(yùn)作的效率會(huì)有顯著的提昇。 |
2.2內(nèi)部結(jié)構(gòu)圖 |
圖2.2為 PIC16F877單片機(jī)的內(nèi)部功能架構(gòu)圖,圖中說(shuō)明匯流排和各個(gè)功能方塊之間的連接方式,利用架構(gòu)圖可以讓我們對(duì)於整個(gè)系統(tǒng)更加的了解。 |
2.3接腳功能描述 |
下面列出PIC16F877單片機(jī)的接腳功能與說(shuō)明。 |
2.3單片機(jī)的振盪時(shí)脈 |
振盪時(shí)脈的速度決定了工作的速度,因?yàn)閮?nèi)部所有的動(dòng)作都是這個(gè)時(shí)脈來(lái)驅(qū)動(dòng)進(jìn)行。PIC16F87X的時(shí)脈輸入是由OSC/CLKIN和OSC2/CLKOUT兩支接腳來(lái)輸入的,時(shí)脈的速度可以分成四種模式: |
●LP模式─低功率振盪器 ●XT模式─振盪器/諧振器 ●HS模式─快速振盪器/諧振器 ●RC模式─電阻器/電容器 |
在LP、XT和HS模式之下,通常是使用石英振盪器(Crystal)或是陶瓷諧振器(ceramic resonator)連接在OSC1/CLKIN和OSC2/CLKOUT這兩支接腳上來(lái)產(chǎn)生振盪信號(hào)?;蚴侵苯佑猛獠康臅r(shí)脈信號(hào)輸入作為單晶片的時(shí)脈,這個(gè)時(shí)脈信號(hào)從OSC1/CLKIN接腳輸入單晶片,OSC2/CLKOUT接腳則不使用。 |
採(cǎi)用RC模式在成本考量會(huì)比較低,在實(shí)際的應(yīng)用上只需一個(gè)電容與一個(gè)電阻即可。 |
2.3.1指令週期與指令流程 |
工作時(shí)脈是單片機(jī)工作心臟,PIC16F877單片機(jī)時(shí)脈輸入是由OSC1接腳進(jìn)入單晶片,此時(shí)脈進(jìn)入單晶片後會(huì)被除以四,以產(chǎn)生四個(gè)不重疊的四相序時(shí)脈Q1~Q4,圖2-1為時(shí)序圖。在程式的執(zhí)行中,程式計(jì)數(shù)器(Program Counter , PC)用來(lái)記錄下一個(gè)要被執(zhí)行的指令碼位址,PC值的遞增由Q1上緣觸發(fā),接下來(lái)PC中指向位址的程式碼便會(huì)被從程式記憶體中擷取出來(lái),並放入指令暫存器(Instruction Register , IR) 之中,這個(gè)動(dòng)作是在Q1相序中完成,下依次Q1上緣觸發(fā)來(lái)臨時(shí)會(huì)觸發(fā)下一個(gè)PC值得擷取,而在同樣的Q2~Q4相序中,剛剛放在IR中的指令會(huì)解碼並被執(zhí)行。因此一個(gè)Q1~Q4相序便是一個(gè)指令週期,這種在一個(gè)指令週期中同時(shí)進(jìn)行「指令擷取」與「指令執(zhí)行」的動(dòng)作架構(gòu),即是所謂管線架構(gòu)(Pipeline),而PIC16F877採(cǎi)用兩層的Pipeline。 |
2.4記憶體架構(gòu) |
PIC16F877單片機(jī)的記憶體配置可分成三個(gè)部分,程式記憶體(Program Memory),資料記憶體(Data Memory)和EEPROM資料記憶體。 |
2.4.1程式記憶體 |
PIC16F877單片機(jī)總共具有8K的程式記憶體,程式記憶體以2K的大小為單位分頁(yè)(Page),因此共有四個(gè)分頁(yè)。其中特別注意記憶體中兩個(gè)位址,一個(gè)是0000h,稱之為「重置向量」(Reset Vector),這是程式的起始位址,也是單晶片重置後的起始位址;另一個(gè)位只是0004h,稱之為「中斷向量」(Interrupt Vector),當(dāng)有致能的中斷產(chǎn)生時(shí),程式計(jì)數(shù)器便會(huì)將當(dāng)時(shí)的pc值放到堆疊裡,然後跳到此位址,執(zhí)行此位址的指令。圖2.7為程式記憶體配置。 |
2.4.2資料記憶體 |
資料記憶體用來(lái)儲(chǔ)存程式執(zhí)行時(shí)的資料,PIC16F877單片機(jī)的資料記憶體在`用途上,可分為「特殊功能暫存器」(Special Function Register)和「一般用途暫存器」(General Purpose Register)兩種。特殊功能暫存器是單晶片內(nèi)部CPU與各週邊模組所使用的暫存器,由於這些週邊之功能的設(shè)定與使用都是透過(guò)記憶體存取的方式來(lái)設(shè)定相關(guān)的參數(shù)和存取其內(nèi)容,因此稱為「記憶體映射暫存器」。一般用途暫存器是留給寫程式人自行規(guī)劃使用,作為程式執(zhí)行中一些變數(shù)臨時(shí)儲(chǔ)存之用。 PIC16F877資料記憶體以128Bytes的大小規(guī)劃為一個(gè)Bank,共有四個(gè)Bank,在使用不同Bank中的記憶體位址時(shí),必須先設(shè)定STATUS暫存器中Bank Select Bit , RP1:RP0STATUS6:5>。RP1和RP0位元對(duì)應(yīng)所選擇Bank的如下: |
2.5 ALU與特殊功能暫存器 |
2.5.1算數(shù)邏輯單元與工作暫存器 |
PIC16F877單片機(jī)的核心包含一個(gè)8位元的「算數(shù)邏輯單元」(Arithmetic Logic Unit , ALU)它可以對(duì)「工作暫存器」(Working Register , W)中的資料和其他暫存器檔案中的資料進(jìn)行算數(shù)與邏輯的運(yùn)算,在運(yùn)算的過(guò)程中ALU也控制狀態(tài)位元(位於STATUS暫存器中),用來(lái)表示運(yùn)算的結(jié)果狀態(tài)。 |
「工作暫存器」(Working Register),即簡(jiǎn)稱W暫存器,這是一個(gè)8位元的暫存器,它不屬於資料記憶體的一部份,而是位於CPU之中供ALU在運(yùn)算中使用,因此W暫存器不是一個(gè)記憶體映射暫存器?;旧螦LU中所有的運(yùn)算都會(huì)用到W暫存器,但W暫存器是無(wú)法定址存取,只能借用所提供的指令來(lái)使用。 |
2.5.2狀態(tài)暫存器 |
STATUS暫存器,即狀態(tài)暫存器,其內(nèi)容包含了ALU計(jì)算結(jié)果的狀態(tài)、單晶片的重置狀態(tài)以及資料記憶體的選擇位元。 |
2.5.3程式計(jì)數(shù)器 |
「程式計(jì)數(shù)器」(Program counter , PC )儲(chǔ)存了下一個(gè)所要執(zhí)行指令在程式記憶體中的位址,因此程式計(jì)數(shù)器中的內(nèi)容代表了程式記憶體中某個(gè)位址,所以程式記憶體內(nèi)容的位元寬度和可以定址的位址寬度大小是相同,PIC16F877的程式計(jì)數(shù)器為13位元寬,因此可以定址的程式記憶體大小為8K。PC中13個(gè)位元,可以分成兩部分,較低八個(gè)位元PC7:0>為PCL,較高五個(gè)位元PC13:8>為PCH,PCH是我們看不到也無(wú)法存取,PCL則是一個(gè)記憶體映射暫存器,位址是0x02而且是一個(gè)unbank的暫存器,也就是透過(guò)0x82、0x102和0x182都可以直接使用與存取。 |
在使用GOTO與CALL指令時(shí),要注意一下希望跳躍到的程式位址是位於程式記憶體的哪一頁(yè)(Page)。因?yàn)檫@兩個(gè)指令可用的位址範(fàn)圍為2K,恰為記憶體暫存器一頁(yè)的大小,所以這兩個(gè)指令只能在同一頁(yè)的程式記憶體內(nèi)範(fàn)圍跳躍。因此當(dāng)所要跳躍的位只有跨頁(yè)(Cross Page)的情形時(shí),必須要根據(jù)目標(biāo)位址在哪一頁(yè),由設(shè)定PCLTH4:3>這兩個(gè)位元決定。 |
2.5.4堆疊 |
在程式的執(zhí)行流程上,有一個(gè)很重要的部分就是「堆疊」的使用,PIC16F877單片機(jī)的內(nèi)部有一個(gè)13位元寬,8層深的硬體堆疊,這個(gè)堆疊的目的是用來(lái)放置程式中有中斷或副程式呼叫時(shí),原來(lái)程式分歧點(diǎn)的PC內(nèi)容。堆疊的空間並不屬於任何的記憶體空間,而是一塊獨(dú)立的區(qū)塊,而且堆疊的使用時(shí)有一個(gè)堆疊指標(biāo)也不是我們可以讀取與控制的。當(dāng)中斷發(fā)生而且致能位元也有設(shè)定時(shí),當(dāng)時(shí)的PC值便會(huì)被放到堆疊之中,然後將PC填入0x04的值,0x04是PIC16877單晶片中斷向量位址,目的是將程式的執(zhí)行轉(zhuǎn)移到中斷起始位址,然後執(zhí)行相對(duì)應(yīng)的中斷副程式。在中斷副程式結(jié)束之後,再由堆疊中取回剛剛跳出程式的PC值,繼續(xù)執(zhí)行下去。同樣的使用CALL指令呼叫副程式時(shí),PC值也會(huì)放到堆疊中,待副程式執(zhí)行完後再取出。 |
由於堆疊有八層深,因此程式可以有八層的「跳躍─返回」的動(dòng)作,依照跳躍的順序先後,將跳躍位置的PC值存入堆疊中,取出PC值時(shí)則依相反的順序,先進(jìn)後出,後進(jìn)先出的方式取出PC值。如果已經(jīng)PUSH了八個(gè)PC值到堆疊中之後,再PUSH一個(gè)PC值到堆疊中,這個(gè)PC值會(huì)放到第一個(gè)放入PC值得位置,也就是以循環(huán)的方式來(lái)存入PC值,不過(guò)PIC的堆疊並沒(méi)有任何溢位旗標(biāo)或警告,因此在有好幾層副程式呼叫時(shí),要注意一下堆疊的使用是否溢位。 |
2.6中斷 |
在單片機(jī)內(nèi)軟體的流程處理,中斷有其非常重要的角色,中斷允許在主要程式流程中,插入其他事件處理的副程式作優(yōu)先運(yùn)算,並且把運(yùn)算結(jié)果回存到特定暫存器,供主程式運(yùn)算。PIC16F877提供了14個(gè)中斷源,每一個(gè)中斷都有一個(gè)中斷旗標(biāo)位元和一個(gè)中斷致能位元,中斷旗標(biāo)位元表示中斷元是否產(chǎn)生這個(gè)中斷,中斷致能位元決定要不要使用這個(gè)中斷,可經(jīng)使用者利用致能位元作需要的規(guī)劃。這14個(gè)中斷中11個(gè)中斷源屬於週邊模組的中斷,由一個(gè)週邊中斷致能位元PEIE來(lái)統(tǒng)一控制所有週邊有關(guān)的中斷使用與否,另外還有3個(gè)中斷位元加上這個(gè)週邊中斷致能位元再由一個(gè)全域中斷致能位元GIE來(lái)控制,圖2.9中斷元控制流程。 |
評(píng)論