Re: 有關usart的問題18f24j50
|
||||
---|---|---|---|---|
版主
|
參照:
1/38400bps x 10-bits = 260uS 中斷一次。 所以有足夠的時間去處理接收的資料,除非你在中斷服務程式裡混的太久導致資料被覆蓋掉了。 建議使用 MPALB SIM 直接去Stopwatch 算一下中斷花掉的時間,或利用伊之 Output 腳接示波器良一下中斷時間,進入中斷時設成Hi 輸出,離開中斷時設為Low 輸出。這樣不就知道中斷來不來得及處理資料了。
發表於: 2009/12/15 14:03
|
|||
|
Re: 有關usart的問題18f24j50
|
||||
---|---|---|---|---|
中級會員
|
樓上回錯了?
而且也寫反了吧!? RX才是in put (TRIS=1) TX是OUTPUT (TRIS=0) 哪一個DATA SHEET 這麼標新立異
發表於: 2009/12/15 12:50
|
|||
|
Re: 有關usart的問題18f24j50
|
||||
---|---|---|---|---|
新會員
|
先不接任何東西,單純用示波器接TX1腳,就沒訊號.至於TX1的TRISbit要設成"1" =>data sheet上寫的
發表於: 2009/12/15 12:32
|
|||
|
Re: 有關usart的問題18f24j50
|
||||
---|---|---|---|---|
中級會員
|
sry 我少一段中斷點
#pragma code high_vector = 0x08
這是 因應gps有各種不同的資式 我直接在中斷程式做判斷 請問有沒有較快速一點的判定方法可以使用? 我的想法是 38400bps => 1bit ->26us ; 1byte ->260us 所以我是每260us中斷一次還是26us就中斷一次? 我計算這個是因為我的RX 溢位了(OERR=1) 是不是代表我的資料過快(或是程式過大?)
發表於: 2009/12/15 12:06
Edited by Ryang on 2009年12月15日 13:57:17
|
|||
|
Re: 有關usart的問題18f24j50
|
||||
---|---|---|---|---|
版主
|
1.我如何讓他處理完資料後繼續接收字串?
ANS: 改用中斷方式接收資料。收資料不因主程式處理資料時而停止接收資料。 2.我看過前的文章有說使用看門狗會使我的程式不再死機嗎? ANS: 不一定,不可能完全避免硬體造成的當機,只能避免因軟體跑錯時的當機。這跟你的程式架構有絕對的關係,Clear WDT 用錯或放錯位置是沒有效果的。 3.8位元晶片 會因資料傳輸過快而當機嗎? ANS: 基本上到 38400bps 都還好,除非你用Polling 方式接收,那超過 9600bps 就有可能會來不及了。
發表於: 2009/12/15 10:50
|
|||
|
有關usart的問題18f24j50
|
||||
---|---|---|---|---|
中級會員
|
鮑率:38400 ; fcy=12MHz
void high_isr (void) { RX_Temp = Read1USART(); if(RX_Temp == '$') count = 0; else if(RX_Temp == '!') count = 0; else if(Data_buffer[count-2] == '*') CTRL.Flag.NEW_STR = 1; Data_buffer[count++] = RX_Temp; Write1USART(RX_Temp); PIR1bits.RC1IF = 0;} while(1) { if(CTRL.Flag.NEW_STR) { PIE1bits.RC1IE = 0; if(Data_buffer[0] == '$') { if(Data_buffer[1] == 'G') if(Data_buffer[2] == 'P') if(Data_buffer[3] == 'G') if(Data_buffer[4] == 'G') if(Data_buffer[5] == 'A') { for(n=0;n<50;n++) Data_buffer2[n] = Data_buffer[n]; CTRL.Flag.GPS = 1;}} else if(Data_buffer[0] == '!') { for(n=0;n<50;n++) Data_buffer1[n] = Data_buffer[n]; CTRL.Flag.AIS = 1; } CTRL.Flag.NEW_STR =0; } while(CTRL.Flag.GPS && CTRL.Flag.AIS) { PIE1bits.RC1IE = 0; CTRL.Flag.GPS_EN = GPS_frame(); CTRL.Flag.AIS_EN = AIS_frame(); if(CTRL.Flag.AIS & CTRL.Flag.GPS) { Distance_diff = Coordi_cmp(); count1++; if(Distance_diff <= (CTRL.Flag.Limit_EN*5)) { LIMIT1 = 1; delay_ms(10000); }} for(n=0;n<=75;n++) Data_buffer1[n] = Data_buffer2[n] = 0; CTRL.chars = 0; } PIE1bits.RC1IE = 1; } } 我貼出我目前所寫的程式 我在做2種不同格式的資料從usart輸入 但我上面的程式每做完一筆資料就不再接收資料了 請教各位先進們: 1.我如何讓他處理完資料後繼續接收字串? 2.我看過前的文章有說使用看門狗會使我的程式不再死機嗎? 3.8位元晶片 會因資料傳輸過快而當機嗎?
發表於: 2009/12/14 11:21
|
|||
|