專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!
提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力
提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動態(tài)
單片機(jī)代理商深圳英銳恩為您介紹PIC12C5XX單片機(jī)功能原理。PIC12C5XX單片機(jī)是美國Microchip公司推出的8位單片機(jī),也是世界上第一個8腳封裝的8位單片機(jī)系列,英銳恩科技有推出兼容PIC單片機(jī)的國產(chǎn)8位單片機(jī)。
§1.1 功能特點
一、高性能RISC結(jié)構(gòu)CPU
·精簡指令集,僅33條單字節(jié)指令,易學(xué)易用
·除地址分支跳轉(zhuǎn)指令為雙周期指令外,其余所有指令皆為單周期指令
·執(zhí)行速度: DC~1μs
·二級硬件堆棧
·直接、間接、相對三種尋址方式
二、功能部件特性
·8位定時器/計數(shù)器TIMER0,帶8位預(yù)分頻器
·大驅(qū)動電流,I/O腳可直接驅(qū)動數(shù)碼管(LED)顯示
每個I/O引腳最大控電流25mA
每個I/O引腳最大灌電流20mA
·內(nèi)置上電復(fù)位電路(POR)
·復(fù)位定時器,保障復(fù)位正常
·內(nèi)部MCLR復(fù)位端加上拉電路,無需外接上拉
·內(nèi)置自振式看門狗,防程序死鎖
·程序保密位,可防止程序代碼的非法拷貝
·低功耗睡眠功能
·I/O引腳可喚醒睡眠
·內(nèi)置4MHz RC型振蕩源,可省外接振蕩
·可選外接振蕩
RC: 低成本阻容振蕩
XT: 標(biāo)準(zhǔn)晶體/陶瓷振蕩
LP: 低速晶體,低功耗振蕩
三、CMOS工藝特性
·低功耗
<2mA @5V,4MHz
-15μA @3V,32KHz
-<1μA 低功耗睡眠(Sleep)模式下
·全靜態(tài)設(shè)計
·寬工作電壓范圍:2.5V~5.5V
·寬工作溫度范圍:
商用級: 0℃~+70℃
-工業(yè)級:-40℃~+85℃
-汽車級:-40℃~+125℃
§1.2 型號及引腳介紹
PIC12C5XX目前有二種型號,見下表:
型 號振 蕩EPROMRAM定時器輸入線I/O線電壓范圍封裝(DIP/SOIC)12C508DC~4Mhz512×1225×81152.5V-5.5V812C509DC~4Mhz1024×1241× 81152.5V-5.5V8
表1.1 PIC12C5XX型號功能表
各型號管腳圖如下:
PDIP,SOIC,Windowed CERDIP
VDD——> GP5/OSC1/CLKIN<——> GP4/OSC2<——> GP3/MCLR/VPP——><——VSS <——>GP0 <——>GP1 <——>GP2/T0CK1
圖1.1 12C508/509引腳
下表描述了各引腳的功能。
  引腳名 引腳序號 屬性 緩沖類型 功能 GP07I/OTTL/ST雙向I/O口線,帶可編程弱上拉,并具電平變化喚醒睡眠功能GP16I/OTTL/ST雙向I/O口線,帶可編程弱上拉,并具電平變化喚醒睡眠功能GP2/T0CK15I/OST雙向I/O口線,并可設(shè)置為計數(shù)器TIMER0的外部信號輸入端GP3/MCLR4ITTL單向輸入口線,也可設(shè)置為芯片復(fù)位端。當(dāng)設(shè)為復(fù)位端MCLR時,低電平有效。 當(dāng)作為輸入口線時,帶可編程弱上拉及電平變化喚醒睡眠功能GP4/OSC23I/OTTL雙向I/O口線,(使用片內(nèi)RC振蕩源時,也可作為晶振輸出端)GP5/OSC1/CLKIN2I/OTTL/ST雙向I/O口線,(使用片內(nèi)RC振蕩源時,也可作為晶振輸入端或外部振蕩輸入端)VDD1電源—正電源VSS8電源—地注:ST ─ 斯密特觸發(fā)器
表1.2 PIC12C5XX引腳功能
從上表可看出,PIC12C5XX最多可以有5根I/O口線和1根輸入口線(GP3)。
§1.3 PIC12C5XX內(nèi)部結(jié)構(gòu)
  PIC12C5XX 的總線結(jié)構(gòu)采用的是數(shù)據(jù)總線(8位)和指令總線(12位)獨立分開的”哈佛結(jié)構(gòu)”,所以它具有精簡指令集(RISC)的特點,速度快,效率高,并且功耗很低.
  PIC12C5XX在一個芯片上集成了8位的算術(shù)邏輯運算單元(ALU),0.5K~1K的12位程序存儲器,25~41個8位數(shù)據(jù)寄存器以及8位的計數(shù)器,上電復(fù)位電路,復(fù)位定時器,看門狗等等。
