官术网_书友最值得收藏!

2.1 PIC單片機的CPU

微芯公司生產的PIC16F87X系列單片機的CPU具有以下特色:

● 振蕩器可選。

● 多種復位功能。

● 多種中斷方式。

● 監視定時器。

● 睡眠模式。

● 在線調試功能。

● 代碼保護。

● 可編程ID識別碼。

● 在線串行編程。

2.1.1 系統配置

在PIC系列單片機的程序存儲區中,一般留出了6個具有特殊功能的單元,由用戶自行配置,從而實現一些特殊的功能。這幾個存儲單元不在常規用戶程序存儲空間,且不能被用戶程序訪問到,而只能在對單片機進行編程或校驗時,由編程器燒入或讀出。在這6個特殊功能的存儲單元中,位于2007H的單元為系統配置字;位于2006H的單元存放器件識別碼;位于2000H~2003H的4個單元存放用戶識別碼。

對于PIC16F87X單片機中位于2007H的系統配置字①,可用來定義一些系統性能,具體定義如下所示:

● bit 13~bit 12 CP1~CP0:程序存儲器代碼保護位②。

● bit 5~bit 4 CP1~CP0:

? 11:代碼保護功能關閉。

? 10:1F00h~1FFFFh的代碼被保護(對于PIC16F877/876)。

? 10:0F00h~0FFFh的代碼被保護(對于PIC16F874/873)。

? 10:不支持(對于PIC16F870/871/872)。

? 01:1000h~1FFFFh的代碼被保護(對于PIC16F877/876)。

? 01:0800h~0FFFh的代碼被保護(對于PIC16F874/873)。

? 01:不支持(對于PIC16F870/871/872)。

? 00:0000h~1FFFh的代碼被保護(對于PIC16F877/876)。

? 00:0000~0FFFh的代碼被保護(對于PIC16F874/873)。

? 00:0000~07FFh的代碼被保護(對于PIC16F870/871/872)。

● bit11 DEBUG:在線調試模式。

? 1:關閉在線調試功能,RB6和RB7為普通I/O端口。

? 0:開啟在線調試功能,RB6和RB7被調試功能占用。

● bit 10未被使用,讀作1。

● bit 9 WRT:程序存儲器寫使能位。

? l:未被保護的程序存儲器,可以通過EECON寄存器控制被燒寫。

? 0:未被保護的程序存儲器,不可以通過EECON寄存器控制被燒寫。

● bit 8 CPD:E2PROM數據存儲器代碼保護。

? 1:關閉保護功能。

? 0:開啟代碼保護功能。

● bit 7 LVP:低電壓在線串行編程使能位。

? 1:RB3/PGM引腳為PGM功能,低電壓編程被使能。

? 0:RB3引腳為數字I/O端口功能,MCLR引腳必須加高電壓,用于編程。

● bit6 BODEN:掉電鎖存復位使能位③。

? 1:允許掉電鎖存復位。

? 0:禁止掉電鎖存復位。

● bit 3 PWRTE:上電定時器使能位③。

? 1:上電定時器被關閉。

? 0:上電定時器被使能。

● bit 2 WDTE:看門狗使能位。

? 1:看門狗被使能。

? 0:看門狗被關閉。

● bit 1~bit 0 FOSC1~FOSC0:振蕩器模式選擇位。

? 11:選擇RC阻容振蕩器模式。

? 10:選擇HS高速振蕩模式。

? 01:選擇XT標準振蕩器模式。

? 00:選擇LP低速振蕩模式。

注:① 沒有被編程/近擦除過的配置字的內容為3FFFh。

② 為了起到代碼保護功能,配置字中的兩個CP1:CP0位對的賦值必須相同。

③ 無論PWRTE位為何值,使能掉電鎖存復位都會自動使能上電定時器(PWRT)。當掉電復位被使能時,要確保上電定時器被使能。

2.1.2 振蕩器配置

1.振蕩方式

PIC16F87X系列單片機可工作于4種不同的振蕩模式下。用戶可通過對系統配置字中的FOSC1和FOSC0兩位的編程來選擇4種振蕩模式中的任意一種。這4種振蕩模式如下:

