中文字幕无码不卡一区二区三区_少妇被又大又粗又爽毛片久久黑人_91精品国产在热久久无毒不卡_久久久久久亚洲综合网站

技術(shù)熱線(xiàn): 4007-888-234
設(shè)計(jì)開(kāi)發(fā)

專(zhuān)注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開(kāi)發(fā)工具

提供開(kāi)發(fā)工具、應(yīng)用測(cè)試 完善的開(kāi)發(fā)代碼案例庫(kù)分享

技術(shù)支持

從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無(wú)限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶(hù)產(chǎn)品競(jìng)爭(zhēng)力

新聞中心

提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)

PIC單片機(jī)微控制器設(shè)計(jì)竅門(mén)

更新時(shí)間: 2019-03-22
閱讀量:2366

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

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

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

大多數(shù)PIC還提供一個(gè)串行外圍接口(SPI)。僅需很小開(kāi)銷(xiāo),普通的同步SPI就可被設(shè)計(jì)成能夠接收標(biāo)準(zhǔn)的異步傳輸。

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

SPI端口也采用8位數(shù)據(jù),但它同步在兩個(gè)不同管腳上發(fā)送和接收字節(jié)。數(shù)據(jù)時(shí)鐘可消除對(duì)起始位或終止位的需要,且最高有效位在前。圖2顯示由SPI端口發(fā)送的一些數(shù)據(jù),SPI端口在每個(gè)時(shí)鐘的下降沿接收數(shù)據(jù),在上升沿發(fā)送數(shù)據(jù)。

開(kāi)始啟動(dòng) 

一旦被接收,數(shù)據(jù)肯定被翻轉(zhuǎn),但如果SPI時(shí)鐘的下降沿與每一個(gè)異步數(shù)據(jù)位的中心同步,那么數(shù)據(jù)也可能保持原樣。起始位的下降沿提供最初的同步記號(hào),其它同步記號(hào)則利用PIC的一個(gè)SPI選項(xiàng)。這里有好幾種定時(shí)選項(xiàng),包括使用定時(shí)器TMR2等。TMR2計(jì)數(shù)直到其值等于特殊函數(shù)寄存器PR2的值,然后TMR2觸發(fā)SPI時(shí)鐘并復(fù)位為0,接著再繼續(xù)計(jì)數(shù)。如果TMR2從大于PR2的值開(kāi)始計(jì)數(shù),則第一個(gè)時(shí)間間隔將比平常的時(shí)鐘周期要長(zhǎng),因?yàn)樗紫纫獜?fù)位到0(如圖3所示)。 

SPI端口接管產(chǎn)生同步記號(hào)的任務(wù)后,它將用所有的8個(gè)數(shù)據(jù)位進(jìn)行計(jì)時(shí)而無(wú)需其它開(kāi)銷(xiāo)。但它會(huì)占用從起始位上升沿到TMR2與SPI端口正確初始化這段時(shí)間,從而導(dǎo)致中斷延遲,如果啟用優(yōu)先級(jí)更高的中斷,延遲時(shí)間將更長(zhǎng)。不過(guò)不用擔(dān)心這種中斷延遲,因?yàn)镻IC還有另一個(gè)秘密武器。許多PIC都具有兩個(gè)或多個(gè)捕獲/比較/PWM模塊,I/O管腳可在下降沿上捕獲定時(shí)器的值,在起始位的上升沿則將TMR1值存儲(chǔ)在一個(gè)CCPRx特殊函數(shù)寄存器中,并產(chǎn)生一次中斷。中斷服務(wù)程序?qū)в蠺MR1-CCPRx-PR2值的TMR2初始化,以消除掉任何延遲。列表1給出的是一個(gè)典型的中斷程序。

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

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

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

TX9及TX9D是兩個(gè)經(jīng)常被忽略的特殊函數(shù)寄存器位,可對(duì)TX9設(shè)置進(jìn)行設(shè)置,使TX9D作為第9個(gè)數(shù)據(jù)位被發(fā)送。額外數(shù)據(jù)位的一種傳統(tǒng)用法是將其作為錯(cuò)誤檢查的奇偶校驗(yàn)位。如果錯(cuò)誤檢查對(duì)應(yīng)用很關(guān)鍵,那么只進(jìn)行簡(jiǎn)單的奇偶校驗(yàn)還不夠,因?yàn)殄e(cuò)誤檢查位可能出錯(cuò)。

曾經(jīng)有一種采用RS-485的系統(tǒng)通過(guò)電線(xiàn)在數(shù)百英尺的距離上進(jìn)行通信。該系統(tǒng)采用具有故障自恢復(fù)功能的RS-485芯片,即使電線(xiàn)是開(kāi)路的,它也能保證有效輸出。電線(xiàn)開(kāi)路在半雙工通信時(shí)經(jīng)常出現(xiàn),因?yàn)閿?shù)據(jù)在同一對(duì)電線(xiàn)的兩個(gè)方向上傳輸,每次只有一邊能發(fā)送,而在間歇期間兩邊都在偵聽(tīng),這使電線(xiàn)上沒(méi)有驅(qū)動(dòng)信號(hào)。該系統(tǒng)可靠工作了數(shù)年時(shí)間,直到客戶(hù)想采用其它外來(lái)的RS-485設(shè)備

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

