• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users




« 1 (2)


Re: 急!關於USART的TX中斷問題
#5
資深會員
資深會員


查看用戶資訊
參照:

me84108 寫道:
"您在interrupt及主程式中都會填值到TXREG,會把況狀搞得一團亂。最好是集中在主程式或interrupt中處理。"

我是認為要在主程式執行TXREG='X';這個動作時,TX的中斷才會執行,要不然該如何觸發TX的中斷????

到底該如何使用USART 的TX中斷?
有人可以指導一下嗎???

使用TX的確有這種雞生蛋、蛋生雞的問題。所以要先有第一隻雞(或第一顆蛋)。

使用TX中斷可以這樣做:

1、在while (1)之前,先做一次如:TXREG = 第一筆資料。
2、產生中斷後,在中斷服務程序中使用usart_putch。
3、在while迴圈中不要寫值到TXREG,當然也不要叫用usart_putch。

發表於: 2008/7/16 15:29
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#4
資深會員
資深會員


查看用戶資訊
TX中斷是TXIF=1時發生--->TXREG為空,所以沒有要傳資料時候不要開啟TX中斷。使用TX中斷的方式類似這樣的方法。
char str[]="This is a test!"

void putsUART(*str)
{
         
TXREG str[0];
         
PIE1bits.TXIE 1;  //Enable TX interrupt
}

所以當str[0]發送完時,TXIF = 1,進入TX中斷,這時您只要繼續處理str[1]...直到str[x]=0時,把PIE1bits.TXIE = 0;完成整個發送程序。

通常這裡我很懶,所以直接維護一個環形佇列,把要送的資料ADD到佇列後啟動中斷。只要佇列不要爆,後面的資料就是一直加到尾巴。TX中斷就會一直運作到佇列為空時停止。而且用陣列實作佇列滿簡單的。

char putsUART(*str)
{
         
//檢查佇列剩餘空間,基本上不動TXREG,都放在中斷裡作
         //...把資料加入佇列之中,如果佇列滿或空間不足
         //,return -1
         
if(PIE1bits.TXIE 0){PIE1bits.TXIE 1};
         return 
0;
}


參考看看囉...
您的程式碼我沒細看,雖然你講是用佇列來作,但是你的佇列維護得很奇怪。看不出來他的作用在哪。另外資料傳完要把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
不要問我哪裡來,我只是個流浪天涯的工程師
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#3
高級會員
高級會員


查看用戶資訊
"您在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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#2
資深會員
資深會員


查看用戶資訊
是不是要先用以下程式將TX腳設為OUTPUT模式,

TRISCbits.TRISC6=0;

另外,

在主程式中,使用usart_putch,沒有先檢查TXIF,就填值到TXREG,很有可能使TXREG 爆掉。

建議:

您在interrupt及主程式中都會填值到TXREG,會把況狀搞得一團亂。最好是集中在主程式或interrupt中處理。

發表於: 2008/7/16 10:33
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


急!關於USART的TX中斷問題
#1
高級會員
高級會員


查看用戶資訊
我的問題是,為何以下的程式碼,當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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------