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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

rNTnrPDZ乏TNTL/FD0吁反&3目KPVPCS可8渺LED控制電路原理圖軟件設計//目標系統:基于AVR單片機//應用軟件:ICCAVR/*01010101010101010101010101010101010101010101010101010101010101010101實驗內容:使用USART的發(fā)送中斷功能,并使用緩沖解決高速AVR與低速串口之間的矛盾硬件連接:將PB口的LED指示燈使能開關切換到"ON”狀態(tài)。注意事項:(1) 若有加載庫程序,請將光盤根目錄下的“庫程序”下的“ICC_H”文件夾拷到D盤(2) 請詳細閱讀:光盤根目錄下的“產品資料開發(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晶振提示說明:晶振不要買到假的,要不然,調不出來還以為電腦有鬼!輸入:返回: */voiduart0_init(void){UCSRB=0x00;//disablewhilesettingbaudrateUCSRA=0x00;//U2X=0,不加倍數率UCSRC=0x86;//8位UBRRL=47;//setbaudratelo,波特率為9.6KUBRRH=0x00;//setbaudratehiUCSRB=0x58;//發(fā)送中斷允許,接收緩沖自動清空,接收允許}/* 程序名稱:UART發(fā)送中斷服務程序程序功能:注意事項:提示說明:輸入:返回: */#pragmainterrupt_handleruart0_tx_isr:14voiduart0_tx_isr(void){if(tx_counter)//如果緩沖區(qū)有數據則進入發(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ū)有數據或者UDR不空閑{tx_buffer[tx_wr_index]=c;〃將數據寫入緩沖if(++tx_wr_index==TX_BUFFER_SIZE)//如果已經寫滿tx_wr_index=0;//寫指針置0tx_counter++;}else〃如果緩沖區(qū)沒有數據且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ā)送數據,數據為變量sendChardelay50us(20);DISP_PORT=tx_counter;//顯示發(fā)送區(qū)數據量}}系統調試緩沖區(qū)數據量tx_counter的值取決于AVR的發(fā)送頻率及UART的波特率。假定UART的波特率一定,若是AVR的發(fā)送頻率過高,低速的UART的發(fā)送速度將跟不上,導致緩沖區(qū)數據量tx_counter不斷增加。用LED指示tx_counter,將可以觀察到向上加的現象。改變UART初始化語句:UBRRL=47;將“47”改為“40”、“60”、“80”,從而改變UART的波特率??梢钥吹讲ㄌ芈试礁?,數據量tx_counter向上加的速

溫馨提示

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

評論

0/150

提交評論