圖1.2 PIC12C5XX內(nèi)部結(jié)構(gòu)
§1.4 指令周期和流水作業(yè)
PIC12C5XX的指令周期被分頻成4個不重疊的節(jié)拍Q1~Q4,程序計數(shù)器PC在Q1節(jié)拍增1, 而指令是在Q4節(jié)拍從程序存儲器中取出并置入指令譯碼器,并在下一個指令周期被執(zhí)行, 如下圖所示:
指令的執(zhí)行貫穿Q1~Q4節(jié)拍。
如上所述,當(dāng)CPU在執(zhí)行一條指令的同時, 下一條指令的代碼也同時被取出置入指令譯碼器,準(zhǔn)備在下一指令周期執(zhí)行,這就是PIC的流水作業(yè)方式,也是RISC結(jié)構(gòu)單片機(jī)的特點,這種特點使單片機(jī)的運行速度可以達(dá)到很高。
除了地址分支跳轉(zhuǎn)指令的執(zhí)行周期是2個指令周期外,其余所有指令都是單周期指令, 見下圖:
圖1.4 流水作業(yè)
§1.5 程序存儲器和堆棧
PIC12C5XX的程序存儲器為12位長,其中PIC12C508為512字節(jié),而PIC12C509為1024字節(jié)。復(fù)位向量為地址0,因為最后一個字節(jié)(PIC12C508為地址1FFH,PIC12C509為地址3FFH)存放有片內(nèi)RC實際振蕩的校正系數(shù),其形式為指令MOVLW XX,用戶不要使用這個字節(jié),所以用戶的程序應(yīng)從地址000H開始存放,注意這點和PIC16C5X有所不同。
圖1.5 程序存儲器和堆棧
PIC12C5XX把程序存儲器以512字節(jié)為單位進(jìn)行分頁管理,這樣PIC12C508有一個頁面程序區(qū),而PIC12C509有2個頁面程序區(qū),由狀態(tài)寄存器STATUS中的PA0位(STATUS<5>) 確定程序區(qū)的頁面。這是因為PIC是RISC結(jié)構(gòu),所有指令都是單字節(jié),在PIC12C5XX中, 一條指令中所包含的地址信息只有9位,只能直接尋址一個頁面(512字節(jié));對于12C509,則還要由PA0位來輔助尋址2個頁面(1024字節(jié))的程序空間,即程序當(dāng)需從一個頁面跳轉(zhuǎn)到另一個頁面時(CALL、GOTO指令),應(yīng)事先根據(jù)要跳轉(zhuǎn)去的頁面,把PA0位置為相應(yīng)的值,請參閱狀態(tài)寄存器的描述。
PIC12C5XX的堆棧有2層,有自己獨立的空間,不占用程序存儲器。注意它只能容納二層子程序嵌套調(diào)用。堆棧的長度是12位,和PC長度一致,可以存放子程序調(diào)用時的PC值。
對堆棧的壓入操作由子程序調(diào)用指令CALL完成,出棧操作則由子程序返回指令RETLW完成,請參閱第二章中這二條指令的詳介。
§1.6 數(shù)據(jù)存儲器
PIC12C5XX的數(shù)據(jù)存儲器(RAM)由一些寄存器組成,分為特殊寄存器和通用寄存器二種。在PIC單片機(jī)中,對任何部件的操作都表現(xiàn)為對某一寄存器的操作,所以編程非常簡單明了。
: 非實際存在的寄存器,參見§1.6.1中詳介。
圖1.6 寄存器結(jié)構(gòu)
從上圖可看到,00h~06h為特殊寄存器,其余為通用寄存器。PIC12C508有25個通用寄存器,而PIC12C509則有41個通用寄存器,其中25個在Bank0,另16個在Bank1,關(guān)于寄存器的Bank方式,請參閱§1.6.1的FSR寄存器描述。
§1.6.1 特殊寄存器
一、INDF(地址:00h) ── 間址寄存器
INDF是一個物理上不存在的寄存器,只是一個邏輯寄存器,用來進(jìn)行間接尋址,實際的尋址地址為FSR<4:0>的值。
例: MOVLW 10h
MOVWF FSR ;實際地址10h(F10寄存器)→FSR
MOVLW 55h
MOVWF INDF ;數(shù)據(jù)55h→F10
INCF FSR ;FSR增1(FSR=11h)
MOVWF INDF ;數(shù)據(jù)55h→F11
參閱后面FSR寄存器的描述。
二、TMR0(地址:01h) ── 定時器/計數(shù)器寄存器
二、TMR0(地址:01h) ── 定時器/計數(shù)器寄存器
TMR0對應(yīng)于TIMER0,它是一個8位的定時器/計數(shù)器(在PIC16C5X中稱其為RTCC),請參閱§1.8詳介。
三、PCL(地址:02h) ── 程序計數(shù)器PC<7:0>
PIC12C5XX程序計數(shù)器PC最多可尋址1K(1024)程序區(qū):
型 號PC長度尋址空間PC復(fù)位值PIC12C50895121FFhPIC12C5091010243FFh
單片機(jī)一復(fù)位,PC值被置為全“1”指向程序區(qū)的最后一個字節(jié)。前面我們提過,這個地址存放的是芯片出廠時已放入的MOVLW XX指令(其中XX是片內(nèi)振蕩校正系數(shù)),所以單片機(jī)復(fù)位后會執(zhí)行這條指令,然后PC馬上翻轉(zhuǎn)到000h,開始執(zhí)行用戶的程序代碼。注意,頁面選擇位PA0 復(fù)位時也被清零,所以這時頁面處于0頁,請參閱有關(guān)狀態(tài)寄存器STATUS的描述。
對于“GOTO”指令,它的指令碼中含有跳轉(zhuǎn)地址的低9位,即PC<8:0>,對于PIC12C509來說,狀態(tài)寄存器的第5位(STATUS<5>)還會被置入PC<9>,以選擇程序頁面,從而尋址1K的程序空間.
對于“CALL”指令或其他涉及會修改PCL的指令,它們的指令碼中僅包含目的地址的低8位,即PC<7:0>,而PC<8>總是會被硬件自動清零,狀態(tài)寄存器第5位(STATUS<5>)也會被置入PC<9>以選擇程序頁面(對于PIC12C509而言)。見下圖:
從上圖可看出,由于執(zhí)行這些指令硬件總會清PC<8>=0,所以它們的起始地址都必須限于放在每個程序頁面的上半?yún)^(qū),即頭上的256個字節(jié)空間內(nèi)(0h~FFh或200h~2FFh)。
四、STATUS(地址:03h) ── 狀態(tài)寄存器
STATUS寄存器包含了ALU的算術(shù)狀態(tài)、芯片復(fù)位狀態(tài)、程序頁面位等信息。STATUS 可以被讀/寫,但是其中的復(fù)位狀態(tài)位TO、PD不能由軟件設(shè)置,它們的狀態(tài)如何決定§1.12.7 會有詳細(xì)描述。
圖1.9 狀態(tài)寄存器
在加法運算時,C是進(jìn)位位;在減法運算時,C是借位的反。
例a:
CLRF F10 ;F10=0
MOVLW 1 ;W=1
SUBWF F10 ;F10-W=-1(FFH),C=0(運算結(jié)果為負(fù))
例b:
MOVLW 1 ;W=1
MOVWF F10 ;F10=1
CLRW ;W=0
SUBWF F10 ;F10-W=1,C=1(運算結(jié)果為正)
PD和TO兩位可用來判斷芯片復(fù)位的原因,GPWUF位也是用來判斷芯片復(fù)位類型,請參閱§1.12.7描述。
五、FSR(地址:04h) ── 選擇寄存器
FSR和INDF寄存器(地址:00h)配合完成間接尋址,請參閱前面有關(guān)INDF寄存器的描述。FSR寄存器寬度為5位,F(xiàn)SR<4:0>用來間接尋址32個寄存器,F(xiàn)SR<5> 則用來選擇寄存器體(Bank),見下圖:
圖1.10 直接/間接尋址方式
a、PIC12C508: 不存在寄存器體選,F(xiàn)SR<5>恒為“1”。 b、PIC12C509: FSR<5>=1 Bank1, FSR<5>=0 Bank0。
六、OSCCAL(地址:05h) ── 內(nèi)部振蕩校正系數(shù)寄存器
PIC12C5XX內(nèi)部集成有RC振蕩供用戶選擇使用,OSCCAL<7:4> 包含了該振蕩電路的校正系數(shù),其上電初始值為“0111”,請參閱§1.11.4有關(guān)內(nèi)部RC振蕩的描述。
七、GPIO(地址:06h) ── I/O寄存器
PIC12C5XX有一個6位的I/O口,它在寄存器中的映像就是GPIO寄存器,GPIO<5:0>對應(yīng)于 I/O口線GP5:GP0,GPIO<7:6>未用,恒為“0”。
八、TRIS ── I/O方向控制寄存器
TRIS是GP口線方向控制寄存器,用戶不能直接尋址,必須通過執(zhí)行“TRIS 6”指令來設(shè)置它。當(dāng)執(zhí)行“TRIS 6”指令后,W寄存器的內(nèi)容即會被置入TRIS中。“1”將相應(yīng)的I/O口線設(shè)為輸入態(tài)(高阻態(tài)),“0”則被設(shè)為輸出態(tài)。但是有二點例外,即GP3永遠(yuǎn)是輸入態(tài)而GP2有可能由OPTION寄存器設(shè)置為輸入態(tài)(T0CKI),而不理會TRIS中的設(shè)置內(nèi)容。請參閱§1.2關(guān)于I/O口的描述。
例:
MOVLW 0Fh ;W=“00001111”
TRIS 6 ;TRIS=“001111”,GP0:GP3為輸入態(tài)
GP4:GP5為輸出態(tài)
各種復(fù)位都會置TRIS為全“1”。
九、OPTION ── 參數(shù)定義寄存器
OPTION用來定義一些芯片工作參數(shù),見下圖所示:
圖1.11 OPTION寄存器
OPTION也是不能由用戶直接尋址的,必須由執(zhí)行“OPTION”指令來把W寄存器中的內(nèi)容置入OPTION寄存器,如下例:
MOVLW 7 ;W=“00000111”
OPTION ;W→OPTION
各種復(fù)位都會置OPTION為全“1”。
注意即使TRIS中相應(yīng)的GP2方向位是“0”,如果將TOCS置為“1”,則GP2也會被強(qiáng)置為輸入態(tài),即為T0CKI輸入線。
有關(guān)OPTION各位的定義,請參閱各自相應(yīng)的章節(jié)。
十、W ── 工作寄存器
W寄存器用來存放指令中的第二個操作數(shù),或用來進(jìn)行內(nèi)部數(shù)據(jù)傳送,或存放運算結(jié)果,是最常用的寄存器。
§1.6.2 通用寄存器
PIC12C508: 07h ─ 1Fh ;Bank0 PIC12C509: 07h ─ 1Fh ;Bank0 30h ─ 3Fh ;Bank1
通用寄存器在上電后的值是隨機(jī)的,所以它屬RAM性質(zhì)。
§1.7 I/O 口
PIC12C5XX只有一個I/O口,對應(yīng)的映像寄存器為GPIO(地址:06h),其中GPIO< 5:0> 對應(yīng)GP5:GP0,GPIO<7:6>未用,永為“0”。注意,GP3僅可作為輸入,是單向I/O口線。另外,GP5、GP4、GP3及GP2還可以由用戶定義成各種特殊功能口線,一旦它們被用作特殊用途,則永遠(yuǎn)讀為“0”。GP0、GP1和GP3還帶有可編程的弱上拉和“電平變化喚醒功能”(即喚醒正處于睡眠狀態(tài)下的芯片),關(guān)于這點請參閱OPTION寄存器的描述。如果GP3被用戶定義為復(fù)位輸入端(MCLR),則它的弱上拉自動有效,但“電平變化喚醒”特性被自動關(guān)閉。
GPIO口線的方向由TRIS寄存器控制,詳情參見§1.6.1中有關(guān)TRIS寄存器的描述。
§1.7.1 I/O 口結(jié)構(gòu)
一根I/O口線的結(jié)構(gòu)如下圖所示:
圖1.12 I/O口結(jié)構(gòu)
除了GP3只能單向作為輸入口外,其余的GPIO口皆可由用戶定義為輸入/輸出態(tài)。作為輸入口時沒有鎖存,外部信號必須保持到讓CPU讀入為止(例如:MOVF GPIO,W)。作為輸出則有鎖存,可以保持直到被新的值取代為止。
I/O端的輸入/輸出態(tài)由TRIS寄存器的值控制,當(dāng)TRIS將“1”置入I/O控制器時Q1和Q2 都處于截止態(tài),所以I/O端即呈高阻態(tài)(輸入態(tài))。當(dāng)執(zhí)行I/O讀指令(如MOVF 6,W),把當(dāng)前I/O端的狀態(tài)讀入數(shù)據(jù)總線。當(dāng)TRIS將“0”置入I/O控制器時,Q1和Q2的導(dǎo)通情況將要由數(shù)據(jù)鎖存器Q端的狀態(tài)來決定。當(dāng)寫入數(shù)據(jù)為“1”時,Q端為低電平0,則Q1導(dǎo)通,I/O輸出為高電平。反之,當(dāng)寫入數(shù)據(jù)為“0”時,Q端為“1”,則Q2導(dǎo)通,I/O端輸出為低電平。I/O讀寫時序如圖1.13所示。
§1.7.2 I/O口使用注意事項
1、I/O方向轉(zhuǎn)置的問題
某時候可能需要一個I/O口一會做輸入,一會又做輸出。這就是I/O方向的轉(zhuǎn)置。在編寫這種I/O轉(zhuǎn)置程序時必須注意,有些指令如位設(shè)置指令(BSF、BCF)寫I/O口時是先從I/O讀入其狀態(tài),執(zhí)行位操作后再將結(jié)果寫回去覆蓋原來的內(nèi)容(輸出的結(jié)果放在I/O口的數(shù)據(jù)鎖存器)。
舉個例子來說:“BSF 6,5” 這條指令的目的是要把B口的第6位置為高電平“1”。執(zhí)行這條指令時,先把整個B口當(dāng)前的狀態(tài)內(nèi)容讀入到CPU,把第6位置成“1”后再把結(jié)果(8個位)重新輸出到B口。如果B口中的有一個I/O端是需要方向轉(zhuǎn)置的(比如說bit1),而這時是處于輸入態(tài),那么B口的狀態(tài)值重新寫入后,B口的數(shù)據(jù)鎖存器1的鎖存值就是當(dāng)前B口Bit1的狀態(tài)。 這可能和先前Bit1作為輸出時所鎖存的值不同,所以當(dāng)Bit1 再轉(zhuǎn)置成輸出態(tài)時,出現(xiàn)在Bit1 端的狀態(tài)就可能和先前的輸出態(tài)不同了。
2、I/O的“線或”和“線與”
從圖1.12看出PIC I/O端輸出電路為CMOS互補推挽輸出電路。因此與其他這類電路一樣,當(dāng)某個PIC I/O端設(shè)置為輸出狀態(tài)時,不能與其他電路的輸出端接成“線或”或“線與”的形式,否則可能引起輸出電流過載,燒壞PIC。如需要與其他電路接成“線或”電路時,PIC I/O 端必須置于“1”狀態(tài)或輸入狀態(tài),并外接下拉電阻。電阻的阻值根據(jù)實際電路和PIC I/O 端最大電流來決定。
3、I/O口的連續(xù)操作
一條寫I/O的指令,對I/O真正寫操作是發(fā)生在指令的后半周期(參照圖1.13)。而讀I/O的指令卻是在指令的周期開始就讀取I/O端狀態(tài)。所以當(dāng)你連續(xù)對一個I/O端寫入再讀出時,必須要讓I/O端上的寫入電平有一個穩(wěn)定的時間,否則讀入的可能是前一個狀態(tài),而不是最新的狀態(tài)值。一般推薦在兩條連續(xù)的寫,讀I/O口指令間至少加一條NOP指令。
例:
MOVWF 6 ;寫I/O
NOP ;穩(wěn)定I/O電平
MOVF 6,W ;讀I/O
4、噪聲環(huán)境下的I/O操作
在噪聲環(huán)境下(如靜電火花),I/O控制寄存器可能因受干擾而變化。比如I/O口可能會從輸入態(tài)自己變成輸出態(tài),對于這種情形,WDT也是無法檢測出來的。因此如果你的應(yīng)用環(huán)境是較惡劣的,建議你每隔一定的間隔,都重新定義一下I/O控制寄存器。最保險的方法當(dāng)然是對I/O讀寫前都定義一下I/O控制寄存器(但是實踐證明對于大多數(shù)的應(yīng)用都不必做到這樣,只是提請你注意噪聲干擾)。
圖1.13 I/O口連續(xù)讀/寫時序
§1.8 定時器/計數(shù)器TIMER0
TIMER0是一個8位的定時器/計數(shù)器,其對應(yīng)的映像寄存器是TMR0(地址:01h),可由用戶程序直接讀寫,并且可帶有8位的預(yù)分頻器。它用于對外加在GP2/T0CKI引腳上的外部信號進(jìn)行計數(shù)(計數(shù)器)或?qū)?nèi)部指令時鐘進(jìn)行計時(定時器),在PIC16C5X中它被稱為RTCC。
TIMER0及其相關(guān)電路如圖1.14所示。從圖中可看出TIMER0工作狀態(tài)由OPTION寄存器控制,其中OPTION寄存器的T0SC位用來選擇TIMER0的計數(shù)信號源,當(dāng)T0SC為“1”時,信號源為內(nèi)部時鐘,T0SC為“0”時,信號源為來自T0CKI引腳的外部信號。OPTION寄存器的PSA位控制預(yù)分頻器(Prescaler)分配對象,當(dāng)PSA位為“1”, 分配給TIMER0,即外部或內(nèi)部信號經(jīng)過預(yù)分頻器分頻后再輸出給TIMER0。 預(yù)分頻器的分頻比率由OPTION內(nèi)的PS0~PS2決定。這時涉及寫TMR0寄存器的指令均同時將預(yù)分頻器清零,OPTION 寄存器內(nèi)容保持不變,即分配對象、分頻比率等均不變。OPTION的T0SE 位用于選擇外部計數(shù)脈沖觸發(fā)沿。當(dāng)T0SE為“1”時為下降沿觸發(fā),為“0”時則上升沿觸發(fā)。
圖1.14 TIMER0 方塊圖
TIMER0計數(shù)器采用遞增方式計數(shù),當(dāng)計數(shù)至FFH時,在下一個計數(shù)發(fā)生后,將自動復(fù)零,重新開始計數(shù),從此一直循環(huán)下去。TIMER0對其輸入脈沖信號的響應(yīng)延遲時間為2個機(jī)器周期,不論輸入脈沖是內(nèi)部時鐘、外部信號或是預(yù)分頻器的輸出。響應(yīng)時序見圖1.15。
TIMER0對外部信號的采樣周期為2個振蕩周期,因此當(dāng)不用預(yù)分頻器時,外加在T0CKI 引腳上的脈沖寬度不得小于2個振蕩周期即1/2指令周期。同時,當(dāng)使用預(yù)分頻器時,預(yù)分頻器的輸出脈沖周期不得小于指令周期,因此預(yù)分頻器最大輸入頻率可達(dá)N,fosc/4,N 為預(yù)分頻器的分頻比,但不得大于50MHz。
圖1.15a. TIMER0時序圖:內(nèi)部時鐘/無預(yù)分頻器
圖1.15b. TIMER0時序圖:內(nèi)部時鐘/預(yù)分頻比1:2
應(yīng)注意的是盡管PIC對外部加于T0CKI信號端上的信號寬度沒有很嚴(yán)格的要求,但是如果高電平或低電平的維持時間太短,也有可能使TIMER0檢測不到這個信號。一般要求信號寬度要大于10ns。
§1.9 預(yù)分頻器
預(yù)分頻器是一個分頻倍數(shù)可編程的8位計數(shù)器。其結(jié)構(gòu)如圖1.14 所示上節(jié)對預(yù)分頻參數(shù)已有描述,這里不再贅述。
預(yù)分預(yù)器的分配對象完全由程序控制,可以在程序中改變Prescaler分配對象。
1、從TIMER0到WDT的改變
MOVLW B'XX0X0XXX' ;選擇內(nèi)部時鐘和新的預(yù)分頻值 OPTION ;如果新的預(yù)分頻值='000'或者 CLRF 1 ;='001',則暫時先選一個另外的值 MOVLW B'XXXX1XXX' ;清零TMR0和預(yù)分頻器 OPTION ;選擇WDT為對象,但不要改變預(yù)分頻值 CLRWDT ;清WDT和預(yù)分頻器 MOVLW B'XXXX1XXX' ;選擇新的預(yù)分頻器 OPTION
2、從WDT到TIMER0的改變
CLRWDT ;清WDT 及Prescaler MOVLW B'XXXX0XXX' ;選擇TIMER0 OPTION
圖1.16 預(yù)分頻器方塊圖
注意,預(yù)分頻器只能分配給TIMER0或WDT其中之一使用,而不能同時分配給二者。
§1.10 看門狗WDT
看門狗計時器(Watch Dog Timer)是一個片內(nèi)自振式的RC振蕩計時器,無需任何的外接元件。這意味著即使芯片振蕩停止了(例如執(zhí)行指令SLEEP后),WDT照樣保持計時。WDT計時溢出將產(chǎn)生RESET。在PIC12C5XX芯片內(nèi)有一個特殊的謂之“系統(tǒng)定義字”(Configuration EPROM)的單元,其中的一個位是用于定義WDT的,可以將其置“0”來抑制WDT使之永遠(yuǎn)不起作用。這將在第六章的燒寫器介紹部分詳細(xì)說明。
1、WDT周期
WDT有一個基本的溢出周期18ms(無預(yù)設(shè)倍數(shù)),如果需要更長的WDT周期,可以把預(yù)分頻器分配給WDT,最大分頻比可達(dá)1:128,這時的WDT溢出周期約為2.5S。WDT溢出周期和環(huán)境溫度、VDD等參數(shù)有關(guān)系,請參閱附錄的圖表。
“CLRWDT”和“SLEEP”指令將清除WDT計時器以及預(yù)分頻器(當(dāng)預(yù)分頻器分配給WDT時)。WDT一般用來防止系統(tǒng)失控或者說防止單片機(jī)程序“失控”。在正常情況下,WDT應(yīng)在計時溢出前被CLRWDT指令清零,以防止產(chǎn)生RESET。如果程序由于某種干擾而失控,那么不能在WDT溢出前執(zhí)行一條CLRWDT指令,就會使WDT溢出而產(chǎn)生RESET,使系統(tǒng)重新啟動運行而不至失去控制。若WDT溢出產(chǎn)生RESET,則狀態(tài)寄存器F3的“TO”位會被清零,用戶可藉此判斷復(fù)位是否由WDT溢時所造成。
2、WDT編程注意事項
如果使用WDT,一定要仔細(xì)在程序中的某些地方放一條“CLRWDT”指令,以保證在WDT在溢出前能被清零,否則會造成芯片不停地產(chǎn)生RESET,使系統(tǒng)無法正常工作。
在噪聲工作環(huán)境下,OPTION寄存器可能會因受干擾而改變,所以最好每隔一段時間就將其重新設(shè)置一下。
§1.11 振蕩
PIC12C5XX可以運行在以下四種振蕩方式下:
a、LP 低功耗低速晶體振蕩 b、XT 標(biāo)準(zhǔn)晶體/陶瓷振蕩 c、INTRC 內(nèi)部4MHz RC振蕩 d、EXTRC 外部RC振蕩
以上四種振蕩方式可由“系統(tǒng)定義字”中的Fosc1:Fosc2 兩位來選擇,請讀者參閱后面§1.12.9的詳述。
§1.11.1 晶體/陶瓷振蕩
這種振蕩包括XT和LP,其電路連接是在GP5/OSC1/CLKIN和GP4/OSC2兩端加一晶體/陶瓷振蕩,如下圖所示:
圖1.17 晶體/陶瓷振蕩電路
下表是使用各種頻率的晶體和陶瓷振蕩所需的C1、C2電容值。
振蕩類型頻率C1C2 振蕩類型頻率C1C2XT455KHz68-100P68-100PLP32KHz15P15P 2MHz15-33P15-33PXT100KHz15-30P200-300P200KHz15-30P100-200P 4MHz10-22P10-22P 1MHz15-30P15-30P 2MHz15P15P 4MHz15P15P
a. 陶瓷振蕩 b.晶體振蕩
表1.3 各種振蕩下的C1和C2值
§1.11.2 外部RC振蕩
這種振蕩類型成本最低,但頻率的精確性較差,適用于時間精確度要求不高的應(yīng)用場合。RC振蕩的頻率是VDD、RC值以及環(huán)境溫度的函數(shù)。請參閱附錄的RC頻率函數(shù)圖。RC 振蕩的連接如圖1.18所示。
圖1.18 RC振蕩電路
RC振蕩是在OSC1端連接一個串聯(lián)的電阻電容。這個電阻如果低于2.2K,振蕩不穩(wěn)定,甚至不能振蕩,但是電阻高于1M時,則振蕩又易受干擾。所以電阻值最好取5K~100K之間。盡管電容C為0時,電路也能振蕩,但也易受干擾且不穩(wěn)定,所以電容值應(yīng)取20P以上。RC值和頻率關(guān)系如表1.4所示。RC振蕩時OSC2端輸出一OSC1的4分頻脈沖(f=1/4OSC1)。
RestCextVDDFosc/25℃5kΩ0PF5.04.0MHz5kΩ20PF6.02.2MHz5kΩ20PF3.52.5MHz10kΩ130PF5.0480MHz10kΩ290PF5.0245MHz100kΩ300PF3.530MHz
表1.4 RC與頻率的關(guān)系
§1.11.3 外部振蕩
PIC12C5XX也可以接受外部振蕩源(僅適合于XT和LP類型振蕩),連接時將外部振蕩接入GP5/OSC1/CLKIN端,見下圖:
圖1.19 外部振蕩源輸入電路
§1.11.4 內(nèi)部RC振蕩
PIC12C5XX內(nèi)部提供有4MHz的RC振蕩源供用戶選擇使用,選擇振蕩方式和振蕩源的方法見§1.12.9詳介。
在PIC12C5XX的程序區(qū)最頂端(12C508:1FFh,12C509:3FFh)放了一條MOVLW XX的指令, XX是內(nèi)部RC振蕩的校正系數(shù)。芯片上電后,PC指針指向程序區(qū)最頂端,執(zhí)行完這條指令后PC 值加1變?yōu)?00h。這時W寄存器中存放即是內(nèi)部RC振蕩的校正系數(shù),用戶可以把這個系數(shù)置入OSCCAL寄存器(05h)以便使其起校正作用,也可以忽略不管它。
例: 0 ;定義存儲區(qū)地址0 MOVWF OSCCAL ;把W中的校正系數(shù)置入OSCCAL。
§1.12 復(fù) 位(RESET)
PIC12C5XX有各種各樣原因造成的芯片復(fù)位:
1、芯片上電 2.、MCLR端加低電平 3、看門狗WDT超時溢出 4、睡眠中某些I/O口線電平發(fā)生變化
當(dāng)芯片處于復(fù)位狀態(tài)時,所有I/O口線都處于輸入狀態(tài)(高阻態(tài)),看門狗WDT和預(yù)分頻器都被清零。
圖1.20 片內(nèi)復(fù)位電路(暫缺)
§1.12.1 復(fù)位定時器(DRT)
復(fù)位定時器DRT(在PIC16C5X 中我們稱其為OST)是為了使芯片的復(fù)位可靠安全而設(shè)計。在PIC12C5XX中,對于XT和LP振蕩方式,上電后它們還需要一定的時間來建立穩(wěn)定的振蕩。有鑒于此,PIC12C5XX內(nèi)部設(shè)計了一個復(fù)位定時器DRT。DRT在MCLR端到達(dá)高電平(VIHMC)后,即啟動計時18ms,這樣可以使芯片保持在復(fù)位狀態(tài)約18ms以便讓振蕩電路起振及穩(wěn)定下來,然后芯片即脫離復(fù)位狀態(tài)進(jìn)入正常運行狀態(tài)。DRT的振蕩源是芯片內(nèi)專有的RC振蕩電路,所以外圍電路并不能改變其18ms的計時時間。
當(dāng)WDT計時溢出后,DRT也是啟動18ms使芯片保持在復(fù)位狀態(tài),然后再重新開始運行程序。
注意,在振蕩方式是外部RC或內(nèi)部RC時,DRT都關(guān)閉不起作用。
§1.12.2 芯片上電復(fù)位(POR)
PIC12C5XX在芯片內(nèi)集成有上電復(fù)位電路,見圖1.20所示。當(dāng)芯片電源電壓VDD上升到一定值時(1.5V-2.1V),檢測電路即會發(fā)出復(fù)位脈沖使芯片復(fù)位。
§1.12.3 MCLR復(fù)位
PIC12C5XX的GP3/MCLR端可以由用戶定義為普通輸入口GP3或復(fù)位端MCLR,如下圖:
圖1.21 GP3/MCLR端電路(暫缺)
具體方法參見§1.12.9有關(guān)描述。
一旦用戶選擇MCLR功能,則該端輸入低電平會使芯片進(jìn)入復(fù)位狀態(tài)。
§1.12.4 外部復(fù)位電路
在某種情況下,DRT計時18ms后,芯片的振蕩電路還不能穩(wěn)定或供電電壓(VDD)還不能達(dá)到標(biāo)準(zhǔn)值,這時如果芯片脫離復(fù)位狀態(tài)進(jìn)入運行,則芯片就有可能失控或運行不正常。為了使芯片脫離復(fù)位狀態(tài)時各部分都處于正常,可以在MCLR端上加外部RC復(fù)位電路來延長復(fù)位時間,如下圖:
圖1.22 外部復(fù)位電路
這個電路可以使VDD上升到標(biāo)準(zhǔn)值一段時間后,MCLR才會上升到高電平,從而啟動DRT計時18ms后才進(jìn)入運行。這樣可以延長整個復(fù)位過程,保障芯片復(fù)位后進(jìn)入正常運行。
§1.12.5 掉電復(fù)位鎖定
當(dāng)單片機(jī)的供電電壓掉到最小標(biāo)準(zhǔn)值以下后,可能會使芯片的運行出現(xiàn)異常,從而擾亂整個控制系統(tǒng),所以在某些應(yīng)用中,我們希望一旦VDD掉到某個值時使芯片自動進(jìn)入復(fù)位狀態(tài)(所有I/O口都變成高阻態(tài))以免擾亂系統(tǒng),下面是一個PIC12C5XX掉電復(fù)位鎖定的電路:
圖1.23 掉電復(fù)位鎖定
當(dāng)VDD電壓恢復(fù)上升到標(biāo)準(zhǔn)值以上后,MCLR端恢復(fù)為高,從而使芯片恢復(fù)正常運行。
§1.12.6 復(fù)位對寄存器的影響
對于通用寄存器來說,上電復(fù)位后它們的值是隨機(jī)不定的,其他類型的復(fù)位后則保持原值不變。
對于特殊寄存器,各種復(fù)位后它們都會等于一個固定的復(fù)位值,見以下二表:
寄存器地址上電復(fù)位值MCLR復(fù)位 WDT復(fù)位 引腳變化喚起復(fù)位W—qqqq xxxx(注1)qqqq uuuu(注1)INDF00hxxxx xxxxuuuu uuuuTMR001hxxxx xxxxuuuu uuuuPC02h1111 11111111 1111STATUS03h0001 1xxx?00? ?uuu(注2)FSR(12C508)04h111x xxxx111u uuuuFSR(12C509)04h110x xxxx11uu uuuuOSCCAL05h0111 ——Uuuu ——GPIO06h—xx xxxx—uu ——-OPTION—1111 11111111 1111TRIS——11 1111—11 1111
u: 未變; x: 隨機(jī)值; -: 未用; ?: 其值取決于復(fù)位方式
注1:由于在復(fù)位向量處存放著MOVLW XX指令,其中XX為內(nèi)部RC振蕩校正系數(shù),所以復(fù)位后W<7:4>即會等于這個值。
注2:參見表1.6。
a. 各特殊寄存器復(fù)位后的值
復(fù) 位 類 型 狀態(tài)寄存器STATUS程序計數(shù)器PC芯片上電復(fù)位 0000 1xxx1111 1111運行時MCLR端加低電平復(fù)位 000u uuuu1111 1111睡眠時MCLR端加低電平復(fù)位 0001 0uuuu1111 1111 睡眠時看門狗WDT超時復(fù)位 0000 0uuu1111 1111 運行時看門狗WDT超時復(fù)位 0000 1uuu 1111 1111睡眠時I/O腳電平變化喚醒復(fù)位 1001 0uuuu 1111 1111 u:未變; x:隨機(jī).
b. 復(fù)位對STATUS和PC的影響
表1.5 各種復(fù)位對特殊寄存器的影響
§1.12.7 復(fù)位的鑒別
PIC12C5XX有多種原因都可引起芯片復(fù)位。在程序中判斷芯片復(fù)位的原因有時是非常必要的,例如上電復(fù)位后程序一般都要做一些寄存器初始化工作,而別的復(fù)位后則可以不做初始化而直接進(jìn)入控制運行。
在狀態(tài)寄存器STATUS有三個位(GRWUF、TO、PD)可用來標(biāo)識各種復(fù)位狀態(tài),見下表:
GPWUFTOPD復(fù) 位 原 因000睡眠中WDT超時溢出001運行時WDT超時溢出010睡眠中MCLR拉低011芯片上電0uu運行時MCLR拉低110睡眠中GP0,GP1或GP3電平變化
u:未變
a. 復(fù)位后TO、PD及GPWUF的狀態(tài)
事 件GRWUFTOPD注 芯片上電011 WDT超時溢出 00u不影響PD位執(zhí)行Sleep指令(進(jìn)入睡眠)u10 執(zhí)行CLRWDT指令(清看門狗) u11 睡眠中GP0,GP1或GP3電平發(fā)生變化110
u:未變
b. 影響TO、PD及GPWUF位狀態(tài)的事件
表1.6 復(fù)位對STATUS的影響
例:要判斷是否芯片上電。 BTFSS STATUS,TO ;TO=1 ? GOTO NO_POWERUP BTFSS STATUS,PD ;PD=1 ? GOTO NO_POWERUP INIT … ;TO=1,PD=1。芯片上電,做初始化。
§1.12.8 睡眠模式(Sleep)
1、進(jìn)入SLEEP
執(zhí)行一條“SLEEP”指令即可進(jìn)入低功耗睡眠模式。當(dāng)進(jìn)入SLEEP后,WDT被清零,然后重新開始計數(shù)。狀態(tài)寄存器STATUS中的PD位被置成“0”,TO位置成“1”,同時振蕩停止(指OSC1端的振蕩電路)。所有的I/O口保持原來的狀態(tài)。這種工作模式功耗最低。為使耗電流最小,進(jìn)入SLEEP前,應(yīng)使所有的I/O口處于高電平VDD或低電平VSS,而不應(yīng)使其處于高阻態(tài),以免產(chǎn)生開關(guān)電流損耗??梢栽贗/O口加上拉或下拉電阻,或者把I/O口都置成輸出態(tài)來避免其處于高阻態(tài)(浮態(tài))。
RTCC端亦應(yīng)置為VDD或VSS(通過上拉或下拉)。
MCLR必須處于高電平狀態(tài)。
2、喚醒SLEEP
SLEEP可被WDT溢出喚醒,或在MCLR端加低電平喚醒SLEEP或GP0、GP1、GP3電平發(fā)生變化。第二種喚醒方法經(jīng)常用在以下應(yīng)用場合:在系統(tǒng)主電源掉電,并由后備電源(電池)供電后,執(zhí)行“SLEEP”指令進(jìn)入低功耗模式,這樣電池就可長時間保持系統(tǒng)數(shù)據(jù)。當(dāng)主電源恢復(fù)供電時,讓其在MCLR產(chǎn)生一低電平喚醒SLEEP,并重新復(fù)位。這樣需在MCLR端加一外部復(fù)位電路。第三種方法則在需要使用系統(tǒng)時喚醒睡眠中的單片機(jī),它常通過按鍵輸入來實現(xiàn)。系統(tǒng)上電時,STATUS的PD被置為“1”,而執(zhí)行“SLEEP”指令后,PD位被置成“0”。所以通過PD位可以判斷系統(tǒng)是從SLEEP模式喚醒而復(fù)位,還是上電后的復(fù)位。STATUS中的TO位則可判斷當(dāng)處于SLEEP狀態(tài)的系統(tǒng)是由WDT溢時喚醒或是由外界給MCLR端一個低電平喚醒。這些區(qū)別有時是很重要的,特別是對系統(tǒng)的一些初始化工作來說。
§1.12.9 系統(tǒng)定義字(Configuration)
在PIC12C5XX中有一個12位長的系統(tǒng)定義字單元,其中只用了前5位(bit0~bit4),用來定義單片機(jī)的一些系統(tǒng)性能選擇,如下圖:
圖1.24 系統(tǒng)定義字
系統(tǒng)定義字屬特殊的空間,不占用芯片的程序存儲器,不能由程序指針(用戶程序)訪問,用戶可以用燒寫器對其進(jìn)行編程,參見燒寫器章節(jié)中的描述。
程序保密位被置為“0”后,程序存儲區(qū)中的程序代碼(12位)中的高8位將被遮沒。具體地說,就是加密后再用燒寫器讀該芯片的程序區(qū)時,每一個程序代碼都呈現(xiàn)00X的形式,這樣別人就無法恢復(fù)這些被加密的代碼,因此也就無法進(jìn)行復(fù)制拷貝。加密后的單片機(jī)的功能不會受任何影響,加密后的程序代碼并不影響其在芯片內(nèi)的運行,而只是不能再被還原讀出來。
§1.12.10 ID碼
PIC12C5XX芯片中有一個16位的標(biāo)識碼(稱為ID碼),用來作芯片標(biāo)識。ID碼僅起芯片識別作用,用戶可在燒寫器上將其燒入和讀出作芯片識別(如燒入日期等),但不會對芯片功能產(chǎn)生任何影響,即不使用它也沒有關(guān)系。