PIC單片機的應用設計技巧
美國微芯公司(Microch{p Technology Inc.)開(kāi)發(fā)的CM0S工藝PIC系列8位單片機(RISC微控制器),特別是采用內置第二代Flash存儲器(40年存儲壽命)的微控制器在快速應用方面具有獨到之處。由于其易用性和高可靠性,該系列微控制器穩居8位單片機全球出貨量之首。PIC系列單片機具有指令集簡(jiǎn)潔、簡(jiǎn)單易學(xué)、速度高、功能強、功耗低、價(jià)格低廉、體積小巧、適用性好及抗干擾能力強等特點(diǎn),大量應用于汽車(chē)電氣控制、電機控制、工業(yè)控制儀表和儀表、通信、家電、玩具、低功耗的測控應用等領(lǐng)域,在國內越來(lái)越受到廣大設計者的歡迎,微芯公司的單片機已經(jīng)成為目前單片機世界的主流產(chǎn)品。
PIC 8位單片機內已經(jīng)包含運算器、存儲器、A/D、PWM、輸入和輸出I/O(灌電流可達25mA)、通信等常用接口,自由靈活的定義功能可以適應不同的控制要求。而不必增加額外的IC芯片。這樣電路結構很簡(jiǎn)單,開(kāi)發(fā)周期將大為縮短。
PICl6系列單片機屬于PIC8位單片機的中級型產(chǎn)品,采用14位的RISC指令系統。筆者使用PICl6F716單片機設計了一個(gè)電動(dòng)機保護器,在設計過(guò)程中遇到很多問(wèn)題,通過(guò)多方查找資料以及向Microchip公司技術(shù)人員尋求支持,問(wèn)題一一得到解決?,F將部分問(wèn)題記錄如下,與大家一起探討。
1 ICD2作為程序燒寫(xiě)的使用
1.1 ICD2簡(jiǎn)介
MPLAB ICD2在線(xiàn)調試器是一款低價(jià)位的PIC開(kāi)發(fā)工具。它利用Flash工藝芯片的程序區自讀寫(xiě)功能來(lái)實(shí)現仿真器調試功能;使用的軟件平臺是Microchip的MPLAB IDE(集成開(kāi)發(fā)環(huán)境軟件包),兼容Windows NT、Windows 2000和Windlows XP等操作系統。其通信接口方式可以是USB(最高可達2Mb/s)或RS-232串行接口方式;工作電壓范圍為2.O~5.5V,可支持最低2.0V的低壓調試。
MPLABICD2可以支持大部分Flash工藝的芯片。它不僅可以用作調試器,同時(shí)還可以作為開(kāi)發(fā)型的燒寫(xiě)器使用。
1.2 ICD2作為燒寫(xiě)器時(shí)的配置
燒寫(xiě)芯片的方式有兩種:普通燒寫(xiě)和在線(xiàn)燒寫(xiě)。在線(xiàn)燒寫(xiě)是適合大批量生產(chǎn)方式的燒寫(xiě)辦法。使用在線(xiàn)燒寫(xiě)時(shí)通常用戶(hù)都已經(jīng)把芯片焊到了板上,此時(shí)就要求用戶(hù)板上有預留的燒寫(xiě)接口。用戶(hù)板上的接口是通過(guò)一條6芯的扁平電纜與ICD2主機上同樣的接口一一對應連接的。圖1顯示了MPLAB ICD2與目標板上模塊連接插座的互連狀況。
ICD連接插座有6個(gè)引腳,但只使用了其中的5個(gè)引腳,分別是VDD(電源)、VSS(地)、VPP(編程電壓)、PGC(同步時(shí)鐘)和PGD(數據)。
1.3 ICD2作為燒寫(xiě)器時(shí)容易出現的問(wèn)題及解決方法
盡管MPLAG ICD2與目標板的互連非常簡(jiǎn)單,但是一不小心就會(huì )出現問(wèn)題,基本上每一個(gè)PIC的入門(mén)者都會(huì )碰到類(lèi)似的問(wèn)題。下面就一些常見(jiàn)問(wèn)題作簡(jiǎn)要敘述。
如圖l所示,在VPP與VDD之間通常要串接一個(gè)上拉電阻(通常約為lOkΩ),這樣VPP線(xiàn)可置為低電平來(lái)手動(dòng)復位PICmicro單片機。但是對一般設計者來(lái)說(shuō),都是采用上電自動(dòng)復位。如果在這里采用集成器件DMP809,那么就會(huì )導致連接不上,程序沒(méi)有辦法燒入。
對于PGC、PGD兩根線(xiàn),由于在ICD2內部已經(jīng)進(jìn)行了上拉,所以在外圍設計中,不要冉進(jìn)行上拉,否則會(huì )造成分壓。對于PGC、PGD和VPP三根線(xiàn),不要對地接電容.因為電容會(huì )阻礙在數據和時(shí)鐘線(xiàn)上電平的快速轉換,從而影響ICD2與目標板的連接。同樣對于PGC、PGD,由于數據或時(shí)鐘都是雙向傳輸的,這時(shí)如果在中間串一個(gè)二極管,則會(huì )影響ICD2與單片機的雙向通信。
但是,對PGC和PGD來(lái)說(shuō),在單片機上同時(shí)復用為普通I/O口,而有些使用上必須要接對地電容或者是串接二極管。對于這種情況,唯一的處理方式就是在燒寫(xiě)時(shí)從芯片的PGC和PGD端口直接跳線(xiàn)到程序燒寫(xiě)口。
2 A/D轉換通道切換問(wèn)題
筆者所設計的電動(dòng)機保護器需要進(jìn)行很多A/D轉換,比如三相電流轉換、零序電流轉換以及各種定位器等。但是筆者所采用的PIC16F716單片機只有5路A/D轉換通道,因此附加了一個(gè)多位選擇開(kāi)關(guān)對一個(gè)A/D通道進(jìn)行復用。而在調試中發(fā)現這樣一個(gè)問(wèn)題,就是A/D轉換值不準確,甚至有點(diǎn)亂,但從程序流程以及代碼角度均查不出任何問(wèn)題。后查明PICl6F716單片機進(jìn)行A/D轉換通道切換時(shí),需要一定的延時(shí),延時(shí)時(shí)間是毫秒級。解決辦法是:在通道問(wèn)切換時(shí),當第一個(gè)通道轉換完成后,先轉到另一個(gè)通道;然后延時(shí)1ms左右,再進(jìn)行A/D轉換。而對同一個(gè)通道信號切換時(shí),要在第一個(gè)信號轉換完成后,禁止信號輸入,延時(shí)1ms左右;然后輸人信號,再進(jìn)行A/D轉換。
這種做法比較麻煩,也很占用時(shí)間,并且從調試結果來(lái)看,問(wèn)題并沒(méi)有解決。在反復進(jìn)行調試中,最后得到的優(yōu)化解決辦法是:對于通道間轉換以及同一通道信號轉換,要對每一個(gè)信號至少進(jìn)行兩次A/D轉換;第一次的轉換結果,舍棄不予處理,只取第二次A/D轉換的結果。從調試結果來(lái)看,很好地解決了這一問(wèn)題。
3 軟件開(kāi)發(fā)小技巧
PIC單片機采用精簡(jiǎn)指令集,例如對于PICl6F716單片機,只有35條單字節指令。要用這么少的指令實(shí)現復雜的控制或計算,顯然要在軟件設計上多下功夫,并且PIC的指令系統與51系列單片機有很大不同,這讓PIC初學(xué)者很不適應。下面筆者就自己的體會(huì ),談一些軟件設計需要注意的問(wèn)題。
3.1 指令的大小寫(xiě)問(wèn)題
編寫(xiě)PIC單片機的源程序,除了源程序的開(kāi)始處需要嚴格的列表指令外,還須注意源程序中字母符號的大小寫(xiě)規則,否則在PC機上匯編程序時(shí)不會(huì )成功。在源程序中都會(huì )使用偽指令I(lǐng)NCLUDE。這條指令將列表中指定的單片機文件(在MPLAB中)讀入源程序作為源程序的一部分,所以凡是MPLAB中有關(guān)該單片機已有的寄存器在源程序中無(wú)需再用賦值指令(EQU)賦值,這就使所建立的源程序大為簡(jiǎn)化。
此外,由于有了偽指令I(lǐng)NCLUDE,所以根據MPLAB軟件中的格式,在源程序中的操作數凡是涉及MPLAB已規定的寄存器名稱(chēng)的,其字母一律只能大寫(xiě),不能小寫(xiě)。其余操作碼、符號字母可任意大小寫(xiě),但0x中的x應小寫(xiě)。否則匯編不會(huì )成功。鑒于上述原因,為了書(shū)寫(xiě)方便,在使用MPLAB軟件時(shí),PIC單片機的源程序均用大寫(xiě)字母為宜(0x例外)。
3.2 振蕩器的配置以及時(shí)序的計算
PIC系列單片機可以工作于以下4種不同的振蕩器方式:LP(低功耗晶體振蕩器)、XT(晶體諧振器)、HS(高速晶體諧振器)和RC(阻容振蕩器)。用戶(hù)可以根據其系統設計的需要,通過(guò)對配置位(FOSC1和F0SC2)編程,選擇其中一種工作模式。
而一旦振蕩器配置完成,那么根據用戶(hù)的配置,可以輕松地計算出程序運行的時(shí)間以及A/D轉換所占用的時(shí)間,這樣就會(huì )很輕松地安排好單片機的時(shí)序。例如,如果采用4 MHz的HS振蕩模式,那么單片機的時(shí)鐘頻率為FOSC/4,也就是說(shuō)執行一條指令需要1μs;對于需要兩個(gè)指令周期的指令,需要2μs。而對于A(yíng)/D轉換,如果A/D轉換時(shí)鐘位選擇為FOSC/8,那么A/D轉換模塊轉換一個(gè)位的時(shí)間Tad就為2μs。對一個(gè)8位的轉換來(lái)說(shuō),需要的時(shí)間為9.5Tad,也就是完成一次A/D轉換的時(shí)間為19μs。這樣只需要查看源程序的行數并作簡(jiǎn)要分析,就可以計算出程序運行的時(shí)間。
3.3 存儲體的選擇
PIC單片機的數據存儲器通常分為兩個(gè)存儲體,即存儲體O(Bank0)和存儲體1(Bankl)。每個(gè)存儲體都是由專(zhuān)用寄存器和通用寄存器兩部分組成的。兩個(gè)存儲體中的一氈寄存器單元實(shí)際上是同一個(gè)寄存器單元,卻又具有不同的地址。
不同型號的PIC單片機,其數據存儲器的組成(即功能)是不完全相同的,所以設計人員一旦選用了某個(gè)PIC單片機的型號后,就要查找該單片機的數據存儲器資料,以便編程使用。
筆者所采用的PICl6F716單片機的存儲區,是通過(guò)STATUS寄存器的RPl位和RP0位來(lái)選擇的。當配置為00時(shí),表示選擇存儲區0;當配置為01時(shí),表示選擇存儲區1。因為存儲區的改變只須改變RP0位,所以通常在程序編寫(xiě)時(shí),只改變RP0位來(lái)選擇存儲區。但是這樣容易造成程序的混亂,因此,筆者建議在每次更換存儲區時(shí),要分別對RPO和RPl進(jìn)行置位。在程序初始化時(shí),最好將寄存器的初始化分為兩部分:第一部分為存儲區O;第二部分為存儲區1。然后將每個(gè)需要初始化的寄存器分別在對應的存儲區進(jìn)行初始化即可。
3.4 GOTO和CALL指令的不同使用
在PIC的匯編程序中,CALL與GOT0指令使用的場(chǎng)臺不同。CALL是用來(lái)調用子程序的,在調用完子程序后返回到調用前的程序;而GOTO是無(wú)條件轉移,即由此狀態(tài)進(jìn)入另外一個(gè)狀態(tài)而不需要返回。
為了使程序更加具有可讀性,使流程更加清晰、合理,通常程序都采用模塊化程序設計,即將程序按照功能分成不同的子程序,而主程序則相當簡(jiǎn)潔,只須采用CALL指令對子程序進(jìn)行調用。
由于PIC單片機的堆棧有限,在程序中不能無(wú)止境地使用GOTO指令,否則會(huì )使堆棧溢出,程序無(wú)法正常運行。但是在有些時(shí)候,例如當程序出現分支時(shí),則不得不使用GOTO指令。對于PICl6F7x系列單片機,程序出現分支時(shí)只能通過(guò)STATUS寄存器的Z位或C位進(jìn)行判斷。這時(shí)在兩種情況的前一種情況下,必須使用GOTO指令進(jìn)行轉移;否則在執行完第一種情況后,緊接著(zhù)又執行第二種情況。程序如下:
BTFSS STATUS,Z
GOTO A
GOTO B
在跳轉到A時(shí),必須使用GOTO指令;否則執行完這條語(yǔ)句以后,緊接著(zhù)執行GOTO B。這樣無(wú)論Z為何值,程序都將跳轉到B。而對于GOT0 B,則可以不必使用GOTO指令。
在上面這種情況下,由于GOTO只在子程序內部進(jìn)行跳轉,小程序內部循環(huán)占用堆棧的級數不多,因此使用GOTO指令是可行的。但是在大的程序中使用GOTO指令,將有可能無(wú)法返回到調用前的下一條指令。
因此,筆者建議,在使用匯編語(yǔ)言進(jìn)行程序設計時(shí),應該將程序分解成一級級的子程序;然后在程序之間進(jìn)行調用,盡量將GOTO指令跳轉的范圍縮小。
3.5 對芯片的重復燒寫(xiě)
對沒(méi)有硬件仿真器的設計者來(lái)說(shuō),總是選用帶有EPROM的芯片來(lái)調試程序,通過(guò)反復的修改來(lái)觀(guān)看運行結果,以便對程序進(jìn)行調試。每更改一次程序.都是將原來(lái)的內容先擦除,再編程,浪費了相當多的時(shí)間,又縮短了芯片的使用壽命。如果后一次編程較前一次,僅是對應的機器碼字節的相同位由1變?yōu)?,那么就可在前一次編程芯片上再次寫(xiě)入數據,而不必擦除原片內容。
在程序調試過(guò)程中,經(jīng)常遇到常數的調整。如果常數的改變能保證對應位由1變0,則都可在原片內容的基礎上繼續編程。另外,由于指令NOP對應的機器碼為00,調試過(guò)程中指令的刪除,可先用NOP指令替代,編譯后也可在原片內容上繼續編程。
結語(yǔ)
在采用PIC單片機進(jìn)行設計過(guò)程中,注意到PIC單片機自身的特點(diǎn),可盡量少走彎路,從而縮短開(kāi)發(fā)周期。同樣在軟件設計上采用合適的方法,可以使整個(gè)程序運行穩定,而且程序空間的使用也將有所減少,避免了調試中的Bug。以上只是筆者在實(shí)際設計過(guò)程中一些小小的體會(huì )。希望與大家一起探討,并在共同學(xué)習中為PIC單片機的普及和推廣做出貢獻。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
單片機相關(guān)文章:單片機教程
單片機相關(guān)文章:單片機視頻教程
單片機相關(guān)文章:單片機工作原理
存儲器相關(guān)文章:存儲器原理
電機保護器相關(guān)文章:電機保護器原理
評論