AVR USART發(fā)送中斷程序 使用緩沖器_第1頁
AVR USART發(fā)送中斷程序 使用緩沖器_第2頁
AVR USART發(fā)送中斷程序 使用緩沖器_第3頁
AVR USART發(fā)送中斷程序 使用緩沖器_第4頁
AVR USART發(fā)送中斷程序 使用緩沖器_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

AVRUSART(UART)發(fā)送中斷程序使用緩沖器系統(tǒng)功能使用USART發(fā)送數(shù)據(jù),需要一定時間,若是用傳統(tǒng)方法,等發(fā)送完再處理其它任務(wù)(如語句while(!(UCSRA&0x40));),那么,將大大降低了高速的AVR的執(zhí)行效率!AVR會等到“花都謝了?”那么怎樣處理才可以解決低速串口與高速AVR之間的矛盾呢?可以采用開辟發(fā)送緩沖區(qū)的做法:當(dāng)AVR需要發(fā)送數(shù)據(jù)時,如果USART口不空閑或者發(fā)送緩沖區(qū)還有待發(fā)送的數(shù)據(jù),就將數(shù)據(jù)放入發(fā)送緩沖器中(如果緩沖器未滿),AVR不必等待,可以轉(zhuǎn)去執(zhí)行其它任務(wù)。而后,等USART的硬件發(fā)送完一個數(shù)據(jù)后產(chǎn)生中斷,由中斷服務(wù)程序負(fù)責(zé)將發(fā)送緩沖器中數(shù)據(jù)依次送出。發(fā)送緩沖器數(shù)據(jù)結(jié)構(gòu)的設(shè)計:循環(huán)隊列,由讀、寫2個指針及一個隊列計數(shù)器控制,用于判斷當(dāng)前寫入數(shù)據(jù)、讀出數(shù)據(jù)在隊列中的位置,并判斷隊列是否為空,是否已滿。程序設(shè)計時需注意,為了防止處理沖突,在對數(shù)據(jù)緩沖器的讀、寫過程中,要將中斷關(guān)閉,避免錯誤產(chǎn)生,從而提高程序的可靠性。硬件設(shè)計AVR主控電路原理圖

rNTnrPDZ乏TNTL/FD0吁反&3目KPVPCS可8渺LED控制電路原理圖軟件設(shè)計//目標(biāo)系統(tǒng):基于AVR單片機//應(yīng)用軟件:ICCAVR/*01010101010101010101010101010101010101010101010101010101010101010101實驗內(nèi)容:使用USART的發(fā)送中斷功能,并使用緩沖解決高速AVR與低速串口之間的矛盾硬件連接:將PB口的LED指示燈使能開關(guān)切換到"ON”狀態(tài)。注意事項:(1) 若有加載庫程序,請將光盤根目錄下的“庫程序”下的“ICC_H”文件夾拷到D盤(2) 請詳細(xì)閱讀:光盤根目錄下的“產(chǎn)品資料開發(fā)板實驗板SMK系列SMK1632說明資料”10101010101010101010101010101010101010101010101010101010101010101010*/#include<iom16v.h>#include"D:ICC_HCmmICC.H"#defineDISP_PORTPORTB#defineDISP_DDRDDRB#defineTX_BUFFER_SIZE255#defineUDREMPTY(1<<UDRE)uint8tx_buffer[TX_BUFFER_SIZE],tx_wr_index=0,tx_rd_index=0,tx_counter=0;/* 程序名稱:UART初始化程序程序功能:初始化UART為:8位,9.6K,接收中斷注意事項:基于7.3728M晶振提示說明:晶振不要買到假的,要不然,調(diào)不出來還以為電腦有鬼!輸入:返回: */voiduart0_init(void){UCSRB=0x00;//disablewhilesettingbaudrateUCSRA=0x00;//U2X=0,不加倍數(shù)率UCSRC=0x86;//8位UBRRL=47;//setbaudratelo,波特率為9.6KUBRRH=0x00;//setbaudratehiUCSRB=0x58;//發(fā)送中斷允許,接收緩沖自動清空,接收允許}/* 程序名稱:UART發(fā)送中斷服務(wù)程序程序功能:注意事項:提示說明:輸入:返回: */#pragmainterrupt_handleruart0_tx_isr:14voiduart0_tx_isr(void){if(tx_counter)//如果緩沖區(qū)有數(shù)據(jù)則進入發(fā)送程序{tx_counter一;UDR=tx_buffer[tx_rd_index];if(++tx_rd_index==TX_BUFFER_SIZE)//如果緩沖區(qū)讀指針滿tx_rd_index=0;〃讀指針置0}}/* 程序名稱:程序功能:UART發(fā)送程序注意事項:提示說明:輸入:返回: */voiduart0_putchar(uint8c){while(tx_counter==TX_BUFFER_SIZE);//如果緩沖區(qū)滿則等待CLI();if(tx_counter||((UCSRA&UDR_EMPTY)==0))〃如果緩沖區(qū)有數(shù)據(jù)或者UDR不空閑{tx_buffer[tx_wr_index]=c;〃將數(shù)據(jù)寫入緩沖if(++tx_wr_index==TX_BUFFER_SIZE)//如果已經(jīng)寫滿tx_wr_index=0;//寫指針置0tx_counter++;}else〃如果緩沖區(qū)沒有數(shù)據(jù)且UDR空閑UDR=c;〃沒什么事就發(fā)了吧SEI();}/* 程序名稱:程序功能:注意事項:提示說明:輸入:返回: */voidmcu_init(void){CLI();uart0_init();MCUCR=0x00;GICR=0x00;TIMSK=0x00;//timerinterruptsourcesSEI();//re-enableinterrupts}/* 程序名稱:程序功能:注意事項:沒什么好說的。。。提示說明:輸入:返回:*/voidmain(){uint8sendChar=0;mcu_init();DISP_DDR=0xFF;while(1){uart0_putchar(sendChar);〃發(fā)送數(shù)據(jù),數(shù)據(jù)為變量sendChardelay50us(20);DISP_PORT=tx_counter;//顯示發(fā)送區(qū)數(shù)據(jù)量}}系統(tǒng)調(diào)試緩沖區(qū)數(shù)據(jù)量tx_counter的值取決于AVR的發(fā)送頻率及UART的波特率。假定UART的波特率一定,若是AVR的發(fā)送頻率過高,低速的UART的發(fā)送速度將跟不上,導(dǎo)致緩沖區(qū)數(shù)據(jù)量tx_counter不斷增加。用LED指示tx_counter,將可以觀察到向上加的現(xiàn)象。改變UART初始化語句:UBRRL=47;將“47”改為“40”、“60”、“80”,從而改變UART的波特率??梢钥吹讲ㄌ芈试礁?,數(shù)據(jù)量tx_counter向上加的速

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論