● LP低功耗振蕩(LOW Power)

● XT標準晶體振蕩(Crystal/Resonator)

● HS高速晶體振蕩(High Speed)

● RC阻容振蕩(Reastor/Capacitor)

2.晶體振蕩器/陶瓷諧振器

在LP、XT和HS模式下,PIC單片機既可以使用集成在片內的振蕩器,也可以使用外部時鐘源。當使用片內振蕩器時,需要一個晶體諧振器或陶瓷諧振器連接到單片機的OSC1/CLKIN和OSC2/CLKOUT引腳上,以建立振蕩,如圖2-1所示。

圖2-1 晶體或陶瓷振蕩電路

電容C1和C2的選擇可參考表2-1和表2-2。選擇C1、C2理想的情況是保證系統在高溫和最低工作電壓下能夠正常工作,使得電容在數據手冊推薦的范圍內最小。同時應使C2比C1大一些以加大相移,使其有利于振蕩電路的上電啟動。在HS模式和XT模式中,電阻RS可以用來防止晶振被過分驅動。當晶振、振蕩類型和電容值都確定后,就需要決定RS的值了。簡單的辦法就是使系統工作在最低溫度和最大電壓情況下,此時得到的即是時鐘電路最大輸出幅度。用示波器觀察引腳OSC2的輸出波形(注意,示波器的探頭將為電路引入一個電容,一般為幾個pF),如果發現正弦波的峰(接收VDD處)和谷(接收Vss處)被削或壓扁,則表明驅動過載,需要在OSC2和C2間加入1個電阻Rs。選擇電阻Rs值大小的最簡單的方法就是串聯一個5kΩ或10kΩ的微調電阻,從0開始慢慢調高,一直到正弦波不再被削平為止。通過此辦法就可以找到最接近的電阻RS值。需要注意的是,RS不宜過大,過大將使得輸入和輸出產生隔離,從而產生較大的噪聲。當需要一個較大的RS才能消除過載驅動時,可以通過增加負載電容C2進行補償。

表2-1 外接陶瓷諧振器時電容值的選擇

表2-2 外接晶體諧振器時電容位的選擇

當接外部振蕩器時,外部時鐘信號從OSC1端輸入,OSC2開路,如圖2-2所示。外部振蕩器一般使用有源晶振(也稱晶體振蕩器),有VCC、GND、CLK和NC(No Connect)4個引腳,只要接上電源和地即可使用。與無源晶體(也稱晶體諧振器)相比,有源晶振信號比較穩定,但體積較大,不過隨著SMD(Surface Mount Device)技術的不斷發展,該問題已經逐漸得到解決。

圖2-2 外部時鐘輸入模式

3.RC振蕩電路

在對振蕩精度要求不高的系統中,使用RC振蕩可以節省成本。RC振蕩電路如圖2-3所示。其振蕩頻率與供電電壓VDD、外接電阻REXT、外接電容CEXT和工作溫度有關。此外,對于同種型號不同封裝的芯片,阻容振蕩頻率也會不同,尤其是當CEXT較小時。另外,外接電阻和外接電容的精度也是影響阻容振蕩頻率的一個因素。

圖2-3 RC振蕩電路

2.1.3 復位

復位就是要單片機應用系統在正式工作前處于一種特定的狀態,只有以該狀態為起點,隨后的工作才有可能是正常與可靠的。復位電路增加了系統的可靠性,對于單片機來說它不可或缺。

1.PIC16F87X系列單片機的復位類型

PIC16F87X系列單片機的一個突出的優點就是提供了強大的片上復位功能,如圖2-4所示。歸納起來共有6種不同的復位方式,如下所列,其復位源可通過軟件來設置。

圖2-4 PIC16F87X系列單片機片上復位電路簡易原理圖

注:此振蕩器與CLKIN端的RC振蕩器不同。

● 上電復位POR(Power-On Reset)。

● 正常狀態下的人工復位MCLR。

● 睡眠狀態下的人工復位MCLR。

● 正常狀態下的看門狗復位。

● 睡眠中的看門狗喚醒。

● 掉電鎖存復位BOR(Brown-Out Reset)。

