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

論壇索引


Board index » All Posts (Iori)




Re: Interrupt疑問
#1
新會員
新會員


奇怪的是 當我沒加上while(1)
並沒出現nicecookie大哥所說的情況
中斷有執行 只是stage的值就只有在中斷的時候變
一跳出中斷又不見了 程式還是正常WORK


參照:

nicecookie 寫道:
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/22 8:04
頂部


Re: Interrupt疑問
#2
新會員
新會員


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疑問
#3
新會員
新會員


以下是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
頂部


Re: Interrupt疑問
#4
新會員
新會員


to yiming
stage這個變數原本我就設定為全域變數
這部分我到現在還是不曉得為什麼一到中斷完成後
值又消失了
感謝你的回應

發表於: 2009/7/20 9:35
頂部


Re: Interrupt疑問
#5
新會員
新會員


to nicecookie
原本就把UART放在while之前
答案是一樣的
我也不知道為什麼
對於只放上片段code造成誤解還真是抱歉
感謝你的回應

發表於: 2009/7/18 18:41
頂部


Re: Interrupt疑問
#6
新會員
新會員


to Ryang
底下是我參照datasheet設定UART的部份
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

}
在main()的部份是直接呼叫UART2Init();

to yiming
那個程式碼只是做一個測試
我只是想試看看中斷的時候數值會不會去變化
在斷點的時候是有stage = 1;這部份
但是一跳開中斷的時候就stage不見了
這部分我就不知道該怎麼辦了

to nicecookie
while(1)
{
switch (stage)
{
case 1:
work();
break;
case 2:
empty();
break;
default:
welcome();
break;
}
}

是這樣嗎?
我改這樣會變成沒有中斷

感謝你們的回覆與指教
另外我說明一下
我的構想是當PIC還未與UART連接時
先SHOW幾個STRING 也就是welcome()的部份
開始接收到UART才透過中段跳到work() or empty()
這樣不知道我還需要補充些什麼
感謝

發表於: 2009/7/18 10:13
頂部


Re: Interrupt疑問
#7
新會員
新會員


to Ryang
我是想在一開始先SHOW幾個String在LCD上
之後有從UART收到訊息後才跳入到WORK()或是empty()
如果都沒收到UART的DATA則是一直在welcome()
也就是default的部分
不知道在哪個環節有弄錯
感謝你的回應

發表於: 2009/7/16 18:34
頂部


Interrupt疑問
#8
新會員
新會員


各位先進你們好
我在使用中斷的時候遇到的問題
不知該如何解決
假設我的code如下

unsigned char stage;
main ()
{
switch (stage)
{
case 1:
work();
break;
case 2:
empty();
break;
default:
welcome();
break;
}
U1STAbits.UTXEN = 1; //Enable Transmit
IEC0bits.U1TXIE = 1; //Enable Transmit Interrupt
IEC0bits.U1RXIE = 1; //Enable Receive Interrupt
}


void _ISR _U1RXInterrupt()
{
_U1RXIF = 0;
int i;
for(i = 0; i < (sizeof temp) ; i++ )
{
temp[i] = UART2GetChar();
}
stege = 1;
}



我發現在Interrupt function的stage = 1
好像沒有任何作用
不曉得該如何處理才好
單步執行只看的到stage的值又消失了
感謝各位的指教

發表於: 2009/7/16 14:39
頂部


Re: Uart疑問
#9
新會員
新會員


to biko
在沒看到你的留言之前 我才想到
收到必須要有時間緩衝
最後 收到那部份
我方向搞錯了 變成先關閉PORT才收資料
這我剛剛才發現 我還真是...
最後 感謝你們給我的建議與回答^^

發表於: 2009/7/16 13:35
頂部


Re: Uart疑問
#10
新會員
新會員


to yiming
PIC_TX也確認無誤
網路上BCB寫的UART也並不多
別人測試OK的UART程式
UART的部分也跟我寫的一樣
降到9600也是一樣
PIC_RX是收到資料了
PIC_TX也傳了
但是程式上收到的卻是空白的
這我就不明白了
到底是哪個環節錯了?
感謝你的指教

發表於: 2009/7/16 10:19
頂部



(1) 2 »



:::

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... ]

教育訓練中心

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