陳韋中、欉振廷
-作者為本會學生會員現就讀於逢甲大學電子工程系 指導老師 蕭敏學-
 
前言
  近年來由於半導體技術發展快速,使得電子產品的製造成本大幅降低,電子產品的使用也逐漸成為日常生活之中人們不可或缺的一部份,由於使用者的需求不同,電子產品也需不斷的求新求變。目前許多電子產品需利用單晶片微電腦(Single Chip Microcomputer) 作為控制核心,這一類的產品特色在於,只要將寫好的控制程式寫入單晶片的記憶體中,而且在單晶片外接一些週邊的電子元件,就可以形成一個新的電子產品,這一類電子產品在日常生活中隨處可見,例如生日卡片上的音樂IC、各式遙控器、行動電話,以及家電用品和汽車等其他產品均有单片机的運用,除此之外在個人電腦(PC)以及相關週邊也都需利用单片机,另外工業控制應用上更是少不了单片机。
 
  繼學習和使用Intel MCS-51系列单片机之後,我們決定再研究Microchip PIC16F87X系列单片机,以PIC16F877為研究目標,來探討单片机微電腦的組成架構,程式開發及控制應用技術,以此作為基礎,再擴展於其他類型單晶片的運用與應用電路設計。
 
I簡 介
1.1单片机基本架構
  单片机係指由中央處理單元(CPU),記憶體單元(Memory)及輸入/輸出單元三大部分所組成。其中CPU可分為兩部分,即算數邏輯(ALU)及控制單元(CU),CPU透過匯流排(BUS)執行程式碼的Fetch、Decode、算數邏輯運算及讀寫時序信號的控制。記憶體單元提供存放程式與資料之空間,包含唯讀記憶體(ROM)與隨機存取記憶體(RAM)。而輸入/輸出單元提供與外界週邊設備或元件溝通的管道。
 
1.1.1单片机微電腦
  单片机微電腦(Single Chip Microcomputer)簡稱為单片机,而所謂单片机微電腦就是構成一部微電腦系統所需的元件,如中央處理單元(CPU)、記憶體單元(Memory)、輸入/輸出(I/O)、時脈產生單元及相關週邊裝置製作在同一晶片上,而成為一能夠獨立運作的控制系統。
 
1.2 PIC16F877 單晶片微電腦
  PIC 16F87X系列單晶片是Microchip 公司所推出的產品,它為一顆RISC的八位元微電腦控制單晶片,搭配了高達8K的採用Flah型式的程式記憶體及5組的I/O PORT,和支援達14個中斷。
 
  PIC16F877的特性說明如下:

  ●採用高性能的RISC CPU核心
  ●8位元微電腦控制晶片
  ●8Kx14程式記憶體(Flash)
  ●368Bytes資料記憶體及256Bytes的EEPROM資料記憶體
  ●5組I/O ports(A,B,C,D,E)
  ●2組8位元計時/計數器Timer0,Timer2,及1組16位元計時/計數器Timer1
  ●支援14個中斷處理

 
1.3 MPLAB
  MPLAB是Microchip 公司對PIC系列单片机所發展的一套整合發展環境(Integrated Development Environment , IDE) MPLAB包含下列工具:
  ☆MPLAB Editor─程式編輯器
  ☆MPASM Assembler─程式組譯器
  ☆MPLAB-SIM Software Simulator─軟體模擬器
  ☆MPLAB-ICEMULATOR─硬體模擬器
  ☆MPLAB-ICD─ICD元件的偵錯模擬環境
 
II 系統架構
2.1 PIC16F87X单片机核心架構
  PIC系列单片机為RISC架構单片机,它所採用的Harvard結構和過去一般單晶片所採用的Von Neumann架構最大的差異在於匯流排的改變。Von Neumann結構是傳統的單晶片結構,程式記憶體和資料記憶體是在同一個記憶體區塊,記憶體與CPU之間只使用單一匯流排,不論是要對程式記憶體或資料記憶體作存取都是使用此匯流排,因此要完成一個指令通常必須依序使用匯流排,從指令的擷取、解碼、資料讀取、執行到資料的寫入,最後的結果是一個指令大都需要等待好幾個週期才能完成。Harvard結構改善了這樣的缺點,主要是程式記憶體和資料記憶體使用不同的記憶體區塊,而且也有各自獨立的匯流排,這樣的做法大大的改善了指令執行的頻寬,兩個匯流排可以同時的工作,最大的優點是當一個指令在執行時,已經可以去抓下一個指令,因此對於運作的效率會有顯著的提昇。
 