(1)上電復位(POR)。PIC16F87X單片及內部有上電檢測電路,當檢測到電源電壓VDD上升到1.2~1.7V時,芯片就會產生一個復位脈沖,可以把MCLR引腳直接接到VDD或通過一個電阻上拉到VDD,而不必像其他類型的單片機應用系統那樣需要搭一個RC電路來實現上電復位功能(注意,為保證上電復位功能的實現,電源電壓VDD的上升速率應大于0.05V/ms)。

(2)正常狀態下的人工復位MCLR。單片機在正常工作狀態下,當MCLR引腳為低電子時,就會使單片機復位。

(3)睡眠狀態下的人工復位MCLR。單片機在睡眠狀態下,當MCLR引腳為低電平時,也會使單片機復位。

(4)正常狀態下的看門狗復位。在正常工作狀態下,如果沒有定期“喂狗”(即沒有對看門狗定時器WDT進行周期性的、及時的清零),就會引起單片機復位。

(5)睡眠中的看門狗喚醒。在睡眠狀態中,看門狗定時器WDT時間一到,單片機就會從睡眠狀態中被喚醒,進入正常工作狀態,而不會引起復位。

(6)掉電鎖存復位。如果掉電鎖存復位電路被使能,則當VDD下降到低于VBOR(約4V)并持續時間超過TBOR(100μs)時,就會使單片機復位。

2.復位狀態

單片機復位而進入初始化狀態后,其內部的特殊功能寄存器的值如表2-3~表2-7所示。

表2-3 電源控制寄存器和狀態寄存器的復位值

注:x:不考慮;u:不變。

表2-7 PIC16F873/874/876/877寄存器的復位狀態

續表

注:① INTCON、PIR1和/或PIR2中的一位或多位會受到影響(引起喚醒)。

② 由中斷引起喚醒時,PC指針中裝載的是中斷矢量0004H。

③ 程序計數器、狀態寄存器和電源控制寄存器的復位值見表2-4。

表2-4 程序計數器、狀態寄存器和電源控制寄存器的復位值

注:x:隨機;u:不變;-:未用的位,讀作“0”。

① 當由中斷引起喚醒時,PC指針裝載的是中斷矢量(0004H)。

表2-5 PIC16F870/871寄存器的復位狀態

續表

注:x:不確定;u:不變;r:保留;-:不可用,讀作0;q:該位的值視情況而定。若無特殊說明,本書中所有與寄存器相關的表格中出現的上述符號/字母均作此解釋。

① INTCON、PIR1和/或PIR2中的一位或多位會受到影響(引起喚醒)。

② 由中斷引起喚醒時,PC指針中裝載的是中斷矢量0004H。

③ 程序計數器、狀態寄存器和電源控制寄存器的復位值見表2-4。

表2-6 PIC16F872寄存器的復位狀態

注:① INTCON、PIR1和/或PIR2中的一位或多位會受到影響(引起喚醒)。

② 由中斷引起喚醒時,PC指針中裝載的是中斷矢量0004H。

③ 程序計數器、狀態寄存器和電源控制寄存器的復位值見表2-4。

2.1.4 中斷

PIC16F87X系列單片機有多達14個中斷源,豐富的中斷資源為用戶程序的開發帶來很大的靈活性。在嵌入式系統中,中斷是一個很重要的概念。為此,在2.2節將對中斷進行專門介紹,此處不再贅述。

2.1.5 監視定時器WDT

在工業環境中,單片機會因為干擾的存在引起PC錯誤,導致程序跑飛或陷入死循環,此時指令冗余技術和軟件陷阱技術均已無法解決問題,這時可以采用程序監視定時器WDT(Watchdog Timer),俗稱“看門狗”措施。WDT通過不斷監視程序每周期的運行事件是否超過正常狀態下所需的時間,從而判斷程序是否進入了死循環,并對系統進行復位。WDT可以由硬件來實現,也可以由軟件來實現,還可以將兩者結合起來實現。由于受篇幅影響,這里只介紹PIC16F87X中的WDT技術。

1.看門狗工作原理

