Global Sources
電子工程專輯
 
電子工程專輯 > 控制技術/MCU
 
 
控制技術/MCU  

PIC微控制器的設計技巧

上網時間: 2005年09月23日     打印版  Bookmark and Share  字型大小:  

關鍵字:PIC  可程式積體電路  microcontroller  微控制器 

除了可在廣泛應用的Microchip公司PIC微控制器晶片中擠出更多特性外,本文探討的諸如增加額外串列埠以及在8位元晶片上進行32位元運算等技巧,也可適用於其它微控制器

儘管Microchip公司不斷為其日益擴大的PIC微控制器產品線增加更多功能,但有時設計工程師只需其中一小部份功能。也許設計工程師還需要目前尚不存在的一組特性,或者繼承了一種設計但不能升級,或者可能只想進行試驗並打破以往傳統限制。本文將介紹一些挖掘各種PIC產品極限的應用方法,其中一些技巧也適用於其它微控制器,但這裡只介紹用於PIC的原始程式碼與具體示例。本文還將分析一些方法,它們是關於如何增加另一個非同步串列埠、更容易地處理精密度擴展(32位元或更高)演算法、增強平行埠以及如何使用一些非同步串列埠常被忽略的特性。

非同步串列埠

許多PIC都具有一個或兩個非同步串列埠,但如果它們不夠用,那麼位元拆裂(Bit-banging)剩餘I/O接腳是一種常用的解決方案,且適用於整個PIC系列。但這種方案是軟體密集型的,它在保持可靠通訊所需的關鍵時序的同時,將難以進行其它任何作業。另一種選擇方案是檢測起始位元的上升沿,並採用定時器中斷來讀取數據。這種方法在位元拆裂方法的基礎上有了很大改進,但仍需要大量的軟體開銷以處理每一位元的中斷,而針對任何中斷的延遲都可能導致同步問題。

圖1:作為非同步串列數據
的ASCII碼字母‘Q’(0x51)。

大多數PIC還提供一個串列週邊介面(SPI)。僅需很小開銷,普通的同步SPI就可被設計成能夠接收標準的非同步傳輸。

一個典型的非同步數據串流包括一個起始位元(總為0)、8個數據位元(最低有效位元在前)以及一個終止位元(總為1)。圖1提供了一個接收ASCII碼字母‘Q’(16進制為51)的例子,也可採用更少的數據位元或者增加一個奇偶校驗位元或額外的終止位元。

圖2:作為同步串列數據
的ASCII碼字母‘Q’(0x51)。

SPI埠也採用8位元數據,但它同步在兩個不同接腳上發送和接收位元組。數據時脈可消除對起始位元或終止位元的需要,且最高有效位元在前。圖2顯示由SPI埠發送的一些數據,SPI埠在每個時脈的下降沿接收數據,在上升沿發送數據。

開始啟動

一旦被接收,數據肯定被翻轉,但如果SPI時脈的下降沿與每一個非同步數據位元的中心同步,那麼數據也可能保持原樣。起始位元的下降沿提供最初的同步記號,其它同步記號則利用PIC的一個SPI選項。這裡有好幾種定時選項,包括使用定時器TMR2等。TMR2計數直到其值等於特殊函數暫存器PR2的值,然後TMR2觸發SPI時脈並重置為0,接著再繼續計數。如果TMR2從大於PR2的值開始計數,則第一個時間間隔將比平常的時脈週期要長,因為它首先要重置到0(如圖3所示)。

SPI埠接管產生同步記號的任務後,它將用所有的8個數據位元進行計時而無需其它開銷。但它會佔用從起始位元上升沿到TMR2與SPI埠正確初始化這段時間,因而導致中斷延遲,如果啟用優先級更高的中斷,延遲時間將更長。不過不用擔心這種中斷延遲,因為PIC還有另一個秘密武器。許多PIC都具有兩個或多個擷取/比較/PWM模組,I/O接腳可在下降沿上擷取定時器的值,在起始位元的上升沿則將TMR1值儲存在一個CCPRx特殊函數暫存器中,並產生一次中斷。中斷服務程式將具有TMR1-CCPRx-PR2值的TMR2初始化,以消除掉任何延遲。列表1提供的是一個典型的中斷程式。

圖3:TMR2在起始位元的前
端初始化為-PR2。

可選的‘if(!CCP1)’行可確認輸入接腳是否仍為低,以避免將瞬間突波讀成串列數據。由於-PR2(未標出)必須大於PR2,所以應仔細選擇TMR2的預定標器的值,並使TMR1的預定標器的值與之一樣。在上面例子中,dTim2PR2為52。最壞情況下的中斷延遲應該小於串列數據速率,例如在9,600 baud rate上,該值大約為104微秒或16MHz PIC上416條指令的執行時間。SPI中斷正好能夠隱藏數據並啟用下一個位元組的CCP1中斷,但切記在某些時刻翻轉數據位元。

