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