PIC16F87X單片機中包含硬件看門狗,其原理圖如圖2-5所示。WDT定時器的時鐘由芯片內部獨立的RC振蕩器提供,無須外接任何元件即可運行。注意,WDT定時器的RC振蕩器與OSC1/CLKIN引腳上的RC振蕩器無關,即使OSC1和OSC2引腳上的時鐘停止工作(如睡眠狀態),看門狗依然可以工作。

圖2-5 監視定時器原理框圖

注:PSA和PS2∶PS0在OPTION寄存器中。

由于看門狗的時鐘由RC振蕩電路提供,所以它的準確度受環境因素影響較大。在不考慮預分頻器的情況下,看門狗的定時周期為7~33ms,典型值為18ms。如果需要更長的時間,就需要把預分頻器分配給看門狗。預分頻器的最大分頻比為1:128,這樣可使看門狗的定時時間擴大128倍,達到2.3s。故看門狗的定時常數可設置為18ms~2.3s。

在正常工作狀態下,WDT時間一到就會產生一個復位信號(即看門狗復位)。如果單片機處于睡眠模式,WDT超時會把芯片喚醒,然后繼續正常工作。若WDT超時,則STATUS寄存器中的TO位將被清零。注意,看門狗只能由芯片配置字中的WDTE位使能或關閉,而不被軟件控制。

如果把預分頻器配置給WDT,用CLRWDT和SLEEP指令可以同時對WDT和預分頻器清零,從而防止計時溢出引起芯片復位,所以,在正常情況下,必須在每次計時溢出之前執行一條CLRWDT指令(即喂一次“狗”),以避免引起芯片復位。當系統受到嚴重干擾處于失控狀態時,就不可能在每次計時溢出之前執行一條CLRWDT指令,WDT也就產生計時溢出,從而引起芯片復位,使其擺脫失控狀態而重新進入正常運行狀態。

2.與WDT有關的寄存器

與看門狗有關的寄存器有3個:芯片配置字(地址為2007H)、狀態寄存器STATUS(地址為03H/83H/103H/183H)和選擇寄存器OPTION_REG(地址為81H/181H)。

OPTION_WDT中與WDT有關的位定義如下:

注:R:0可讀位;W可寫位:U:未使用位;-n:POR復位值;x:未知。若無特殊說明,本書中所有與寄存器相關的表格中出現的上述符號/字母均作此解釋。

● bit 3 PSA:預分頻器分配位。

? 1:預分頻器分配給WDT。

? 0:預分頻器分配給Timer0模式。

● bit 2~bit 0 PS2:PS0:預分頻器分頻比選擇位如下:

? 狀態寄存器STATUS中與WDT有關的位的定義如下:

● bit 3 TO:超時標志位。

? 1:單片機初始加電或執行了看門狗清零指令(CLRWDT)或執行了睡眠指令(SLEEP)后,該位置1。

? 0:看門狗超時溢出時,自動清零。

● bit 2 PD:掉電標志位。

? l:單片機初始加電或執行了CLRWDT指令后,該位置1。

? 0:單片機執行SLEEP指令后,自動清零。

3.看門構設計中的注意事項

(1)看門狗清零指令(CLRWDT)和睡眠指令(SLEEP),不僅可以使看門狗定時器清零,還可以同時把預分頻器清零(如果預分頻器已經分配給WDT使用)。但是,預分頻器的分頻比以及配置關系不會改變。

(2)“喂狗”的時機?!拔构贰本褪侵缚撮T狗定時器清零,使看門狗電路繼續起作用?!拔构贰币话惆才旁诘却樵兊难h體內部、耗時很大的函數體內部或主程序任務隊列中,而不安排在定時器中斷服務程序中。

死機多發生在程序的指令和數據錯位、PC跑飛等場合。因為處理器速度很快,如果跑飛的程序不被死循環套住,則很容易自動重新復位,但是很多情況下偏偏會被死循環套牢,那么就必須將看門狗復位了。如果用定時器中斷實現喂狗,則即使主程序死循環,定時器必定依舊正常喂狗,這樣看門狗仍然無法復位。

(3)在噪聲環境下工作時,OPTION寄存器可能會受到干擾而改變,所以應每隔一段時間就將其重新設置。

2.1.6 睡眠模式