儘管設計工程師通常不能控制輸入數據的到達時間,且兩個接收器必須時刻保持警惕,但設計者通常能交替使用兩個發送器。有很多方法可用來處理硬體路由,僅需少數幾個邏輯閘或電晶體以及一個輸出位元就可進行這種選擇。圖4顯示採用一個含4個NAND閘的74HC00的方法。可在‘串列埠1’上選擇高速發送,在‘串列埠2’上選擇低速發送,這兩種路徑的數據輸入都來自TX接腳。

訊框錯誤(FERR)標記

PIC非同步串列埠的狀態位元包括FERR標記。FERR表示終止位元為低而不是所要求的高,這顯示發送方的baud rate低於接收方的baud

圖4:利用一個4與非閘來
控制兩個串列埠。

rate,並且預期的終止位元的確是一個數據位元。也可用FERR來檢測RS-232的中斷條件。中斷通常包括一個低起始位元、全0數據以及一個0終止位元。如果FERR被設置且數據為0,則將有一次中斷,但一般需對輸入做較長時間的觀察,以確認它保持為低。中斷條件是一種向系統發送秘密‘蝙蝠訊號’並啟用特殊配置或測試模式的方法。有些終端能發送各種長度的中斷,或者設計工程師可將串列埠的RX輸入縮短為正電壓,其確切電平取決於硬體,但它可低到3V。如果是RS-232狀態輸出(如DTR),則其有效電平為正,且將能提供接收器所需的電壓電平。

TX9及TX9D是兩個經常被忽略的特殊函數暫存器位元,可對TX9設置進行設置,使TX9D作為第9個數據位元被發送。額外數據位元的一種傳統用法是將其作為錯誤檢查的奇偶校驗位元。如果錯誤檢查對應用很關鍵,那麼只進行簡單的奇偶校驗還不夠,因為錯誤檢查位元可能出錯。

曾經有一種採用RS-485的系統透過纜線在數百英呎的距離上進行通訊。該系統採用具有故障自恢復功能的RS-485晶片,即使纜線是開路的,它也能保證有效輸出。纜線開路在半雙工通訊時經常出現,因為數據在同一對纜線的兩個方向上傳輸,每次只有一邊能發送,而在間歇期間兩邊都在偵聽,這使纜線上沒有驅動訊號。該系統可靠工作了數年時間,直到客戶想採用其它外來的RS-485設備。

圖5:在堆疊上進行5+3運算。

這些外來設備沒有使用具有故障自恢復功能的元件,系統在PIC的TRMT狀態位元顯示所有的位元都被發送後才釋放線路。TRMT不對終止位元進行計數,因此PIC在另一端收到終止位元之前釋放線路。這並沒有選擇修改硬體,而是將PIC配置成發送9個數據位元,並使TX9D為高以發送在另一端看起來為終止位元的一個額外數據位元。這樣,這兩種系統從此都工作得很好。

如果正設計一種新系統,合適的終端將非常有用;並且如果硬體允許使用這種終端,則可在發送時使接收器有效。一旦偵聽到自己的發送,設計工程師就知道包括終止位元在內的所有數據位元都已安全地抵達另一端。

參數堆疊

儘管多年以前人們為8位元微處理器編寫了一些圖形函數,但設計工程師還需要32位元定點運算。由於記憶體有限,所以在進行複雜運算時,再使用臨時儲存空間來儲存中間值是很有吸引力的。知道何時能安全地再使用特定的臨時儲存位置將帶來更多優勢。

Forth語言採用參數堆疊與RPN。運算時,先從參數堆疊中彈出參數,然後再將運算結果推入參數堆疊。臨時儲存空間總是位於參數堆疊的頂部,當從堆疊中彈出一個參數後,該臨時儲存空間被自動釋放並可再被使用。

圖6:Over()與Add()函數。

使用參數堆疊是處理複雜表達式及中間結果的一種便利方法,尤其是當編譯器不支援最佳數據大小的時候。如果沒有參數堆疊,則add函數就可能會將兩個參數相加,然後再將結果返回至某一個地方;而有了參數堆疊,則算術函數不需要任何參數,也不用返回任何結果。Add()函數可能會先從堆疊中彈出兩個數,將它們相加後再將結果推入堆疊中。數據可以是32位元、24位元或任何所需的位元數,也不必考慮數據大小,除非需要在堆疊與其它位置之間轉移數據。以這種方式使用參數堆疊,要求重新考慮數學運算與函數,而RPN則提供一種簡單的解決方案。

代數表達式‘5+3’可用RPN編碼成‘5 3 +’,其程式碼如下:


Push(5);


Push(3);


Add();

代數表達式‘(2*3)+(4*7)’可用RPN表示為‘2 3 * 4 7 * +’,其程式碼為:


Push(2);


Push(3);


Multiply();


Push(4);


Push(7);


Multiply();

圖7:內部IBF與OBF訊號。


Add();