如果正在設(shè)計(jì)一種新系統(tǒng),合適的終端將非常有用;并且如果硬件允許使用這種終端,則可在發(fā)送時(shí)使接收器有效。一旦偵聽(tīng)到自己的發(fā)送,設(shè)計(jì)工程師就知道包括終止位在內(nèi)的所有數(shù)據(jù)位都已安全地抵達(dá)另一端。

參數(shù)堆棧 

盡管多年以前人們?yōu)?位微處理器編寫(xiě)了一些圖形函數(shù),但設(shè)計(jì)工程師還需要32位定點(diǎn)運(yùn)算。由于存儲(chǔ)器有限,所以在進(jìn)行復(fù)雜計(jì)算時(shí),復(fù)用臨時(shí)存儲(chǔ)空間來(lái)存儲(chǔ)中間值是很有吸引力的。知道何時(shí)能安全地復(fù)用特定的臨時(shí)存儲(chǔ)位置將帶來(lái)更多復(fù)雜性。

Forth語(yǔ)言采用參數(shù)堆棧與RPN。計(jì)算時(shí),先從參數(shù)堆棧中彈出參數(shù),然后再將計(jì)算結(jié)果推入?yún)?shù)堆棧。臨時(shí)存儲(chǔ)空間總是位于參數(shù)堆棧的頂部,當(dāng)從堆棧中彈出一個(gè)參數(shù)后,該臨時(shí)存儲(chǔ)空間被自動(dòng)釋放并可再被使用。

使用參數(shù)堆棧是處理復(fù)雜表達(dá)式及中間結(jié)果的一種便利方法,尤其是當(dāng)編譯器不支持最佳數(shù)據(jù)大小的時(shí)候。如果沒(méi)有參數(shù)堆棧,則“add”函數(shù)就可能會(huì)將兩個(gè)參數(shù)相加,然后再將結(jié)果返回至某一個(gè)地方;而有了參數(shù)堆棧,則算術(shù)函數(shù)不需要任何參數(shù),也不用返回任何結(jié)果。Add() 函數(shù)可能會(huì)先從堆棧中彈出兩個(gè)數(shù),將它們相加后再將結(jié)果推入堆棧中。數(shù)據(jù)可以是32位、24位或任何所需的位數(shù),也不必考慮數(shù)據(jù)大小,除非需要在堆棧與其它位置之間轉(zhuǎn)移數(shù)據(jù)。以這種方式使用參數(shù)堆棧,要求重新考慮數(shù)學(xué)運(yùn)算與函數(shù),而RPN則提供一種簡(jiǎn)單的解決方案。 

 

代數(shù)表達(dá)式“5+3” 可用RPN編碼成“5 3 +”,其程序代碼如下:


  Push(5);


  Push(3);


  Add();

代數(shù)表達(dá)式“(2*3)+(4*7)” 可用RPN表示為“2 3 * 4 7 * +”,其程序代碼為:


  Push(2);


  Push(3);


  Multiply();


  Push(4);


  Push(7); 

Multiply();


  Add();

如同Add() 函數(shù)一樣,Multiply()函數(shù)先從參數(shù)堆棧中彈出兩個(gè)參數(shù),將它們相乘,然后再將結(jié)果推入堆棧中。

除了支持通常的算術(shù)運(yùn)算,F(xiàn)orth語(yǔ)言還有幾種操作堆棧中的值的方法。Dup()函數(shù)復(fù)制推入棧頂(TOS)的最后值;Over() 函數(shù)復(fù)制棧頂以下的第二個(gè)值;Swap() 函數(shù)交換兩個(gè)棧頂值;Drop() 函數(shù)將值推入棧頂。Pick(n) 函數(shù)復(fù)制棧頂以下第N個(gè)值。圖6顯示Over() 函數(shù)如何將兩個(gè)值保持在棧上并對(duì)它們求和。

當(dāng)將數(shù)字堆砌到堆棧上時(shí),只需調(diào)用少數(shù)幾個(gè)函數(shù)即可進(jìn)行復(fù)雜運(yùn)算,而無(wú)需參數(shù)或返回值。

筆者用這些從Forth及RPN借用來(lái)的概念開(kāi)發(fā)出一個(gè)精度擴(kuò)展數(shù)學(xué)庫(kù)。有了PIC,函數(shù)調(diào)用常常編譯為單個(gè)操作碼,可以從ftp://ftp.embedded.com/pub/2005/04rowe下載PicMath.c ,該版本適用于CCS PCM編譯器,其配置最小為:

1.將StackDataSize棧數(shù)據(jù)大小定義為以字節(jié)來(lái)表示的數(shù)據(jù)大小(例如32位為4個(gè)字節(jié)等);