低功耗設計是嵌入式系統的發展方向之一。在PIC系列單片機中,除了在硬件上使用CMOS電路降低功耗外,在軟件上也進行了低功耗設計,這就是睡眠模式。在睡眠模式中,芯片處于最小耗電狀態,振蕩電路停止工作,芯片無系統時鐘信號。除了必要的功能模塊運行之外,其他功能都處在“睡眠”模式,一旦有事件發生,才被“喚醒”到正常的工作狀態。

1.進入睡眠模式

單片機執行一條SLEEP指令就可以進入睡眠模式。進入睡眠模式后,WDT被清零但仍處于工作狀態;狀態寄存器STATUS中的PD位被清零,TO位被置1;主振蕩器(OSC1端的振蕩電路)停止工作;所有的I/O端口保持睡眠前的狀態。

在睡眠模式中,為使電流最小,應使所有的I/O端口處于高電平VDD或低電平VSS,確保沒有外部電路從I/O端口吸收電流,關閉ADC模塊并且關閉外部時鐘。在外部將所有的高阻抗輸入I/O引腳上拉或下拉,以避免懸空引起的開關電流損耗。為降低電流損耗,T0CK1輸入引腳也應該接到VDD或VSS。MCLR引腳必須處于高電平狀態。

2.睡眠中的喚醒

可以通過以下事件將單片機從睡眠中喚醒:

● MCLR引腳上外加低電平復位信號。

● 看門狗喚醒(如果WDT處于工作狀態)。

● 外部中斷(INT)。

● PB口電平變化中斷。

● 外圍接口中斷,包括:PSP的讀寫操作(僅對PIC16F874/877有效)、工作在異步計數方式下的TMR1中斷、CCP捕捉模式中斷、特殊事件觸發中斷(Timerl工作于外部時鐘異步模式)、SSP起始位/停止位檢測中斷、從模式下的SSP發送/接收中斷(SPI/I2C)、同步從動模式下的USART收發中斷、A/D轉換中斷(當A/D時鐘源為RC振蕩器時)和E2PROM寫操作完成引起的中斷。除此之外,其他外圍模塊不能引發中斷,因為在睡眠模式下,芯片內部沒有時鐘。

當執行SLEEP指令時,下一條指令(PC+1)被取出。如果要用中斷喚醒單片機,則在進入睡眠前,該中斷使能位必須被置1(即允許該中斷),至于全局中斷允許位GIE則不會影響中斷喚醒功能,但GIE卻會影響中斷喚醒后單片機動作的走向:當GIE=0(禁止中斷)時,單片機被中斷喚醒后會沿著原來的SLEEP指令繼續執行;當GIE=1(開啟中斷)時,單片機被中斷喚醒后會首先執行完SLEEP后的一條指令,然后跳到中斷矢量入口(0004H)執行中斷服務程序。如果不希望SLEEP后的一條指令在中斷喚醒后被執行,可以在SLEEP指令后插入一條NOP空操作指令。

3.中斷喚醒的影響

當全局中斷被禁止,所有中斷源的中斷允許位和中斷標志位被置1,則中斷喚醒時會出現下面的情況:

● 如果中斷發生在SLEEP指令執行前,則SLEEP指令就相當于一條NOP空操作指令。因此,WDT和WDT后分頻器不會被清零,TO位不會被置1,PD位也不會被清零。

● 如果中斷發生在SLEEP指令執行中或執行后,則單片機就會立即從睡眠狀態中被喚醒,而SLEEP指令則會在芯片被喚醒前繼續執行。所以,WDT和WDT后分頻器會被清零,TO位將被置1,PD位將被清零。

即使在SLEEP指令執行前對標志位進行檢查,但在SLEEP指令結束前標志位仍有可能被置1,此時可通過檢查PD位來判斷SLEEP指令是否被執行。如果PD位被置1,則SLEEP指令只當作一條NOP指令被執行。

為確保WDT被清零,在SLEEP指令前應先執行一條CLRWDT指令。中斷喚醒時序圖如圖2-6所示。

圖2-6 中斷喚醒時序圖

2.1.7 在線調試