2.2內部結構圖
  圖2.2為 PIC16F877单片机的內部功能架構圖,圖中說明匯流排和各個功能方塊之間的連接方式,利用架構圖可以讓我們對於整個系統更加的了解。
 
2.3接腳功能描述
  下面列出PIC16F877单片机的接腳功能與說明。
  
 
 
2.3单片机的振盪時脈
  振盪時脈的速度決定了工作的速度,因為內部所有的動作都是這個時脈來驅動進行。PIC16F87X的時脈輸入是由OSC/CLKIN和OSC2/CLKOUT兩支接腳來輸入的,時脈的速度可以分成四種模式:
  ●LP模式─低功率振盪器
  ●XT模式─振盪器/諧振器
  ●HS模式─快速振盪器/諧振器
  ●RC模式─電阻器/電容器
  在LP、XT和HS模式之下,通常是使用石英振盪器(Crystal)或是陶瓷諧振器(ceramic resonator)連接在OSC1/CLKIN和OSC2/CLKOUT這兩支接腳上來產生振盪信號。或是直接用外部的時脈信號輸入作為單晶片的時脈,這個時脈信號從OSC1/CLKIN接腳輸入單晶片,OSC2/CLKOUT接腳則不使用。
 
  採用RC模式在成本考量會比較低,在實際的應用上只需一個電容與一個電阻即可。
 
2.3.1指令週期與指令流程
  工作時脈是单片机工作心臟,PIC16F877单片机時脈輸入是由OSC1接腳進入單晶片,此時脈進入單晶片後會被除以四,以產生四個不重疊的四相序時脈Q1~Q4,圖2-1為時序圖。在程式的執行中,程式計數器(Program Counter , PC)用來記錄下一個要被執行的指令碼位址,PC值的遞增由Q1上緣觸發,接下來PC中指向位址的程式碼便會被從程式記憶體中擷取出來,並放入指令暫存器(Instruction Register , IR) 之中,這個動作是在Q1相序中完成,下依次Q1上緣觸發來臨時會觸發下一個PC值得擷取,而在同樣的Q2~Q4相序中,剛剛放在IR中的指令會解碼並被執行。因此一個Q1~Q4相序便是一個指令週期,這種在一個指令週期中同時進行「指令擷取」與「指令執行」的動作架構,即是所謂管線架構(Pipeline),而PIC16F877採用兩層的Pipeline。
 
2.4記憶體架構
  PIC16F877单片机的記憶體配置可分成三個部分,程式記憶體(Program Memory),資料記憶體(Data Memory)和EEPROM資料記憶體。
 
2.4.1程式記憶體
  PIC16F877单片机總共具有8K的程式記憶體,程式記憶體以2K的大小為單位分頁(Page),因此共有四個分頁。其中特別注意記憶體中兩個位址,一個是0000h,稱之為「重置向量」(Reset Vector),這是程式的起始位址,也是單晶片重置後的起始位址;另一個位只是0004h,稱之為「中斷向量」(Interrupt Vector),當有致能的中斷產生時,程式計數器便會將當時的pc值放到堆疊裡,然後跳到此位址,執行此位址的指令。圖2.7為程式記憶體配置。
 
