Re: Interrupt疑問
|
||||
---|---|---|---|---|
資深會員
|
你用這樣去試試吧,斷線設在接收中斷部分...
用PC發信號看看能不能中斷有沒有被觸發 沒有的話就是 INIT沒設好 有的話,再while 加入你要的功能. 先澄清你的UART及中斷部分是否正確. 你先前沒加while(1) 能產生中斷,可能是程式結束都從頭又跑了一次,每次都跑到INIT所以能中斷 一加入while(1)就無法中斷了,有可能是中斷旗標沒清,或是那裡動到UART造成無法再中斷. 以下主程式什麼事都沒做,可以專注確認是否為INIT UART設定問題.
main(void)
發表於: 2009/7/22 10:36
|
|||
|
Re: Interrupt疑問
|
||||
---|---|---|---|---|
新會員
|
奇怪的是 當我沒加上while(1)
並沒出現nicecookie大哥所說的情況 中斷有執行 只是stage的值就只有在中斷的時候變 一跳出中斷又不見了 程式還是正常WORK 參照:
發表於: 2009/7/22 8:04
|
|||
|
Re: Interrupt疑問
|
||||
---|---|---|---|---|
新會員
|
to nicecookie
因為我在放上while()這部分有問題暫時先刪掉了 不曉得nicecookie大哥要看的是這個重點 我補上while的部分如下 main () { LCDInit(); UART2Init(); while(1) { switch (stage) { case 1: workdis(); break; case 2: empty(); break; default: DisplayStart(); break; } Delay(1); } } 我寫這樣的時候就變成中斷失去作用 不曉得原因在哪 感謝你的意見與指教
發表於: 2009/7/22 7:59
|
|||
|
Re: Interrupt疑問
|
||||
---|---|---|---|---|
資深會員
|
main() 架構很單純, 大部分就是這樣
main(void)
發表於: 2009/7/21 17:18
|
|||
|
Re: Interrupt疑問
|
||||
---|---|---|---|---|
資深會員
|
WHILE迴圈功能就像y大說的那樣
main () { LCDInit(); UART2Init(); switch (stage) { case 1: workdis(); break; case 2: empty(); break; default: DisplayStart(); break; } Delay(1); //你覺得這行執行完後, 接下來程式會跳到哪執行? 答案是沒人知道, 因為後面沒程式了, 結果可能就是錯亂或當機 } 總之, 不管你main()執行到最後有沒有工作要執行 都不能沒有程式給他跑 最最少也要有個空迴圈 像是 while(1);
發表於: 2009/7/21 17:09
|
|||
|
Re: Interrupt疑問
|
||||
---|---|---|---|---|
資深會員
|
N大的意思是說,沒加while()程式只跑一次就會出包了....
印象中沒加while() main結束程式,有時會像reset 有時會亂跑 變成無法預測的情況發生.
main()
發表於: 2009/7/21 15:40
|
|||
|
Re: Interrupt疑問
|
||||
---|---|---|---|---|
新會員
|
你好~我想請教一下
我在寫C還是算新手 但while()最主要不是只能當判斷式用嗎? 還是有其它的用法?
發表於: 2009/7/21 14:05
|
|||
|
Re: Interrupt疑問
|
||||
---|---|---|---|---|
資深會員
|
坦白說
只看了main()部分, 就知道其他連看都不用看了 因為你的while迴圈還是沒加上去阿 想問你 你知道main()裡面的while()代表的作用嗎 這可是寫C 很基本的問題
發表於: 2009/7/21 9:55
|
|||
|
Re: Interrupt疑問
|
||||
---|---|---|---|---|
新會員
|
以下是code的部份
static unsigned char stage; unsigned char temp; void Delay ( int count) { while(count!=0) { int i; for(i = 0; i < 0x9900; i++); count--; } } main () { LCDInit(); UART2Init(); switch (stage) { case 1: workdis(); break; case 2: empty(); break; default: DisplayStart(); break; } Delay(1); } DisplayStart() { LCDClear(); LCDL1Home(); // Set cursor to Line 1 of LCD char *T = " Welcome "; putrsLCD(T); } void _ISR _U1RXInterrupt() { _U1RXIF = 0; temp = UART2GetChar(); stage = 1; } workdis() { LCDClear(); LCDL1Home(); // Set cursor to Line 1 of LCD char *T = " Working "; putrsLCD(T); Delay(5); stage = 2; } empty() { char *T =" It's empty!!"; LCDClear(); LCDHome(); putrsLCD(T); } //--------------------------------Uart init void UART2Init() { // Set directions of UART IOs UART2_TX_TRIS = 0; UART2_RX_TRIS = 1; U2BRG = BAUDRATEREG2; U2MODE = 0x8000;//Enable Uart for 8-bit data //no parity, 1 STOP bit U2STA = 0; U2MODEbits.UARTEN = 1; U2STAbits.UTXEN = 1; // reset RX flag IFS1bits.U2RXIF = 0; IPC3bits.U1TXIP2 = 1; //Set Uart TX Interrupt Priority IPC3bits.U1TXIP1 = 0; IPC3bits.U1TXIP0 = 0; IPC2bits.U1RXIP2 = 1; //Set Uart RX Interrupt Priority IPC2bits.U1RXIP1 = 0; IPC2bits.U1RXIP0 = 0; U1STAbits.UTXEN = 1; //Enable Transmit IEC0bits.U1TXIE = 1; //Enable Transmit Interrupt IEC0bits.U1RXIE = 1; //Enable Receive Interrupt }
發表於: 2009/7/21 9:39
|
|||
|