PIC單片�(jī)是一�(gè)小的�(jì)算機(jī)PIC單片�(jī)有計(jì)算功能和記憶�(nèi)��CPU并由軟件控制允行。然�,處理能�-存儲(chǔ)�容量卻很有限,這取決于PIC的類型。但是它們的操作頻率大約都在20MHz左右,存�(chǔ)器容量用做寫程序的大�1K-4K字節(jié)。時(shí)鐘頻率與掃描程序的時(shí)間和�(zhí)行程序指令的�(shí)間有�(guān)�。但不能僅以�(shí)鐘頻率來判斷程序處理能力,它還隨處理裝置的體系結(jié)�(gòu)改變(1*)。如果是同樣的體系結(jié)�(gòu),時(shí)鐘頻率較高的處理能力�(huì)較強(qiáng)�
PIC單片�(jī)系列是美�(guó)微芯公司(MiCroShip)的產(chǎn)�,是�(dāng)前市�(chǎng)份額增長(zhǎng)最快的單片�(jī)之一。CPU采用RISC�(jié)�(gòu),分別有33�35�58條指�(視單片機(jī)的級(jí)別而定),屬精簡(jiǎn)指令�。�51系列�111條指�,AVR單片�(jī)�118條指�,都比前者復(fù)�。采用Haryard雙總線結(jié)�(gòu),運(yùn)行速度�(指令周期�160�200nS),它能使程序存儲(chǔ)器的訪問和數(shù)�(jù)存儲(chǔ)器的訪問并行處理,這種指令流水線結(jié)�(gòu),在一�(gè)周期�(nèi)完成兩部分工�,一是執(zhí)行指令,二是從程序存�(chǔ)器取出下一條指�,這樣總的看來每條指令只需一�(gè)周期(�(gè)別除�),這也是高效率�(yùn)行的原因之一。此�,它還具有低工作電壓、低功�、驅(qū)�(dòng)能力�(qiáng)等特�(diǎn)。PIC系列單片�(jī)共分三�(gè)�(jí)�,即基本�(jí)、中�(jí)�。其中又以中�(jí)的PICl6F873(A)、PICl6F877(A)用的最�,本文以這兩種單片機(jī)為例�(jìn)行說明。這兩種芯片除了引出腳不同�(:PICl6F873(A)�28腳的PDIP或SOIC封裝PICl6F877(A)�40腳的PDIP�44腳的PICC/QFP封裝),其他的差別并不很大�
PIC系列單片�(jī)的:I/O口是雙向�,其輸出電路為CMOS互補(bǔ)推挽輸出電路。I/O腳增加了用于�(shè)置輸入或輸出狀�(tài)的方向寄存器(TRISn,其中n�(duì)�(yīng)各口,如A、B、C、D、E�),從而解決了51系列I/O腳為高電平時(shí)同為輸入和輸出的狀�(tài)。當(dāng)置位1�(shí)為輸入狀�(tài),且不管該腳呈高電平或低電平,對(duì)外均呈高阻狀�(tài);置�0�(shí)為輸出狀�(tài),不管該腳為何種電平,均呈低阻狀�(tài),有相當(dāng)?shù)�?qū)�(dòng)能力,低電平吸人電流�(dá)25mA,高電平輸出電流可達(dá)20mA。相�(duì)�51系列而言,這是一�(gè)很大的優(yōu)�(diǎn),它可以直接�(qū)�(dòng)�(shù)碼管顯示且外電路�(jiǎn)�。它的A/D�10位,能滿足精度要�。具有在線調(diào)試及編程(ISP)功能�
該系列單片機(jī)的專用寄存器(SFR)并不�51系列那樣都集中在一�(gè)固定的地址區(qū)間內(nèi)(80~FFH),而是分散在四�(gè)地址區(qū)間內(nèi),即存儲(chǔ)�0(Bank0�00-7FH)、存�(chǔ)�1(Bankl�80-FFH)、存�(chǔ)�2(Bank2�100-17FH)、存�(chǔ)�3(Bank3�180-1FFH)。只�5�(gè)專用寄存器PCL、STATUS、FSR、PCLATH、INTCON�4�(gè)存儲(chǔ)體內(nèi)同時(shí)出現(xiàn)。在編程過程中,少不了要與專用寄存器打交�,得反復(fù)地選擇對(duì)�(yīng)的存�(chǔ)�,也即對(duì)狀�(tài)寄存器STATUS的第6�(RPl)和第5�(RPO)置位或清�。如�
�4�
CLRF STATUS ;清零RPl,RPO。選擇存�(chǔ)體O BSF STAUS,RPO;置位RPO。選擇存�(chǔ)�1 BCF STATUS,RPO;清零RPO。選擇存�(chǔ)體O
這多少給編程帶來了一些麻�。對(duì)于上述的單片�(jī),它的位指令操作通常限制在存�(chǔ)�0區(qū)�(00�7FH)�
�(shù)�(jù)的傳送和邏輯�(yùn)算基本上都得通過工作寄存器w(相當(dāng)�5l系列的累加器A)來�(jìn)�,�51系列的還可以通過寄存器相互之間直接傳�(如:MOV30H�20H;將寄存�20H的內(nèi)容直接傳送至寄存�30H�),因而PIC單片�(jī)的瓶頸現(xiàn)象比51系列還要�(yán)�,這在編程中很有感受�
�(jù)�(tǒng)�(jì),我�(guó)的單片機(jī)年容量已�(dá)1�3億片,且每年以大�16[%]的速度增長(zhǎng),但相對(duì)于世界市�(chǎng)我國(guó)的占有率還不�1[%]。這說明單片機(jī)�(yīng)用在我國(guó)才剛剛起�,有著廣闊的前景。培�(yǎng)單片�(jī)�(yīng)用人�,特別是在工程技�(shù)人員中普及單片機(jī)知識(shí)有著重要的現(xiàn)�(shí)意義�
�(dāng)今單片機(jī)廠商琳瑯滿目,產(chǎn)品性能各異。針�(duì)具體情況,我們應(yīng)選何種型�(hào)�?首�,我們來弄清兩�(gè)概念:集中指令集(CISC)和精簡(jiǎn)指令集(RISC�。采用CISC�(jié)�(gòu)的單片機(jī)�(shù)�(jù)線和指令線分�(shí)�(fù)�,即所謂馮.諾伊曼結(jié)�(gòu)。它的指令豐�,功能較�(qiáng),但取指令和取數(shù)�(jù)不能同時(shí)�(jìn)�,速度受限,價(jià)格亦�。采用RISC�(jié)�(gòu)的單片機(jī)�(shù)�(jù)線和指令線分�,即所謂哈佛結(jié)�(gòu)。這使得取指令和取�(shù)�(jù)可同�(shí)�(jìn)行,且由于一般指令線寬于�(shù)�(jù)�,使其指令較同類CISC單片�(jī)指令包含更多的處理信�,執(zhí)行效率更�,速度亦更�。同�(shí),這種單片�(jī)指令多為單字節(jié),程序存�(chǔ)器的空間利用率大大提�,有利于�(shí)�(xiàn)超小型化。屬于CISC�(jié)�(gòu)的單片機(jī)有Intel8051系列、Motorola和M68HC系列、Atmel的AT89系列、臺(tái)灣Winbond(華邦)W78系列、荷蘭Pilips的PCF80C51系列�;屬于RISC�(jié)�(gòu)的有Microchip公司的PIC系列、Zilog的Z86系列、Atmel的AT90S系列、韓�(guó)三星公司的KS57C系列4位單片機(jī)、臺(tái)灣義隆的EM-78系列�。一般來�,控制關(guān)系較�(jiǎn)單的小家�,可以采用RISC型單片機(jī);控制關(guān)系較�(fù)雜的�(chǎng)合,如通訊�(chǎn)�、工�(yè)控制系統(tǒng)�(yīng)采用CISC單片�(jī)。不�,RISC單片�(jī)的迅速完善,使其佼佼者在控制�(guān)系復(fù)雜的�(chǎng)合也毫不遜色�
根據(jù)程序存儲(chǔ)方式的不同,單片�(jī)可分為EPROM、OTP(一次可編程�、QTP(掩膜)三種。我�(guó)一開始都采用ROMless型單片機(jī)(片�(nèi)無ROM,需片外配EPROM�,對(duì)單片�(jī)的普及起了很大作用,但這種�(qiáng)�(diào)接口的單片機(jī)無法廣泛�(yīng)�,甚至走入了誤區(qū)。如單片�(jī)的應(yīng)用一味強(qiáng)�(diào)接口,外接I/O及存�(chǔ)�,便失去了單片機(jī)的特色。目前單片機(jī)大都將程序存�(chǔ)體置于其�(nèi),給�(yīng)用帶來了極大的方�。值得一提的是,以往OTP型單片機(jī)的價(jià)格是QTP�3�,而現(xiàn)在已降至1.5�1.2倍,選用OTP型以免訂貨周�、批量的麻煩是可取的�
二、PIC系列單片�(jī)有什么優(yōu)�(shì)�
自從�95年接觸PIC單片�(jī)以來,便一直熱衷于這種單片�(jī)的開�(fā)與應(yīng)�。有不少朋友問我:PIC到底有什么優(yōu)�(shì)?也許你也會(huì)有這樣的疑�,所以我在這里略談幾點(diǎn)自己的看��
1)PIC的特�(diǎn)是不搞單純的功能堆積,而是從實(shí)際出�(fā),重視產(chǎn)品的性能與價(jià)格比,靠�(fā)展多種型�(hào)來滿足不同層次的�(yīng)用要�。就�(shí)際而言,不同的�(yīng)用對(duì)單片�(jī)功能和資源的需求也是不同的。比如,一�(gè)摩托車的�(diǎn)火器需要一�(gè)I/O較少、RAM及程序存�(chǔ)空間不大、可靠性較高的小型單片�(jī),若采用40腳且功能�(qiáng)大的單片�(jī),投資大不說,使用起來也不方�。PIC系列從低到高有幾十�(gè)型號(hào),可以滿足各種需�。其�,PIC12C508單片�(jī)僅有8�(gè)引腳,是世界上最小的單片�(jī)�
該型�(hào)�512字節(jié)ROM�25字節(jié)RAM、一�(gè)8位定�(shí)�、一根輸入線�5根I/O�,市面售�(jià)�3�6元人人民�。這樣一款單片機(jī)在象摩托車點(diǎn)火器這樣的應(yīng)用無疑是非常適合。PIC的型�(hào),如PIC16C74(尚不是檔型�(hào))有40�(gè)引腳,其�(nèi)部資源為ROM�4K�192字節(jié)RAM�8路A/D�3�(gè)8位定�(shí)��2�(gè)*模塊、三�(gè)串行��1�(gè)并行口�11�(gè)中斷��33�(gè)I/O腳。這樣一�(gè)型號(hào)可以和其它品牌的型號(hào)媲美�
2) 精簡(jiǎn)指令使其�(zhí)行效率大為提�。PIC系列8位CMOS單片�(jī)具有�(dú)特的RISC�(jié)�(gòu),數(shù)�(jù)總線和指令總線分離的哈佛總線(Harvard)結(jié)�(gòu),使指令具有單字�(zhǎng)的特�,且允許指令碼的位數(shù)可多�8位的�(shù)�(jù)位數(shù),這與傳統(tǒng)的采用CISC�(jié)�(gòu)�8位單片機(jī)相比,可以達(dá)�2:1的代碼壓縮,速度提高4��
3) �(chǎn)品上市零等待(Zero time to market�。采用PIC的低�(jià)OTP型芯�,可使單片機(jī)在其�(yīng)用程序開�(fā)完成后立刻使該產(chǎn)品上市�
4) PIC有優(yōu)越開�(fā)�(huán)�。OTP單片�(jī)開發(fā)系統(tǒng)的實(shí)�(shí)性是一�(gè)重要的指�(biāo),象普�51單片�(jī)的開�(fā)系統(tǒng)大都采用型號(hào)仿真低檔型號(hào),其�(shí)�(shí)性不盡理�。PIC在推出一款新型號(hào)的同�(shí)推出相應(yīng)的仿真芯�,所有的開發(fā)系統(tǒng)由專用的仿真芯片支持,實(shí)�(shí)性非常好。就我�(gè)人的�(jīng)�(yàn)看,還沒有出�(xiàn)過仿真結(jié)果與�(shí)際運(yùn)行結(jié)果不同的情況�
5) 其引腳具有防瞬態(tài)能力,通過限流電阻可以接至220V交流電源,可直接與繼電器控制電路相�,無須光電耦合器隔離,給應(yīng)用帶來極大方��
6) 徹底的保密�。PIC以保密熔絲來保護(hù)代碼,用戶在燒入代碼后熔斷熔�,別人再也無法讀�,除非恢�(fù)熔絲。目�,PIC采用熔絲深埋工藝,恢�(fù)熔絲的可能性極小�
7) 自帶看門狗定�(shí)�,可以用來提高程序運(yùn)行的可靠��
8) 睡眠和低功耗模式。雖然PIC在這方面已不能與新型的TI-MSP430相比,但在大多數(shù)�(yīng)用場(chǎng)合還是能滿足需要的�
PIC單片�(jī)采用精簡(jiǎn)指令�,例如對(duì)于PIC16F716單片�(jī),只�35條單字節(jié)指令。要用這么少的指令�(shí)�(xiàn)�(fù)雜的控制或計(jì)算,顯然要在程序�(shè)�(jì)上多做文�,以下就程序�(shè)�(jì)需要注意的問題談一些看法� 美國(guó)微芯公司開發(fā)的CMOS工藝PIC系列單片�(jī),特別是采用�(nèi)置第二代Flash存儲(chǔ)器的微控制器在快速應(yīng)用方面具有獨(dú)到之�。PIC單片�(jī)系列�(nèi)大都包含�(yùn)算器、存�(chǔ)器、A/D、PWM、輸入和輸出I/O、通信等常用接�。自由靈活的定義功能可以適應(yīng)不同的控制要求�
一、區(qū)分指令的大小�
編寫PIC單片�(jī)的源程序,除了源程序的開始處需要嚴(yán)格的列表指令�,還須注意源程序中字母符�(hào)的大小寫�(guī)�,否則在PC�(jī)上匯編程序時(shí)不會(huì)成功。在源程序中都會(huì)使用偽指令I(lǐng)NCLUDE。這條指令將列表中指定的單片機(jī)文件(在MPLAB�)瀆入源程序作為源程序的一部分,所以凡是MPLAB中有�(guān)該單片機(jī)已有的寄存器在源程序中無須再用賦值指�(EQU)賦�,這就使所建立的源程序大為�(jiǎn)��
此外,由于有了偽指令I(lǐng)NCLUDE,所以根�(jù)MPLAB軟件中的格式,在源程序中的操作數(shù)凡是涉及MPLAB已規(guī)定的寄存器名稱的,其字母一律只能大�,不能小寫。其余操作碼、符�(hào)字母可任意大小寫,但0x中的X�(yīng)小寫。否則匯編不�(huì)成功。鑒于上述原�,為了書寫方便,在使用MPLAB軟件�(shí),PIC單片�(jī)的源程序均用大寫字母為宜(0x例外)�
以下舉例有關(guān)�(jī)器人控制的實(shí)�(xiàn)??刂撇糠植捎肞IC16F7X系列單片�(jī),運(yùn)用匯編語(yǔ)言編程,運(yùn)行速度較快,能夠達(dá)到系�(tǒng)的要求�
�、動(dòng)作標(biāo)志位的使�
在整�(gè)控制�,組合的�(dòng)作很�,當(dāng)所有動(dòng)作定位都通過光電開關(guān)控制�(shí),在程序編寫上就有一些問�。如要求左手上升到鼓掌位、右手上升到舉手�(手初始位置在最下的放下�),光電開�(guān)0有效(即為0�(shí)是擋�),到�(dá)正確位置。用�(jiǎn)單的理解可以寫成下面的程序:
list P=16c73
call lefthandup
call righthandup
L0 call readinsignal
bdss csl[_]v,lefthandligbts
call lefthandstop
bfsc csl[_]v,righthandlight4
goto L0
call righthandstop
L1 call readinsignal
bfsc csl[_]v,lefthandlight3
goto L1
call lefthandstop
lefthandlight表示光電開關(guān),由此判斷是否到相應(yīng)的位��1表示在手臂最下面的位��2表示在手臂的握手位置�3表示在手臂的鼓掌位置�4表示在手臂的高舉手位�。上面程序描寫左手臂上升到舉手位置和右手臂上升到鼓掌位置并停止的過程。先判斷左手到達(dá)�,到�(dá)則左手停�,接著看右手是否到達(dá)舉手�,到�(dá)則停�,否則循�(huán)上述的檢�(cè),直到左手到�(dá)鼓掌�,右手到�(dá)舉手位�
注意,這里�3�4表示的就是鼓掌位、舉手位。經(jīng)過循�(huán)檢測(cè)可以讓手臂停在各位上,然而機(jī)械動(dòng)作是有慣性的,機(jī)械停止位可能在該位的上一�(diǎn)或下一�(diǎn),這就影響下面�(dòng)作的�(jìn)�,可能在若干�(dòng)作后�(jī)械動(dòng)作出�(xiàn)失常,也就是程序沒法正常地運(yùn)�。在此情況下,需要修改程序的編寫方式,采用標(biāo)志位來控制動(dòng)作的�(jìn)行。如果采用控制標(biāo)志位,一定要在動(dòng)作子函數(shù)中對(duì)�(biāo)志位置零�
三、區(qū)分GOTO和CALL指令的使用場(chǎng)�
在PIC的匯編程序中,CALL與GOTO指令的使用比較多、且容易混淆,一般情況下,在于程序與主程序之間大多用CALL指令;而狀�(tài)�(zhuǎn)換模塊之間大多用GOTO指令,即由此狀�(tài)�(jìn)入另一種狀�(tài)不需返回。由于PIC單片�(jī)的堆棧有�,在程序�,不能無止境地使用GOTO�(yǔ)句,否則�(huì)使堆棧溢�,程序無法正常運(yùn)�。各�(gè)小程序內(nèi)部循�(huán)占用堆棧的級(jí)�(shù)不多,使用GOTO指令是可行的,但在大的程序中用GOTO則無法返回到�(diào)用前程序的下一條指�。CALL指令完成�(diào)用完子程序后返回到調(diào)用前的程�。如在超聲檢�(cè)中程序如下:
list D=16c76
start:call setcpu
call automaflsmstate1
L3 call readinsignal
bfsc es2[_]v,ultrasonicdetect1
goto L3
goto automatlsmstate2:
automatlsmstate2:
return
automafismstate1、automatlsmstate2表示兩種狀�(tài),ultrasonicdetect1表示一�(gè)輸入超聲檢測(cè)信號(hào)。上面程序描寫調(diào)用automatlstmstatei狀�(tài),執(zhí)行完后�(jìn)行下面的檢測(cè)uhrasonicdetect1,沒有觸�(fā)就一直循�(huán)檢測(cè),觸�(fā)就�(jìn)入automatlsmstate2狀�(tài),執(zhí)行完也不再回到下面的程序�
由于PIC單片�(jī)的堆棧有限,在程序中不能無止境地使用GOTO指令,否則會(huì)使堆棧溢�,程序無法正常運(yùn)�。但是在有些�(shí)候,例如�(dāng)程序出現(xiàn)分支�(shí),則不得不使用GOTO指令。對(duì)于PIC16F7X系列單片�(jī),程序出�(xiàn)分支�(shí)只能通過STATUS寄存器的z位或c位�(jìn)行判斷。這時(shí)在兩種情況的前一種情況下,必須使用GOTO指令�(jìn)行轉(zhuǎn)�;否則在�(zhí)行完種情況后,緊接著又執(zhí)行第二種情況。因此,在使用匯編語(yǔ)言�(jìn)行程序設(shè)�(jì)�(shí),應(yīng)該將程序分解成一�(jí)�(jí)的子程序;然后在程序之間�(jìn)行調(diào)�,盡量將GOTO指令跳轉(zhuǎn)的范圍縮��
四、注意狀�(tài)�(biāo)志位Z、C的不同使用情�
在�(jìn)行判斷標(biāo)志位�(shí),Z(零標(biāo)�)、C(借位�(biāo)�)是不同的。Z�1�(shí),表示上面的�(jié)果為0,Z�0�(shí),則�(jié)果不�0。C�1�(shí),借位,C�0�(shí),沒有借位。在使用定時(shí)器的�(shí)�,一般使用C�(biāo)志位,這是由于�(dāng)完成某一�(dòng)作去檢查定時(shí)器時(shí),時(shí)間可能沒到,或是正好,或是已�(jīng)超過�(shí)間,只要到了或超過時(shí)�,都要按照要求關(guān)閉定�(shí)�,如下面程序所述。如果用Z�(biāo)志位,等�0�(shí)可能沒有檢測(cè)到,無法判斷停止的狀�(tài),而用Z可以很好地控制時(shí)間定�(shí)。�(jìn)行一般的�(jì)算時(shí)大多用Z,如前面的動(dòng)作標(biāo)志位中就是如此使用的�
list D=16c76
call openfimer0
L4 movlw d'30'
subwf t0[_]v2,W
bfsc status,c
goto L4
call dosetimer0
程序檢測(cè)�(shí)間是否到�(dá)1.5s,沒有則循�(huán)等待,到了或檢測(cè)�(shí)間過了就�(guān)閉定�(shí)�,�(zhí)行下面的程序�
總之,在PIC單片�(jī)的編程中采用合適的方�,可以使整�(gè)程序�(yùn)行穩(wěn)�,而且程序空間的使用也將有所減小,避免了�(diào)試中的Bug�
美國(guó)微芯公司(Microch{p Technology Inc�)開發(fā)的CM0S工藝PIC系列8位單片機(jī)(RISC微控制器),特別是采用�(nèi)置第二代Flash存儲(chǔ)�(40年存�(chǔ)壽命)的微控制器在快速應(yīng)用方面具有獨(dú)到之�。由于其易用性和高可靠�,該系列微控制器�(wěn)�8位單片機(jī)全球出貨量之�。PIC系列單片�(jī)具有指令集簡(jiǎn)�、簡(jiǎn)單易�(xué)、速度�、功能強(qiáng)、功耗低、價(jià)格低�、體積小�、適用性好及抗干擾能力�(qiáng)等特�(diǎn),大量應(yīng)用于汽車電氣控制、電�(jī)控制、工�(yè)控制儀表和儀�、通信、家�、玩�、低功耗的�(cè)控應(yīng)用等�(lǐng)域,在國(guó)�(nèi)越來越受到廣大設(shè)�(jì)者的歡迎,微芯公司的單片�(jī)已經(jīng)成為目前單片�(jī)世界的主流產(chǎn)品�
PIC 8位單片機(jī)�(nèi)已經(jīng)包含�(yùn)算器、存�(chǔ)�、A/D、PWM、輸入和輸出I/O(灌電流可�(dá)25mA)、通信等常用接口,自由靈活的定義功能可以適�(yīng)不同的控制要�。而不必增加額外的IC芯片。這樣電路�(jié)�(gòu)很簡(jiǎn)�,開�(fā)周期將大為縮��
PICl6系列單片�(jī)屬于PIC8位單片機(jī)的中�(jí)型產(chǎn)�,采�14位的RISC指令系統(tǒng)。筆者使用PICl6F716單片�(jī)�(shè)�(jì)了一�(gè)電動(dòng)�(jī)保護(hù)�,在�(shè)�(jì)過程中遇到很多問題,通過多方查找資料以及向Microchip公司技�(shù)人員尋求支持,問題一一得到解決?,F(xiàn)將部分問題記錄如�,與大家一起探��
1 ICD2作為程序燒寫的使�
1.1 ICD2�(jiǎn)�
MPLAB ICD2在線�(diào)試器是一款低�(jià)位的PIC開發(fā)工具。它利用Flash工藝芯片的程序區(qū)自讀寫功能來�(shí)�(xiàn)仿真器調(diào)試功能;使用的軟件平�(tái)是Microchip的MPLAB IDE(集成開發(fā)�(huán)境軟件包),兼容Windows NT、Windows 2000和Windlows XP等操作系�(tǒng)。其通信接口方式可以是USB(可達(dá)2Mb/s)或RS-232串行接口方式;工作電壓范圍為2.O�5�5V,可支持2�0V的低壓調(diào)��
MPLABICD2可以支持大部分Flash工藝的芯�。它不僅可以用作�(diào)試器,同�(shí)還可以作為開�(fā)型的燒寫器使��
1�2 ICD2作為燒寫器時(shí)的配�
燒寫芯片的方式有兩種:普通燒寫和在線燒寫。在線燒寫是適合大批量生�(chǎn)方式的燒寫辦�。使用在線燒寫時(shí)通常用戶都已�(jīng)把芯片焊到了板上,此�(shí)就要求用戶板上有�(yù)留的燒寫接口。用戶板上的接口是通過一�6芯的扁平電纜與ICD2主機(jī)上同樣的接口一一�(duì)�(yīng)連接�。圖1顯示了MPLAB ICD2與目�(biāo)板上模塊連接插座的互連狀��
ICD連接插座�6�(gè)引腳,但只使用了其中�5�(gè)引腳,分別是VDD(電源)、VSS(�)、VPP(編程電壓)、PGC(同步�(shí)�)和PGD(�(shù)�(jù))�
1�3 ICD2作為燒寫器時(shí)容易出現(xiàn)的問題及解決方法
盡管MPLAG ICD2與目�(biāo)板的互連非常簡(jiǎn)單,但是一不小心就�(huì)出現(xiàn)問題,基本上每一�(gè)PIC的入門者都�(huì)碰到類似的問�。下面就一些常見問題作�(jiǎn)要敘��
如圖1所�,在VPP與VDD之間通常要串接一�(gè)上拉電阻(通常約為10kΩ),這樣VPP線可置為低電平來手動(dòng)�(fù)位PICmicro單片�(jī)。但是對(duì)一般設(shè)�(jì)者來�,都是采用上電自�(dòng)�(fù)�。如果在這里采用集成器件DMP809,那么就�(huì)�(dǎo)致連接不上,程序沒有辦法燒��
�(duì)于PGC、PGD兩根�,由于在ICD2�(nèi)部已�(jīng)�(jìn)行了上拉,所以在外圍�(shè)�(jì)�,不要冉�(jìn)行上拉,否則�(huì)造成分壓。對(duì)于PGC、PGD和VPP三根�,不要對(duì)地接電容.因?yàn)殡娙�?huì)阻礙在數(shù)�(jù)和時(shí)鐘線上電平的快速轉(zhuǎn)換,從而影響ICD2與目�(biāo)板的連接。同樣對(duì)于PGC、PGD,由于數(shù)�(jù)或時(shí)鐘都是雙向傳�?shù)?,這時(shí)如果在中間串一�(gè)二極�,則�(huì)影響ICD2與單片機(jī)的雙向通信�
但是,對(duì)PGC和PGD來說,在單片�(jī)上同�(shí)�(fù)用為普通I/O�,而有些使用上必須要接�(duì)地電容或者是串接二極管。對(duì)于這種情況,的處理方式就是在燒寫時(shí)從芯片的PGC和PGD端口直接跳線到程序燒寫口�
2 A/D�(zhuǎn)換通道切換問題
筆者所�(shè)�(jì)的電�(dòng)�(jī)保護(hù)器需要�(jìn)行很多A/D�(zhuǎn)�,比如三相電流轉(zhuǎn)�、零序電流轉(zhuǎn)換以及各�*�。但是筆者所采用的PIC16F716單片�(jī)只有5路A/D�(zhuǎn)換通道,因此附加了一�(gè)多位選擇開關(guān)�(duì)一�(gè)A/D通道�(jìn)行復(fù)�。而在�(diào)試中�(fā)�(xiàn)這樣一�(gè)問題,就是A/D�(zhuǎn)換值不�(zhǔn)�,甚至有�(diǎn)亂,但從程序流程以及代碼角度均查不出任何問題。后查明PICl6F716單片�(jī)�(jìn)行A/D�(zhuǎn)換通道切換�(shí),需要一定的延時(shí),延�(shí)�(shí)間是毫秒�(jí)。解決辦法是:在通道問切換時(shí),當(dāng)�(gè)通道�(zhuǎn)換完成后,先�(zhuǎn)到另一�(gè)通道;然后延�(shí)1ms左右,再�(jìn)行A/D�(zhuǎn)換。而對(duì)同一�(gè)通道信號(hào)切換�(shí),要在�(gè)信號(hào)�(zhuǎn)換完成后,禁止信�(hào)輸入,延�(shí)1ms左右;然后輸人信�(hào),再�(jìn)行A/D�(zhuǎn)換�
這種做法比較麻煩,也很占用時(shí)�,并且從�(diào)試結(jié)果來�,問題并沒有解決。在反復(fù)�(jìn)行調(diào)試中,得到的�(yōu)化解決辦法是:對(duì)于通道間轉(zhuǎn)換以及同一通道信號(hào)�(zhuǎn)�,要�(duì)每一�(gè)信號(hào)至少�(jìn)行兩次A/D�(zhuǎn)�;次的轉(zhuǎn)換結(jié)�,舍棄不予處�,只取第二次A/D�(zhuǎn)換的�(jié)果。從�(diào)試結(jié)果來�,很好地解決了這一問題�
3 軟件開發(fā)小技�
PIC單片�(jī)采用精簡(jiǎn)指令�,例如對(duì)于PICl6F716單片�(jī),只�35條單字節(jié)指令。要用這么少的指令�(shí)�(xiàn)�(fù)雜的控制或計(jì)算,顯然要在軟件�(shè)�(jì)上多下功�,并且PIC的指令系�(tǒng)�51系列單片�(jī)有很大不�,這讓PIC初學(xué)者很不適�(yīng)。下面筆者就自己的體�(huì),談一些軟件設(shè)�(jì)需要注意的問題�
3.1 指令的大小寫問題
編寫PIC單片�(jī)的源程序,除了源程序的開始處需要嚴(yán)格的列表指令�,還須注意源程序中字母符�(hào)的大小寫�(guī)則,否則在PC�(jī)上匯編程序時(shí)不會(huì)成功。在源程序中都會(huì)使用偽指令I(lǐng)NCLUDE。這條指令將列表中指定的單片機(jī)文件(在MPLAB�)讀入源程序作為源程序的一部分,所以凡是MPLAB中有�(guān)該單片機(jī)已有的寄存器在源程序中無需再用賦值指�(EQU)賦�,這就使所建立的源程序大為�(jiǎn)化�
此外,由于有了偽指令I(lǐng)NCLUDE,所以根�(jù)MPLAB軟件中的格式,在源程序中的操作數(shù)凡是涉及MPLAB已規(guī)定的寄存器名稱的,其字母一律只能大寫,不能小寫。其余操作碼、符�(hào)字母可任意大小寫,但0x中的x�(yīng)小寫。否則匯編不�(huì)成功。鑒于上述原�,為了書寫方�,在使用MPLAB軟件�(shí),PIC單片�(jī)的源程序均用大寫字母為宜(0x例外)�
3�2 振蕩器的配置以及�(shí)序的�(jì)�
PIC系列單片�(jī)可以工作于以�4種不同的振蕩器方式:LP(低功耗晶體振蕩器)、XT(晶體諧振�)、HS(高速晶體諧振器)和RC(阻容振蕩�)。用戶可以根�(jù)其系�(tǒng)�(shè)�(jì)的需�,通過�(duì)配置�(FOSC1和F0SC2)編程,選擇其中一種工作模��
而一旦振蕩器配置完成,那么根�(jù)用戶的配�,可以輕松地�(jì)算出程序�(yùn)行的�(shí)間以及A/D�(zhuǎn)換所占用的時(shí)間,這樣就會(huì)很輕松地安排好單片機(jī)的時(shí)�。例如,如果采用4 MHz的HS振蕩模式,那么單片機(jī)的時(shí)鐘頻率為FOSC/4,也就是說執(zhí)行一條指令需�1μs;對(duì)于需要兩�(gè)指令周期的指�,需�2μs。而對(duì)于A/D�(zhuǎn)�,如果A/D�(zhuǎn)換時(shí)鐘位選擇為FOSC�8,那么A/D�(zhuǎn)換模塊轉(zhuǎn)換一�(gè)位的�(shí)間Tad就為2μs。對(duì)一�(gè)8位的�(zhuǎn)換來�,需要的�(shí)間為9�5Tad,也就是完成一次A/D�(zhuǎn)換的�(shí)間為19μs。這樣只需要查看源程序的行�(shù)并作�(jiǎn)要分�,就可以�(jì)算出程序�(yùn)行的�(shí)間�
3.3 存儲(chǔ)體的選擇
PIC單片�(jī)的數(shù)�(jù)存儲(chǔ)器通常分為兩�(gè)存儲(chǔ)�,即存儲(chǔ)體O(Bank0)和存�(chǔ)�1(Bankl)。每�(gè)存儲(chǔ)體都是由專用寄存器和通用寄存器兩部分組成�。兩�(gè)存儲(chǔ)體中的一氈寄存器單元�(shí)際上是同一�(gè)寄存器單元,卻又具有不同的地址�
不同型號(hào)的PIC單片�(jī),其�(shù)�(jù)存儲(chǔ)器的組成(即功�)是不完全相同�,所以設(shè)�(jì)人員一旦選用了某�(gè)PIC單片�(jī)的型�(hào)�,就要查找該單片�(jī)的數(shù)�(jù)存儲(chǔ)器資�,以便編程使��
筆者所采用的PICl6F716單片�(jī)的存�(chǔ)區(qū),是通過STATUS寄存器的RPl位和RP0位來選擇的。當(dāng)配置�00�(shí),表示選擇存�(chǔ)區(qū)0;當(dāng)配置�01�(shí),表示選擇存�(chǔ)區(qū)1。因?yàn)榇鎯?chǔ)區(qū)的改變只須改變RP0�,所以通常在程序編寫時(shí),只改變RP0位來選擇存儲(chǔ)區(qū)。但是這樣容易造成程序的混亂,因此,筆者建議在每次更換存儲(chǔ)區(qū)�(shí),要分別�(duì)RPO和RPl�(jìn)行置�。在程序初始化時(shí),將寄存器的初始化分為兩部分:部分為存儲(chǔ)區(qū)O;第二部分為存儲(chǔ)區(qū)1。然后將每�(gè)需要初始化的寄存器分別在對(duì)�(yīng)的存�(chǔ)區(qū)�(jìn)行初始化即可�
3.4 GOTO和CALL指令的不同使�
在PIC的匯編程序中,CALL與GOT0指令使用的場(chǎng)�(tái)不同。CALL是用來調(diào)用子程序�,在�(diào)用完子程序后返回到調(diào)用前的程序;而GOTO是無條件�(zhuǎn)�,即由此狀�(tài)�(jìn)入另外一�(gè)狀�(tài)而不需要返��
為了使程序更加具有可讀�,使流程更加清晰、合�,通常程序都采用模塊化程序�(shè)�(jì),即將程序按照功能分成不同的子程�,而主程序則相�(dāng)�(jiǎn)潔,只須采用CALL指令�(duì)子程序�(jìn)行調(diào)��
由于PIC單片�(jī)的堆棧有限,在程序中不能無止境地使用GOTO指令,否則會(huì)使堆棧溢�,程序無法正常運(yùn)�。但是在有些�(shí)候,例如�(dāng)程序出現(xiàn)分支�(shí),則不得不使用GOTO指令。對(duì)于PICl6F7x系列單片�(jī),程序出�(xiàn)分支�(shí)只能通過STATUS寄存器的Z位或C位�(jìn)行判�。這時(shí)在兩種情況的前一種情況下,必須使用GOTO指令�(jìn)行轉(zhuǎn)�;否則在�(zhí)行完種情況后,緊接著又執(zhí)行第二種情況。程序如下:
BTFSS STATUS,Z
GOTO A
GOTO B
在跳�(zhuǎn)到A�(shí),必須使用GOTO指令;否則執(zhí)行完這條�(yǔ)句以�,緊接著�(zhí)行GOTO B。這樣無論Z為何�,程序都將跳�(zhuǎn)到B。而對(duì)于GOT0 B,則可以不必使用GOTO指令�
在上面這種情況�,由于GOTO只在子程序內(nèi)部�(jìn)行跳�(zhuǎn),小程序�(nèi)部循�(huán)占用堆棧的級(jí)�(shù)不多,因此使用GOTO指令是可行的。但是在大的程序中使用GOTO指令,將有可能無法返回到�(diào)用前的下一條指��
因此,筆者建�,在使用匯編�(yǔ)言�(jìn)行程序設(shè)�(jì)�(shí),應(yīng)該將程序分解成一�(jí)�(jí)的子程序;然后在程序之間�(jìn)行調(diào)�,盡量將GOTO指令跳轉(zhuǎn)的范圍縮��
3.5 �(duì)芯片的重�(fù)燒寫
�(duì)沒有硬件仿真器的�(shè)�(jì)者來�,總是選用帶有EPROM的芯片來�(diào)試程�,通過反復(fù)的修改來觀看運(yùn)行結(jié)果,以便�(duì)程序�(jìn)行調(diào)�。每更改一次程序.都是將原來的�(nèi)容先擦除,再編程,浪�(fèi)了相�(dāng)多的�(shí)�,又縮短了芯片的使用壽命。如果后一次編程較前一�,僅是對(duì)�(yīng)的機(jī)器碼字節(jié)的相同位�1�?yōu)?,那么就可在前一次編程芯片上再次寫入�(shù)�(jù),而不必擦除原片內(nèi)��
在程序調(diào)�
過程�,經(jīng)常遇到常�(shù)的調(diào)整。如果常�(shù)的改變能保證�(duì)�(yīng)位由1�0,則都可在原片內(nèi)容的基礎(chǔ)上繼�(xù)編程。另�,由于指令NOP�(duì)�(yīng)的機(jī)器碼�00,調(diào)試過程中指令的刪�,可先用NOP指令替代,編譯后也可在原片內(nèi)容上繼續(xù)編程�
�(jié)�(yǔ)
在采用PIC單片�(jī)�(jìn)行設(shè)�(jì)過程中,注意到PIC單片�(jī)自身的特�(diǎn),可盡量少走彎路,從而縮短開�(fā)周期。同樣在軟件�(shè)�(jì)上采用合適的方法,可以使整�(gè)程序�(yùn)行穩(wěn)�,而且程序空間的使用也將有所減少,避免了�(diào)試中的Bug。以上只是筆者在�(shí)際設(shè)�(jì)過程中一些小小的體會(huì)。希望與大家一起探討,并在共同�(xué)�(xí)中為PIC單片�(jī)的普及和推廣做出貢獻(xiàn)�
PIC16F877單片�(jī)配置了兩�(gè)CCP(捕捉/比較/脈寬調(diào)制)模塊,即CCP1和CCP2。它們各白都有獨(dú)立的16位寄存器CCPR1和CCPR2。兩�(gè)模塊的結(jié)�(gòu)、功能、操作方法基本一�,區(qū)別僅在于它們各自有�(dú)立的外部引腳和特殊事件觸�(fā)器。CCP模塊的功能包括外部信�(hào)捕捉、內(nèi)部比較輸出以及PWM輸出,它往往與定�(shí)器/�(jì)�(shù)器配合使��
CCP模塊可工作在3種模式下:捕捉方�、比較方式和脈寬�(diào)制方式�
· 捕捉方式是指檢測(cè)引腳上輸入信�(hào)的狀�(tài),當(dāng)信號(hào)的狀�(tài)符合�(shè)定的條件�(shí)(信�(hào)上升沿或下降沿出�(xiàn)�(shí))產(chǎn)生中�,并記錄�(dāng)�(shí)的定�(shí)器/�(jì)�(shù)器�,當(dāng)CCP模塊工作在捕捉方式時(shí),TMR1控制寄存器必須工作在定時(shí)器或同步�(jì)�(shù)方式��
· 比較方式是指將事先設(shè)定好的值與定時(shí)器方式或同步�(jì)�(shù)方式下的值相互比�,當(dāng)兩�(gè)值相等時(shí),產(chǎn)生中斷并�(qū)�(dòng)事先�(shè)定好的動(dòng)��
· 脈寬�(diào)制功能適用于從引腳上輸出脈沖寬度隨時(shí)可調(diào)的PWM信號(hào),來�(shí)璣直流電�(jī)的調(diào)�、D/A�(zhuǎn)換和步�(jìn)電機(jī)的步�(jìn)控制�
本設(shè)�(jì)�(yīng)用PIC16F877單片�(jī)的CCP模塊的捕獲工作方式�(jìn)行頻率計(jì)的設(shè)�(jì),具體設(shè)�(jì)要求如下�
�(cè)量對(duì)象為100�1000Hz的TTL電平信號(hào),待�(cè)量的參數(shù)有:
· 頻率,測(cè)量誤差小�0.1��
· 周期,測(cè)量誤差小�0.1��
· 脈沖寬度(高電平持續(xù)�(shí)間),脈沖寬度大�100μs,測(cè)量誤差小�1%;
· 占空�,占空比的變化范圍為10%~90%,�(cè)量誤差小�1��
頻率�(jì)的設(shè)�(jì)原理如下�
在t1�(shí)刻之前把CCP1�(shè)置為捕捉脈沖上升�。當(dāng)信號(hào)上升沿到來時(shí),產(chǎn)生CCP中斷,在中斷服務(wù)程序中捕捉該�(shí)刻TMR1寄存器中16位的值time1,將CCP1�(shè)置為捕捉脈沖的下降沿�
�(dāng)該信�(hào)下降沿到來時(shí),產(chǎn)生CPP中斷,在中斷服務(wù)程序中捕捉該�(shí)刻TMR1寄存器中16位的值time2,而后再把CCP1�(shè)置為捕捉脈沖的上升沿�
�(dāng)信號(hào)的下一�(gè)上升沿來到時(shí),又�(chǎn)生CCP中斷,在中斷服務(wù)程序中捕捉此刻TMR1寄存器中�16位的值time3,則信號(hào)的周期T=(time3-time1)μS,信�(hào)頻率f=1/T,脈沖寬度P=(time2-time1)μS,占空比D=P/T×100%�
考慮到CCP捕捉方式可能�(fā)生的誤差為�1μs,為滿足誤差要求,可把上述過程多�(jìn)行幾�,將各次�(cè)試的平均值作為的�(cè)量��
� 頻率�(jì)�(shè)�(jì)原理示意�
如果需要測(cè)量的頻率�1000Hz,周期只�1000μs,且占空比的變化范圍�10%~90�,則高低電平持續(xù)的最短時(shí)間都�100μs,可以有充分的時(shí)間執(zhí)行中斷服�(wù)程序�
如果�(shí)際應(yīng)用中�(fā)�(xiàn)兩次捕捉中斷的時(shí)間間隔小�1次中斷服�(wù)�(shí)�,則可以通過適當(dāng)�(shè)置寄存器CCPICON的�,使CCP模塊�4�(gè)脈沖上升沿捕�1次或�16�(gè)脈沖上升沿捕捉一次,這樣兩次中斷的時(shí)間間隔就增大�。如果還不能�(dá)到要�,則可用分頻器對(duì)輸入頻率信號(hào)分頻處理后,再由CCP1引腳輸入