2.4.2資料記憶體
  資料記憶體用來儲存程式執行時的資料,PIC16F877单片机的資料記憶體在`用途上,可分為「特殊功能暫存器」(Special Function Register)和「一般用途暫存器」(General Purpose Register)兩種。特殊功能暫存器是單晶片內部CPU與各週邊模組所使用的暫存器,由於這些週邊之功能的設定與使用都是透過記憶體存取的方式來設定相關的參數和存取其內容,因此稱為「記憶體映射暫存器」。一般用途暫存器是留給寫程式人自行規劃使用,作為程式執行中一些變數臨時儲存之用。 PIC16F877資料記憶體以128Bytes的大小規劃為一個Bank,共有四個Bank,在使用不同Bank中的記憶體位址時,必須先設定STATUS暫存器中Bank Select Bit , RP1:RP0STATUS<6:5>。RP1和RP0位元對應所選擇Bank的如下:
 
2.5 ALU與特殊功能暫存器
2.5.1算數邏輯單元與工作暫存器
  PIC16F877单片机的核心包含一個8位元的「算數邏輯單元」(Arithmetic Logic Unit , ALU)它可以對「工作暫存器」(Working Register , W)中的資料和其他暫存器檔案中的資料進行算數與邏輯的運算,在運算的過程中ALU也控制狀態位元(位於STATUS暫存器中),用來表示運算的結果狀態。
  「工作暫存器」(Working Register),即簡稱W暫存器,這是一個8位元的暫存器,它不屬於資料記憶體的一部份,而是位於CPU之中供ALU在運算中使用,因此W暫存器不是一個記憶體映射暫存器。基本上ALU中所有的運算都會用到W暫存器,但W暫存器是無法定址存取,只能借用所提供的指令來使用。
 
2.5.2狀態暫存器
  STATUS暫存器,即狀態暫存器,其內容包含了ALU計算結果的狀態、單晶片的重置狀態以及資料記憶體的選擇位元。
 
2.5.3程式計數器
  「程式計數器」(Program counter , PC )儲存了下一個所要執行指令在程式記憶體中的位址,因此程式計數器中的內容代表了程式記憶體中某個位址,所以程式記憶體內容的位元寬度和可以定址的位址寬度大小是相同,PIC16F877的程式計數器為13位元寬,因此可以定址的程式記憶體大小為8K。PC中13個位元,可以分成兩部分,較低八個位元PC<7:0>為PCL,較高五個位元PC<13:8>為PCH,PCH是我們看不到也無法存取,PCL則是一個記憶體映射暫存器,位址是0x02而且是一個unbank的暫存器,也就是透過0x82、0x102和0x182都可以直接使用與存取。
  在使用GOTO與CALL指令時,要注意一下希望跳躍到的程式位址是位於程式記憶體的哪一頁(Page)。因為這兩個指令可用的位址範圍為2K,恰為記憶體暫存器一頁的大小,所以這兩個指令只能在同一頁的程式記憶體內範圍跳躍。因此當所要跳躍的位只有跨頁(Cross Page)的情形時,必須要根據目標位址在哪一頁,由設定PCLTH<4:3>這兩個位元決定。
 
2.5.4堆疊
  在程式的執行流程上,有一個很重要的部分就是「堆疊」的使用,PIC16F877单片机的內部有一個13位元寬,8層深的硬體堆疊,這個堆疊的目的是用來放置程式中有中斷或副程式呼叫時,原來程式分歧點的PC內容。堆疊的空間並不屬於任何的記憶體空間,而是一塊獨立的區塊,而且堆疊的使用時有一個堆疊指標也不是我們可以讀取與控制的。當中斷發生而且致能位元也有設定時,當時的PC值便會被放到堆疊之中,然後將PC填入0x04的值,0x04是PIC16877單晶片中斷向量位址,目的是將程式的執行轉移到中斷起始位址,然後執行相對應的中斷副程式。在中斷副程式結束之後,再由堆疊中取回剛剛跳出程式的PC值,繼續執行下去。同樣的使用CALL指令呼叫副程式時,PC值也會放到堆疊中,待副程式執行完後再取出。
  由於堆疊有八層深,因此程式可以有八層的「跳躍─返回」的動作,依照跳躍的順序先後,將跳躍位置的PC值存入堆疊中,取出PC值時則依相反的順序,先進後出,後進先出的方式取出PC值。如果已經PUSH了八個PC值到堆疊中之後,再PUSH一個PC值到堆疊中,這個PC值會放到第一個放入PC值得位置,也就是以循環的方式來存入PC值,不過PIC的堆疊並沒有任何溢位旗標或警告,因此在有好幾層副程式呼叫時,要注意一下堆疊的使用是否溢位。
 
2.6中斷
  在单片机內軟體的流程處理,中斷有其非常重要的角色,中斷允許在主要程式流程中,插入其他事件處理的副程式作優先運算,並且把運算結果回存到特定暫存器,供主程式運算。PIC16F877提供了14個中斷源,每一個中斷都有一個中斷旗標位元和一個中斷致能位元,中斷旗標位元表示中斷元是否產生這個中斷,中斷致能位元決定要不要使用這個中斷,可經使用者利用致能位元作需要的規劃。這14個中斷中11個中斷源屬於週邊模組的中斷,由一個週邊中斷致能位元PEIE來統一控制所有週邊有關的中斷使用與否,另外還有3個中斷位元加上這個週邊中斷致能位元再由一個全域中斷致能位元GIE來控制,圖2.9中斷元控制流程。
                              PIC单片机 www.pic16.com