PIC16F87X系列單片機的一個重要特色就是具有片內調試電路。任何一款PIC16F87X單片機,無論封裝如何,其本身都是一個調試器。當芯片配置字中的DEBUG位被編程為0時,在線調試功能就被使能。該功能允許使用MPLAB-ICD進行一些簡單功能的調試,為用戶的低成本開發提供了一個解決方案。當使用在線調試功能時,單片機的一些資源將會被占用,如表2-8所示。

表2-8 在線調試所占用的資源

為了可以使用在線調試功能,電路中必須具備在線串行編程連接設計:MCLR/VPP、VDD、GND、RB7和RB6,這樣就可以和微芯公司或第三方的開發工具接口統一起來。

2.1.8 程序代碼保護

PIC的程序加密功能又是PIC單片機的一個亮點。當芯片配置字的代碼保護位沒有被編程時,片上程序存儲區的內容可以被讀出并修改。當選擇將芯片的代碼保護位熔絲熔斷(寫入0)后,程序存儲區中的程序代碼(14位寬)的高10位將被屏蔽。也就是說,當加密后,每一個程序代碼都呈現000XH的形式。這樣,高10位被0替代了,而低4位也是經過加密運算后的值,他人就無法恢復這些被加密的代碼,也就無法進行代碼復制了。當然,加密后單片機的功能是不會受到影響的,加密后的程序代碼繼續在單片機內運行,只是不能被還原讀出罷了。目前尚無辦法對PIC芯片進行解密。

2.1.9 用戶標識碼

在PIC系列單片機內部有一個由4個14位長的專用程序存儲器單元組成的存儲區,其地址為2000H~2003H。該存儲區允許用戶燒入自己定義的4位十六進制碼,用作單片機的標識碼(Identification Code)。該標識碼不影響單片機的正常工作,只起標識作用。用戶可用它來標識軟件的版本號或產品的批次等信息。

2.1.10 在線串行編程技術ICSP(In-Circuit Serial Programming)

PIC16F87X系列單片機在最終的應用電路中可以進行在線串行編程,該功能的實現只需時鐘、數據、電源、地和編程電壓5根線即可。這樣就允許用戶先做好沒有編程的電路板,在裝箱運輸時再把軟件固化到單片機中,也允許采用最新的固件或客戶的固件編程。

當使用串行編程時,如果要執行塊擦除,芯片的供電電壓必須在4.5~5.5V之間。對于所有其他的ICSP,芯片都在正常的工作電壓下進行編程。這就意味著校對值、用戶ID或用戶代碼可以串行編程或添加。

芯片配置字中的LVP位允許芯片進入低電壓編程模式。該模式允許單片機在VDD正常范圍供電的情況下進行在線串行編程。LVP意味著VPP不需要高電壓。在這種模式中,RB3/PGM引腳被用作編程功能,而不再作為普通I/O端口使用。在編程期間,MCLR引腳接到VDD。為進入編程模式,RB3/PGM引腳必須接到VDD,以使LVP位置1。出廠時,LVP位默認為1,允許LVP編程模式。用戶可通過對芯片配置字中的LVP位清零來禁止低電壓編程。

如果不使用低壓編程模式,RB3/PGM引腳恢復為數字I/O引腳。LVP位只有在MCLR引腳上加高電壓進行編程時才會被置1。

應該引起注意的是,一旦LVP位被清零,則只有高電壓編程模式有效,且只有高電壓編程模式可以對芯片進行編程。無論LVP為何值,只要在MCLR#引腳加編程高壓,高壓編程模式即可生效。

主站蜘蛛池模板: 科尔| 鲁甸县| 绥棱县| 平凉市| 延边| 沙坪坝区| 天台县| 阿拉善右旗| 公安县| 禹城市| 天长市| 元江| 静乐县| 个旧市| 望城县| 视频| 津南区| 宜都市| 维西| 藁城市| 台南县| 离岛区| 江孜县| 宣汉县| 灵山县| 镇江市| 枣强县| 景泰县| 永年县| 镇原县| 偃师市| 铁力市| 阳东县| 犍为县| 陇川县| 那曲县| 古丈县| 崇阳县| 宕昌县| 唐山市| 潼南县|