<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC單片機(jī)應(yīng)用設(shè)計(jì)經(jīng)驗(yàn)與技巧

          PIC單片機(jī)應(yīng)用設(shè)計(jì)經(jīng)驗(yàn)與技巧

          作者: 時(shí)間:2012-04-10 來(lái)源:網(wǎng)絡(luò) 收藏

          3 軟件開發(fā)小

          采用精簡(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ì)需要注意的問(wèn)題。

          3.1 指令的大小寫問(wèn)題

          編寫的源程序,除了源程序的開始處需要嚴(yán)格的列表指令外,還須注意源程序中字母符號(hào)的大小寫規(guī)則,否則在PC機(jī)上匯編程序時(shí)不會(huì)成功。在源程序中都會(huì)使用偽指令I(lǐng)NCLUDE。這條指令將列表中指定的單片機(jī)文件(在MPLAB中)讀入源程序作為源程序的一部分,所以凡是MPLAB中有關(guān)該單片機(jī)已有的寄存器在源程序中無(wú)需再用賦值指令(EQU)賦值,這就使所建立的源程序大為簡(jiǎn)化。

          此外,由于有了偽指令I(lǐng)NCLUDE,所以根據(jù)MPLAB軟件中的格式,在源程序中的操作數(shù)凡是涉及MPLAB已規(guī)定的寄存器名稱的,其字母一律只能大寫,不能小寫。其余操作碼、符號(hào)字母可任意大小寫,但0x中的x應(yīng)小寫。否則匯編不會(huì)成功。鑒于上述原因,為了書寫方便,在使用MPLAB軟件時(shí),的源程序均用大寫字母為宜(0x例外)。

          3.2 振蕩器的配置以及時(shí)序的計(jì)算

          PIC系列單片機(jī)可以工作于以下4種不同的振蕩器方式:LP(低功耗晶體振蕩器)、XT(晶體諧振器)、HS(高速晶體諧振器)和RC(阻容振蕩器)。用戶可以根據(jù)其系統(tǒng)設(shè)計(jì)的需要,通過(guò)對(duì)配置位(FOSC1和F0SC2)編程,選擇其中一種工作模式。

          而一旦振蕩器配置完成,那么根據(jù)用戶的配置,可以輕松地計(jì)算出程序運(yùn)行的時(shí)間以及A/D轉(zhuǎn)換所占用的時(shí)間,這樣就會(huì)很輕松地安排好單片機(jī)的時(shí)序。例如,如果采用4 MHz的HS振蕩模式,那么單片機(jī)的時(shí)鐘頻率為FOSC/4,也就是說(shuō)執(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)換來(lái)說(shuō),需要的時(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ū),是通過(guò)STATUS寄存器的RPl位和RP0位來(lái)選擇的。當(dāng)配置為00時(shí),表示選擇存儲(chǔ)區(qū)0;當(dāng)配置為01時(shí),表示選擇存儲(chǔ)區(qū)1。因?yàn)榇鎯?chǔ)區(qū)的改變只須改變RP0位,所以通常在程序編寫時(shí),只改變RP0位來(lái)選擇存儲(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是用來(lái)調(diào)用子程序的,在調(diào)用完子程序后返回到調(diào)用前的程序;而GOTO是無(wú)條件轉(zhuǎn)移,即由此狀態(tài)進(jìn)入另外一個(gè)狀態(tài)而不需要返回。

          為了使程序更加具有可讀性,使流程更加清晰、合理,通常程序都采用模塊化程序設(shè)計(jì),即將程序按照功能分成不同的子程序,而主程序則相當(dāng)簡(jiǎn)潔,只須采用CALL指令對(duì)子程序進(jìn)行調(diào)用。

          由于PIC單片機(jī)的堆棧有限,在程序中不能無(wú)止境地使用GOTO指令,否則會(huì)使堆棧溢出,程序無(wú)法正常運(yùn)行。但是在有些時(shí)候,例如當(dāng)程序出現(xiàn)分支時(shí),則不得不使用GOTO指令。對(duì)于PICl6F7x系列單片機(jī),程序出現(xiàn)分支時(shí)只能通過(guò)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。這樣無(wú)論Z為何值,程序都將跳轉(zhuǎn)到B。而對(duì)于GOT0 B,則可以不必使用GOTO指令。

          在上面這種情況下,由于GOTO只在子程序內(nèi)部進(jìn)行跳轉(zhuǎn),小程序內(nèi)部循環(huán)占用堆棧的級(jí)數(shù)不多,因此使用GOTO指令是可行的。但是在大的程序中使用GOTO指令,將有可能無(wú)法返回到調(diào)用前的下一條指令。

          因此,筆者建議,在使用匯編語(yǔ)言進(jìn)行程序設(shè)計(jì)時(shí),應(yīng)該將程序分解成一級(jí)級(jí)的子程序;然后在程序之間進(jìn)行調(diào)用,盡量將GOTO指令跳轉(zhuǎn)的范圍縮小。

          3.5 對(duì)芯片的重復(fù)燒寫

          對(duì)沒(méi)有硬件仿真器的設(shè)計(jì)者來(lái)說(shuō),總是選用帶有EPROM的芯片來(lái)調(diào)試程序,通過(guò)反復(fù)的修改來(lái)觀看運(yùn)行結(jié)果,以便對(duì)程序進(jìn)行調(diào)試。每更改一次程序.都是將原來(lái)的內(nèi)容先擦除,再編程,浪費(fèi)了相當(dāng)多的時(shí)間,又縮短了芯片的使用壽命。如果后一次編程較前一次,僅是對(duì)應(yīng)的機(jī)器碼字節(jié)的相同位由1變?yōu)?,那么就可在前一次編程芯片上再次寫入數(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ù)編程。

          結(jié)語(yǔ)

          在采用PIC單片機(jī)進(jìn)行設(shè)計(jì)過(guò)程中,注意到PIC單片機(jī)自身的特點(diǎn),可盡量少走彎路,從而縮短開發(fā)周期。同樣在軟件設(shè)計(jì)上采用合適的方法,可以使整個(gè)程序運(yùn)行穩(wěn)定,而且程序空間的使用也將有所減少,避免了調(diào)試中的Bug。以上只是筆者在實(shí)際設(shè)計(jì)過(guò)程中一些小小的體會(huì)。希望與大家一起探討,并在共同學(xué)習(xí)中為PIC單片機(jī)的普及和推廣做出貢獻(xiàn).

          電機(jī)保護(hù)器相關(guān)文章:電機(jī)保護(hù)器原理

          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();