具體做法是在閑置的一個(gè)I/O腳(如RB1)和OSC1管腳之間跨接一電阻(R1),如圖1所示。低速狀態(tài)置RB1=0,。需進(jìn)行快速運(yùn)算時(shí)先置RB1=1,,由于充電時(shí),電容電壓上升得快,,工作頻率增高,,運(yùn)算時(shí)間減少,運(yùn)算結(jié)束又置RB1=0,,進(jìn)入低速,、低功耗狀態(tài)。工作頻率的變化量依R1的阻值而定(注意R1不能選得太小,,以防振蕩電路不起振,,一般選取大于5kΩ)。 另外,,進(jìn)一步降低功耗可充分利用“sleep"指令,。執(zhí)行“sleep"指令,機(jī)器處于睡眠狀態(tài),,功耗為幾個(gè)微安,。程序不僅可在待命狀態(tài)使用“sleep"指令來(lái)等待事件,也可在延時(shí)程序里使用(見(jiàn)例1,、例2),。在延時(shí)程序中使用“sleep"指令降低功耗是一個(gè)方面,同時(shí),,即使是關(guān)中斷狀態(tài),,Port B端口電平的變化可喚醒“sleep",提前結(jié)束延時(shí)程序,。這一點(diǎn)在一些應(yīng)用場(chǎng)合特別有用,。同時(shí)注意在使用“sleep"時(shí)要處理好與WDT、中斷的關(guān)系,。 了解乘除法函數(shù)對(duì)寄存器的占用 由于PIC片內(nèi)RAM僅幾十個(gè)字節(jié),,空間特別寶貴,而Mplab-C編譯器對(duì)RAM地址具有不釋放性,,即一個(gè)變量使用的地址不能再分配給其它變量,。如RAM空間不能滿(mǎn)足太多變量的要求,一些變量只能由用戶(hù)強(qiáng)制分配相同的RAM空間交替使用,。而Mplab-C中的乘除法函數(shù)需借用RAM空間來(lái)存放中間結(jié)果,,所以如果乘除法函數(shù)占用的RAM與用戶(hù)變量的地址重疊時(shí),就會(huì)導(dǎo)致出現(xiàn)不可預(yù)測(cè)的結(jié)果,。如果C程序中用到乘除法運(yùn)算,,最好先通過(guò)程序機(jī)器碼的反匯編代碼(包含在生成的LST文件中)查看乘除法占用地址是否與其它變量地址有沖突,,以免程序跑飛。Mplab-C手冊(cè)并沒(méi)有給出其乘除法函數(shù)對(duì)具體RAM地址的占用情況,。例5是乘法函數(shù)對(duì)0×13,、0×14、0×19,、0×1A地址占用情況,。 例5
4 對(duì)芯片重復(fù)編程 對(duì)無(wú)硬件仿真器的用戶(hù),總是選用帶EPROM的芯片來(lái)調(diào)試程序,。每更改一次程序,,都是將原來(lái)的內(nèi)容先擦除,再編程,,其過(guò)程浪費(fèi)了相當(dāng)多的時(shí)間,,又縮短了芯片的使用壽命。如果后一次編程的結(jié)果較前一次,,僅是對(duì)應(yīng)的機(jī)器碼字節(jié)的相同位由“1"變成“0",,就可在前一次編程芯片上再次寫(xiě)入數(shù)據(jù),而不必擦除原片內(nèi)容,。 在程序的調(diào)試過(guò)程中,,經(jīng)常遇到常數(shù)的調(diào)整,如常數(shù)的改變能保證對(duì)應(yīng)位由“1"變“0",,都可在原片內(nèi)容的基礎(chǔ)繼續(xù)編程,。另外,由于指令“NOP"對(duì)應(yīng)的機(jī)器碼為“00",,調(diào)試過(guò)程中指令的刪除,,先用“NOP"指令替代,編譯后也可在原片內(nèi)容上繼續(xù)編程,。 另外,,在對(duì)帶EPROM的芯片編程時(shí),特別注意程序保密狀態(tài)位,。廠(chǎng)家對(duì)新一代帶EPROM芯片的保密狀態(tài)位已由原來(lái)的EPROM可擦型改為了熔絲型,,一旦程序代碼保密熔絲編程為“0",可重復(fù)編程的 EPROM 芯片就無(wú)法再次編程了,。使用時(shí)應(yīng)注意這點(diǎn),,以免造成不必要的浪費(fèi)(Microchip 資料并未對(duì)此做出說(shuō)明)。 編寫(xiě)PIC單片機(jī)的源程序,,除了源程序的開(kāi)始處要求嚴(yán)格的列表指令外,,還需注意源程序中字母符號(hào)大小寫(xiě)的有關(guān)規(guī)則,否則在PC機(jī)上匯編源程序時(shí)不會(huì)成功,。筆者用下列的PIC16F84單片機(jī)對(duì)B口送數(shù)的源程序(源程序各自定 |