如同Add()函數一樣,Multiply()函數先從參數堆疊中彈出兩個參數,將它們相乘,然後再將結果推入堆疊中。

除了支援通常的算術運算,Forth語言還有幾種作業堆疊中的值的方法。Dup()函數複製推入堆疊頂端(TOS)的最後值;Over()函數複製堆疊頂端以下的第二個值;Swap()函數交換兩個堆疊頂端值;Drop()函數將值推入堆疊頂端。Pick(n)函數複製堆疊頂端以下第N個值。圖6顯示Over()函數如何將兩個值保持在堆疊上並對它們求和。

當將數字堆砌到堆疊上時,只需調用少數幾個函數即可進行複雜運算,而無需參數或返回值。

筆者用這些從Forth及RPN借用來的概念開發出一個精密度擴展數學庫。有了PIC,函數調用常常編譯為單個作業碼,可以從ftp://ftp.embedded.com/pub/2005/04rowe下載PicMath.c,該版本適用於CCS PCM編譯器,其配置最小為:

1.將StackDataSize堆疊數據大小定義為以位元組來表示的數據大小(例如32位元為4個位元組等);


2.分配堆疊儲存空間並將MathPtr初始化為堆疊的最低地址;


3.MathCarry數據位元儲存運算後的PIC進位標誌;


4.MathDouble配置位元在非零時可進行雙精密度乘、除作業。

PicMath還提供用於無堆疊運算的函數,該函數利用指針指示源及目的參數,並用運算結果覆蓋目的參數。

平行埠

以往,快速數據傳輸總是以平行來進行。現在有了每秒數百萬位元的串列數據速率,串列傳輸可能是一種更好選擇,但除各種串列埠外,很多較大的PIC還提供一個平行埠(PSP)。當在所有串列埠都用於其它事情後還需要另一個通訊通道時,PSP可能相當有用。雖有幾條用於片選及讀/寫8位元數據的控制線,但沒有標準方法來知道數據何時能讀或者PIC是否已處理完寫入的最後值等。

列表1:CCPR1中斷程式。

PIC在內部擁有輸入緩衝器滿(IBF)及輸出緩衝器滿(OBF)狀態位元。IBF表示有人對平行埠進行寫作業,而OBF則表示PIC輸出的最後值仍在等待被讀取。圖7顯示這些過程是如何進行的。

儘管可以只用現有功能、某些韌體以及非常嚴格的協議來進行通訊,但設計工程師可能還需要額外的握手線以再造內部IBF和OBF狀態位元的等效值。這通常至少需要一個額外的輸出接腳與一個額外的輸入接腳來監視訊號。可用快脈衝來指示發送方與接收方準備就緒。可直接將一個握手輸出連接至一個邊沿觸發中斷接腳。一些接腳可根據變化來產生一次中斷,但如果它是快速脈衝,則讀該埠接腳將正好顯示目前邏輯電平。

電平激勵握手存在使兩邊失去同步的危險。發送方可能會看到接收方‘READY’握手線,發送一個位元組,並在接收方響應前再檢查READY訊號。而接收方可能會看到發送方的READY握手線,讀一個位元組,並在發送方響應前再檢查READY訊號,並再一次讀同一數據。

PLD或其它外部邏輯元件可產生模擬內部IBF及OBF狀態位元的外部握手訊號。發送方的/WR訊號可設置XIBF(外部IBF),並可由接收方的輸出握手接腳來清除。發送方透過監視XIBF來確定接收方何時準備就緒。發送方的握手接腳可將XOBF(外部OBF)設置為數據已做好讀準備的訊號。接收方的/RD訊號清除XOBF。發送方不需要監視XOBF,因其內部OBF會複製該訊號並產生中斷。

處理器能提供滿足所有需要的內建硬體支援當然最好,但如果不能,且設計不得不盡快完成,則上述技巧中的一項可能就夠用。這些技巧適用於各種處理器,包括16Cxx、16Fxx及18Fxx PIC等。只要了解其潛在優勢與侷限,它們就能成為您工具箱中的有用選項。

作者:Don Rowe


Microchip特約顧問


Email: eng@canzona.com


Canzona科技公司總裁




投票數:   加入我的最愛
我來評論 - PIC微控制器的設計技巧
評論:  
*  您還能輸入[0]個字
*驗證碼:
 
論壇熱門主題 熱門下載
 •   將邁入40歲的你...存款多少了  •  深入電容觸控技術就從這個問題開始
 •  我有一個數位電源的專利...  •  磷酸鋰鐵電池一問
 •   關於設備商公司的工程師(廠商)薪資前景  •  計算諧振轉換器的同步整流MOSFET功耗損失
 •   Touch sensor & MEMS controller  •  針對智慧電表PLC通訊應用的線路驅動器
 •   下週 深圳 llC 2012 關於PCB免費工具的研討會  •  邏輯閘的應用


EE人生人氣排行
 
返回頁首