註: 本文為中文翻譯,原文請見底下網址:
http://www.mikroe.com/eng/chapters/view/2/chapter-1-pic16f887-microcontroller-device-overview/
TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C
Chapter 1: PIC16F887 Microcontroller - Device Overview
PIC16F887 是 Microchip 最新的一個產品。現代微控制器有的功能它大部份都有。它是一個理想的解決方案,因為它價格低廉、應用範圍廣、品質高而且容易取得,可應用於諸如此類的場合:工業流程控制,機械控制設備,各種不同數值的測量等,它的一些主要功能條列於下:
Fig. 1-1 PIC16F887 PDIP 40 Microcontroller
Fig. 1-2 PIC16F887 QFN 44 Microcontroller
Fig. 1-3 PIC16F887 Block Diagram
腳位說明 (Pin Description)
如上圖 Fig. 1‑1 所見,大部份腳位是多功能的。例如,第 15 支腳位 RA3/AN3/Vref+/C1IN+ 說明了它具有下列功能:
- RA3 是 PortA 第 3 個數位輸入/輸出 (digital input/output)
- AN3 是第 3 個類比輸入 (analog input)
- Vref+ 是正參考電壓 (positive reference voltage)
- C1IN+ 是 C1 Comparator 的正向輸入 (positive input)
這個小竅門會經常用到,因為它使微控制器封裝得以更加緊湊小巧,而不影響其功能。這些不同的腳位功能不能同時使用,但是可以在運作的時候隨時改變。
下列表格談及 40-Pin PDIP 封裝的微控制器。
Table 1-1 cont. Pin Assignment
Table 1-1 cont. Pin Assignment
中央處理器 (CPU)
在這個階段我不想讓你對 CPU 的運作感到厭煩,不過重要的是得指出這顆是 RISC 技術製造的 CPU,在選擇使用微控制器的時候這是一個重要的因素。
RISC 精簡指令集電腦,給了 PIC16F887 兩大優點:
- CPU 只認識 35 條簡單的指令 (為了撰寫其它 CISC 微控制器的程式,得知道 200 多條指令)。
- 除了 2 兩條指令外,所有指令的執行時間都是相同的,每個指令 4 個週期 (clock cycles)(利用石英晶體提供穩定的振盪頻率)。Jump 和 Branch 兩個指令的執行時間是 2 個指令週期。這意味著,如果微控制器的運行速度為 20MHz,每個指令的執行時間將會是 200ns,即程式將以每秒 5 百萬條指令的速度執行!
記憶體
這顆微控制器有三種記憶體:ROM, RAM 和 EEPROM。因為它們每個都有特定的功能、特點和組織,這些記憶體將分別討論。
ROM
ROM 用來永久保存要被執行的 program。這就是為什麼它通常被稱為 program memory。PIC16F887 具有 8 KB 的 ROM(共 8192 個位置)。由於 ROM 是以 FLASH 技術製造的,ROM 的內容可以透過供應程式燒錄電壓 (programming voltage) (13V) 以改變之。
無論如何,沒有必要詳細解釋,因為它是透過 PC 上一支特殊的程式以及一個叫 Programmer (燒錄工具) 的電子設備自動完成的。
EEPROM
跟 program memory 很像,EEPROM 中的內容是永久保存的,即便是機器斷電。然而,不像 ROM,EEPROM 中的內容可以在微控制器運作的時候改變。這就是為什麼 EEPROM(256 個位置)是一個用於永久保存運作過程中產生的結果的記憶體。
RAM
這是微控制器第三個而且是最複雜的記憶體。它包括兩個部分:一般用途暫存器 (gernal-purpose registers) 和特殊功能暫存器(SFR)。
儘管兩組暫存器的內容在斷電時都會被清除,抑且它們是以相同的方式製造的而且行為相似,其功能共同點倒是不多。
Fig. 1-6 SFR and General Purpose Registers
通用暫存器 (General-Purpose Registers)
通用暫存器 (General-Purpose registers) 用於保存微控制器運作過程中暫時的資料與產生的結果。例如,假如程式執行計數工作(例如,計算組裝生產線的產品數量),此時有必要有個我們日常生活中所說的 "sum" 暫存器。由於微控制器沒有想像力,有必要指定某個 general purpose register 的位址,並給這個位址一個新功能。應該要建立一支簡單的程式,每當一個產品經過感測器的時候,就遞增這個暫存器。
因此,微控制器便可以執行這支程式,因為它現在知道這個遞增用的 sum 暫存器是什麼與身在何處。與這個簡單的範例類似的是,每個程式變數 (program variable) 都必須預先指定其 general purpose register。
特殊功能暫存器 (SFR Registers)
特殊功能暫存器 (Special-Function registers) 也是 RAM 記憶體位置,但是不像 general-purpose registes,其用途是在製造過程中便已預先決定,而且不能改變。由於他們的位元實體連接到晶片的特定電路(A/D converter,序列通訊模組等),其內容的任何改變,會直接影響微控制器的運作或是它的某些電路。例如,通過改變 TRISA 暫存器,在某種程度上來說,port A 的每支腳位便扮演輸入或輸出的角色。另一個特點是,這些記憶體位置有自己的名稱(暫存器名稱與每個位元的名稱),這大大方便了程式的編寫工作。由於高階語言可以使用全部的暫存器與其確切位址的目錄表,要閱讀或更改暫存器的內容,只要指定暫存器名稱就足夠了。
RAM Memory Banks
Data memory 分成 4 個 banks。在撰寫程式的時候,在存取某個暫存器 (為了讀取或改變其內容)之前,有必要選擇含有該暫存器的 bank。STATUS 暫存器的兩個位元用來選擇 bank,這將在後面討論。為了便於操作,最常用的幾個暫存器在所有 banks 的位址都是一樣的,這使得這些暫存器得以很方便的存取。
堆疊 (STACK)
RAM 有一部份用來當作 stack,stack 由 8 個 13-bit 的暫存器組成。在微控制器開始執行一個 subroutine(CALL 指令)之前,或者是當一個中斷發生時,目前正在執行的下一條指令會被 push 到 stack 上,即 push 到 stack 其中一個暫存器中。這樣一來,在 subroutine 或中斷服務函式執行完後,微控制器就知道該從哪裡繼續正常執行程式。因為沒有保存其內容的必要,這塊位址的內容在跳回主程式的時候會被清除,而且這麼一來 stack 的一塊位置便自動空出以便進一步的使用。
了解 stack 是環形的 (circular) 是很重要的一件事。這意味著當 stack 已經被 push 了 8 次後,第 9 次的 push 將覆蓋第 1 次的內容,第 10 次覆蓋掉第 2 次的,以此類推。資料這樣覆蓋掉後便無法復原。此外, programmer 不能存取這些暫存器,而且也沒有 Status bit 可以表示 stack overflow 或 stack underflow 的情況。因此,在撰寫程式的時候應該特別注意這點。
中斷系統 (Interrupt System)
當中斷請求到達時,微控制器做的第一件事是執行當前的指令並停止正常程式的執行。緊接著,下個指令的位址自動被 push 到 stack 上,並且一個預設的位址 (由製造商預先定義好的) 會寫到 program counter。程式接著執行的位置稱為 interrupt vector。對於 PIC16F887 而言,該地址是 0004h。從下圖可見,含有中斷向量的位置在正常程式執行的時候會忽略跳過。
當中斷請求到達的時候,程式的一部份會被呼叫,這部份稱為中斷服務函式。它的第一個指令位於中斷向量。如同中斷來源本身,中斷服務函式會執行多久,它會是如何,取決於 programmer 的程式技巧。有些微控制器有較多的中斷向量(每個中斷請求有其向量),在目前 PIC16F887 的身上只有一個。因此,中斷服務函式的第一部份由識別中斷來源的邏輯組成。
最後,當識別出中斷來源而且中斷服務函式也執行了,微控制器跑到 RETFIE 指令,它會從 stack 中 pop 出位址,並從它離開的地方繼續執行程式。
如何使用 SFRs
你買了微控制器而且有一個使用它的好主意...SFRs 和其全部的位元有張很長的列表。每個 SFR 控制某些處理方法。總之,它看起來像一張很多儀器與開關的大控制表。你現在關心的是:能否學會使用它們?你可能不會,但不要擔心,你不必擔心!如此強大的微控制器很像一個超級市場:它們提供這麼多低價格的東西,任君挑選。因此,選擇你感興趣的領域,並且只研究你需要知道的東西。之後,當你完全了解硬體的運作後,研究控制它的 SFRs(通常只是少數幾個)。重申一次,在撰寫程式時,在改變這些暫存器的內容之前,不要忘了選擇適當的 bank。這就是為什麼它們會被列在上面的表格中。
感謝您的分享,看到一個小小的地方:
回覆刪除指令)之前,或者是當一個中斷髮生時
髮生可能須要更正一下。
不客氣。
回覆刪除髮生? 請問是哪一段?
在堆疊 (STACK)那段,或是您把:
回覆刪除「或者是當一個中斷髮生時」
這行字拿去搜尋一下就行了。
謝謝你。可是 Stack 那段我是寫「或者是當一個中斷發生時」,在你電腦上看到的「發」變成「髮」了嗎?
回覆刪除好像是這樣@@
回覆刪除我在右邊的Recent Comments看到的是發,在文章裡看到的是髮
真是奇妙的現象……
嗯……大概我的電腦中邪了,請不要理我
有這種事?
回覆刪除我用的是無蝦米輸入法,「發」的字根是 FX,「髮」的字根 VAX,按理「發」應該是不會打錯成「髮」的。
你是用什麼 OS 跟 Browser? 真是奇特的現象。
winXP
回覆刪除firefox 8.0
有圖有真象:
http://ppt.cc/Vs8p