Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
資深會員
|
TX中斷是TXIF=1時發生--->TXREG為空,所以沒有要傳資料時候不要開啟TX中斷。使用TX中斷的方式類似這樣的方法。
char str[]="This is a test!"
所以當str[0]發送完時,TXIF = 1,進入TX中斷,這時您只要繼續處理str[1]...直到str[x]=0時,把PIE1bits.TXIE = 0;完成整個發送程序。 通常這裡我很懶,所以直接維護一個環形佇列,把要送的資料ADD到佇列後啟動中斷。只要佇列不要爆,後面的資料就是一直加到尾巴。TX中斷就會一直運作到佇列為空時停止。而且用陣列實作佇列滿簡單的。
char putsUART(*str)
參考看看囉... 您的程式碼我沒細看,雖然你講是用佇列來作,但是你的佇列維護得很奇怪。看不出來他的作用在哪。另外資料傳完要把TX中斷關掉你也沒作的樣子...
發表於: 2008/7/16 13:35
Edited by master on 2008年07月16日 13:51:10
Edited by master on 2008年07月16日 13:53:01 |
|||
不要問我哪裡來,我只是個流浪天涯的工程師
|
||||
|
Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
高級會員
|
"您在interrupt及主程式中都會填值到TXREG,會把況狀搞得一團亂。最好是集中在主程式或interrupt中處理。"
我是認為要在主程式執行TXREG='X';這個動作時,TX的中斷才會執行,要不然該如何觸發TX的中斷???? 到底該如何使用USART 的TX中斷? 有人可以指導一下嗎??? 為何我在main()設定了TXIE=1後, 接下來的while()內容都沒跑, 沒跑範例如下: #include<p18f4620.h> void main() { TXIE=1; GIEL=1; GIEH=1; while(1) { LED1=!LED1; // 根本不會跑 } } 不止我有這問題,美國的論壇也有人遇到此問題!! http://forum.microchip.com/tm.aspx?m=349734 有人建議要看第九章的圖9-1 Interrupt Logic,我看了, 根本沒有任何想法,似乎沒幫到我!!
發表於: 2008/7/16 11:44
Edited by me84108 on 2008年07月16日 12:09:14
Edited by me84108 on 2008年07月16日 12:11:22 |
|||
|
Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
資深會員
|
是不是要先用以下程式將TX腳設為OUTPUT模式,
TRISCbits.TRISC6=0; 另外, 在主程式中,使用usart_putch,沒有先檢查TXIF,就填值到TXREG,很有可能使TXREG 爆掉。 建議: 您在interrupt及主程式中都會填值到TXREG,會把況狀搞得一團亂。最好是集中在主程式或interrupt中處理。
發表於: 2008/7/16 10:33
|
|||
|
急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
高級會員
|
我的問題是,為何以下的程式碼,當TXIE=1時,整個程式都不會跑??我的目的是要寫一個USART的Bipass程式(用Queue的方式),所以需要在TX中斷內執行TXREG, 但怪的是程式的LED1卻不會執行。
MCHP Ver.: IDE 8.1, C18 v3.2 程式碼簡寫如下: #include "p18f4620.h" ..... (變數宣告,省略) ..... void main() { PORTCbits.TX=0; // RC6 PORTCbits.RX=1; // RC7 LED1=0; LED2=0; SPBRG=SPBRG_VALUE; // Set Baudrate SPBRGH=SPBRGH_VALUE; // Set Baudrate TXSTAbits.BRGH=BRGH_VALUE; // HIGH SPEED BAUDCONbits.BRG16=BRG16_VALUE;// 16-bit Baud Rate Register Enable bit (1=16 bit,0=8bit) TXSTAbits.SYNC=0; // ASYNCHRONOUS TXSTAbits.TX9=0; // 0=SELECT 8-BIT RCSTAbits.SPEN=1; // ENABLE SERIAL PORT RCSTAbits.CREN=1; // 1=ENABLE CONTINUOUS RECRIVE RCSTAbits.RX9=0; // 0=SELECT 8-BIT RECEPTION PIE1bits.RCIE=1; // 1=ENABLE Rx Interrupt TXSTAbits.TXEN=0; // 0=Reset Transmitter TXSTAbits.TXEN=1; // 1=ENABLE Transmitter PIR1bits.TXIF=0; // Tx Interrupt Flag PIE1bits.TXIE=0; (問題在這?? TXIE=1,連Main()都不跑,但我需要執行TX中斷,應該要設定,不是嗎?) PEIE=1; //Peripheral Interrupt Enable bit GIE=1; //Global Interrupt Enable bit while(1) // main while { usart_putch(data[資料串列]); } } // End of Main() // High Interrupt ------------ #pragma code high_vector=0x08 void interrupt_at_high_vector(void) { _asm GOTO high_isr _endasm } #pragma code #pragma interrupt high_isr void high_isr(void) { // ------------------------------------------ // USART Tx Interrupt if (PIR1bits.TXIF) { PIR1bits.TXIF=0; // USART Transmit interrupt flag bit, 1=TXREG empty if(Tx buffer內有值) TXREG=丟值; //TXIE=0; 值會丟出 else 無值旗標=ON; LED1 =!LED1; // (某情況下不會亮,見下文) } // ------------------------------------------ if (PIR1bits.RCIF) // USART Rx Interrupt { PIR1bits.RCIF=0; Rx Buffer[串列]=RCREG; LED2 = !LED2; //Rx Light (會亮) } // ------------------------------------------ } //interrupt routine // usart_putch ------------------------- void usart_putch(unsigned char c) { if(Tx buffer無值) TXREG=c; // 有資源可送 else // 無資源,將資料送至Tx buffer { RingBufferTx[RingBufferTxPtrB++]=c; } } 怪的是.... 如果我在while()的上一行加上 PIE1bits.TXIE=1; 則LED1不會亮, 但TXREG會跑!!(如果我將usart_putch()內的TXREG註解不執行) 不過我發現,那是因為RC的中斷導致進入中斷副函式時,順便檢查到TXIF=1的狀態而執行,但LED1卻不會亮(值有送出).... WHY??
發表於: 2008/7/16 0:14
|
|||
|