天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術熱線: 4007-888-234

技術支持

PIC單片機微控制器設計竅門

更新時間: 2019-03-22

十年單片機開發方案公司深圳英銳恩分享PIC單片機微控制器設計竅門。廣泛應用的Microchip公司PIC微控制器芯片中擠出更多特性外,本文探討的諸如增加額外串口以及在8位芯片上進行32位運算等技巧,也可適用于其它微控制器。 

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

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

大多數PIC還提供一個串行外圍接口(SPI)。僅需很小開銷,普通的同步SPI就可被設計成能夠接收標準的異步傳輸。

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

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給出的是一個典型的中斷程序。

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

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

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

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

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

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

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

參數堆棧 

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

Forth語言采用參數堆棧與RPN。計算時,先從參數堆棧中彈出參數,然后再將計算結果推入參數堆棧。臨時存儲空間總是位于參數堆棧的頂部,當從堆棧中彈出一個參數后,該臨時存儲空間被自動釋放并可再被使用。

使用參數堆棧是處理復雜表達式及中間結果的一種便利方法,尤其是當編譯器不支持最佳數據大小的時候。如果沒有參數堆棧,則“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();


  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是否已處理完寫入的最后值,等等。

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等。只要了解其潛在優勢與局限,它們就能成為您工具箱中的有用選項。 

(文源網絡,侵刪)

404
返回首頁 |  返回上一頁
联系我们: 日土县| 文登市| 肇源县| 寿宁县| 瑞金市| 镇远县| 钦州市| 涡阳县| 沙坪坝区| 神木县| 乌兰察布市| 宁远县| 开封县| 恩平市| 宁明县| 和顺县| 水富县| 东宁县| 临城县| 南宁市| 华蓥市| 万年县| 马尔康县| 屯留县| 铜川市| 红河县| 阆中市| 柞水县| 宁化县| 高青县| 苏尼特右旗| 江门市| 淅川县| 梅河口市| 玉山县| 乌审旗| 开封县| 乳源| 襄城县| 开鲁县| 法库县|