2.分配棧存儲(chǔ)空間并將MathPtr初始化為棧的最低地址;


3.MathCarry數(shù)據(jù)位存儲(chǔ)計(jì)算后的PIC進(jìn)位標(biāo)志;


4.MathDouble配置位在非零時(shí)可進(jìn)行雙精度乘、除操作。

PicMath還提供用于無(wú)棧運(yùn)算的函數(shù),該函數(shù)利用指針指示源及目的參數(shù),并用計(jì)算結(jié)果覆蓋目的參數(shù)。

并行從端口 

以往,快速數(shù)據(jù)傳輸總是以并行來(lái)進(jìn)行?,F(xiàn)在有了每秒數(shù)百萬(wàn)位的串行數(shù)據(jù)速率,串行傳輸可能是一種更好選擇,但除各種串行端口外,很多較大的PIC還提供一個(gè)并行從端口(PSP)。當(dāng)在所有串行端口都用于其它事情后還需要另一個(gè)通信通道時(shí),PSP可能相當(dāng)有用。雖有幾條用于片選及讀/寫(xiě)8位數(shù)據(jù)的控制線(xiàn),但沒(méi)有標(biāo)準(zhǔn)方法來(lái)知道數(shù)據(jù)何時(shí)能讀或者PIC是否已處理完寫(xiě)入的最后值,等等。

PIC在內(nèi)部擁有輸入緩沖器滿(mǎn)(IBF)及輸出緩沖器滿(mǎn)(OBF)狀態(tài)位。IBF表示有人對(duì)并行端口進(jìn)行寫(xiě)操作,而OBF則表示PIC輸出的最后值仍在等待被讀取。圖7顯示這些過(guò)程是如何進(jìn)行的。 

盡管可以只用現(xiàn)有功能、某些固件以及非常嚴(yán)格的協(xié)議來(lái)進(jìn)行通信,但設(shè)計(jì)工程師可能還需要額外的握手線(xiàn)以再造內(nèi)部IBF和OBF狀態(tài)位的等效值。這通常至少需要一個(gè)額外的輸出管腳與一個(gè)額外的輸入管腳來(lái)監(jiān)視信號(hào)??捎每烀}沖來(lái)指示發(fā)送方與接收方準(zhǔn)備就緒??芍苯訉⒁粋€(gè)握手輸出連接至一個(gè)邊沿觸發(fā)中斷管腳。一些管腳可根據(jù)變化來(lái)產(chǎn)生一次中斷,但如果它是快脈沖,則讀該端口管腳將正好顯示當(dāng)前邏輯電平。

電平激勵(lì)握手存在使兩邊失去同步的危險(xiǎn)。發(fā)送方可能會(huì)看到接收方“READY”握手線(xiàn),發(fā)送一個(gè)字節(jié),并在接收方響應(yīng)前再檢查“READY”信號(hào)。而接收方可能會(huì)看到發(fā)送方的“READY”握手線(xiàn),讀一個(gè)字節(jié),并在發(fā)送方響應(yīng)前再檢查“READY”信號(hào),并再一次讀同一數(shù)據(jù)。 

PLD或其它外部邏輯器件可產(chǎn)生模仿內(nèi)部IBF及OBF狀態(tài)位的外部握手信號(hào)。發(fā)送方的/WR信號(hào)可設(shè)置XIBF(外部IBF),并可由接收方的輸出握手管腳來(lái)清除。發(fā)送方通過(guò)監(jiān)視XIBF來(lái)確定接收方何時(shí)準(zhǔn)備就緒。發(fā)送方的握手管腳可將XOBF(外部OBF)設(shè)置為數(shù)據(jù)已做好讀準(zhǔn)備的信號(hào)。接收方的/RD信號(hào)清除XOBF。發(fā)送方不需要監(jiān)視XOBF,因其內(nèi)部OBF會(huì)復(fù)制該信號(hào)并產(chǎn)生中斷。

處理器能提供滿(mǎn)足所有需要的內(nèi)置硬件支持當(dāng)然最好,但如果不能,且設(shè)計(jì)不得不盡快完成,則上述技巧中的一項(xiàng)可能就夠用。這些技巧可用于各種處理器,包括16Cxx、16Fxx及18Fxx PIC等。只要了解其潛在優(yōu)勢(shì)與局限,它們就能成為您工具箱中的有用選項(xiàng)。 

(文源網(wǎng)絡(luò),侵刪)

瓦房店市| 古交市| 稷山县| 三亚市| 东源县| 个旧市| 大悟县| 梓潼县| 宝应县| 凤冈县| 辰溪县| 五指山市| 五峰| 苍溪县| 武夷山市| 威海市| 榕江县| 腾冲县| 沂南县| 怀仁县| 齐齐哈尔市| 西盟| 龙胜| 大同县| 舟曲县| 松滋市| 泉州市| 澎湖县| 黄骅市| 石阡县| 读书| 鹤庆县| 罗城| 松原市| 江油市| 华安县| 龙门县| 德兴市| 扬州市| 西乌珠穆沁旗| 广饶县|