|
Re: 如何使用for迴圈寫delay時間?
|
||||
|---|---|---|---|---|
|
資深會員
![]()
|
for(cnt=0;cnt<100;cnt++) Nop();
發表於: 2009/9/28 9:36
|
|||
|
||||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
|---|---|---|---|---|
|
資深會員
![]()
|
其實要注意的是你的信號是跑TTL信號還是RS232信號
然後根據信號看是否須MAX232作處理 可參考五南書局 黃東正寫的書 裡面有介紹GPS的部份
發表於: 2009/9/26 11:08
|
|||
|
||||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
|---|---|---|---|---|
|
資深會員
![]()
|
黃兄以下是我目前寫的一個老師交代的東西
也是讀取usart的資料,資料共有12bit,還是可以收得到 使用指標的來是來做,你可以參考看看...加油 #include <p18F4520.h> #include <usart.h> #include <delays.h> #include <timers.h> #include "evm_lcd.h" #pragma config OSC=HS,BOREN=OFF,BORV=2,LVP=OFF,PWRT=ON,WDT=OFF /* Declare the Function Prototype */ void Rx_isr(void); void TX_isr(void); void USART_Initial(void); void INT_Initial(void); void DisplayCMD(void); void Display_Terminal(const rom far char *data); void Send_CR_LF(void); #pragma romdata My_romdata=0x1000 const rom far char LCD_MSG1[]="BAT USART"; const rom far char LCD_MSG2[]="BAT"; #pragma romdata #pragma udata access My_RAM_2 near unsigned char LCD_Temp; unsigned char RX_ARRAY[12]; unsigned char RX_DATA; unsigned char cnt; unsigned int voltage; #pragma udata struct Flag { unsigned RXD:1; unsigned TXD:1; unsigned END:1; } FLAGbits; char Hex_ASCII_Code(char Data); #pragma code high_vector=0x08 void high_interrupt(void) { _asm GOTO Rx_isr _endasm } #pragma code #pragma interrupt Rx_isr void Rx_isr(void) { PIR1bits.RCIF=0; RX_DATA=ReadUSART(); FLAGbits.RXD=1; } #pragma code void main() { unsigned char *ptr; OpenLCD(); INT_Initial(); USART_Initial(); FLAGbits.RXD=0; FLAGbits.TXD=0; LCD_Set_Cursor(0,0); putrsLCD(LCD_MSG1); ptr=&RX_ARRAY[0]; while(1) { if(FLAGbits.RXD) { *ptr=RX_DATA; if(RX_ARRAY[11]==129) { LCD_Set_Cursor(1,1); LCD_Temp=Hex_ASCII_Code(RX_ARRAY[11] >> 4); // get (b7~b4) to ASCII WriteDataLCD(LCD_Temp); LCD_Temp=Hex_ASCII_Code(RX_ARRAY[11] & 0x0F); // get (b3~b0) to ASCII WriteDataLCD(LCD_Temp); ptr=&RX_ARRAY[0]; } else { ptr++; } FLAGbits.RXD=0; } } } void USART_Initial(void) { OpenUSART( USART_TX_INT_OFF // Set TXSTA Reg. =0b00100100 & USART_RX_INT_ON // Set RCSTA Reg. =0b10010000 & USART_ASYNCH_MODE & USART_NINE_BIT & USART_CONT_RX & USART_BRGH_HIGH // Set SPBRG=129, Baud Rate = 4800 ,129); //fosc/ [(SPBRG+1)*16]= 10MHz / [(129+1)*16] = 4808bps (+0.016%) RCSTAbits.SPEN=1; // Enable RX USART TXSTAbits.TXEN=1; // Enable TX USART //TRISCbits.TRISC7=1; // Set input for RXD //TRISCbits.TRISC6=0; // Set output for TXD TXSTAbits.TX9=1; PIR1bits.RCIF=0; // Clear RX INT_Flag PIR1bits.TXIF=0; // Clear TX INT_Flag IPR1bits.RCIP=1; // Set Receive of USART are High priority IPR1bits.TXIP=0; // Set Transmitter of USART are Low Priority PIE1bits.TXIE=0; // Enable TX Interrupt PIE1bits.RCIE=1; // Enable RX Interrupt } void INT_Initial(void) { RCONbits.IPEN=1; // Enable priority interrupts INTCONbits.GIEL=0; // Disable Low priority Interrupt INTCONbits.GIEH=1; // Enable high priority Interrupt } void DisplayCMD(void) { TXSTAbits.TX9D=0; WriteUSART(129); while(BusyUSART()); TXSTAbits.TX9D=0; WriteUSART(101); while(BusyUSART()); TXSTAbits.TX9D=1; WriteUSART(2); while(BusyUSART()); TXSTAbits.TX9D=0; WriteUSART(0); while(BusyUSART()); TXSTAbits.TX9D=0; WriteUSART(0); while(BusyUSART()); } void IO_Initial(void) { TRISAbits.TRISA4=0; TRISCbits.TRISC7=1; // Set input for RXD TRISCbits.TRISC6=0; // Set output for TXD } char Hex_ASCII_Code(char Data) // call by value & return value { if (Data<0x0a) return (Data+0x30); else return (Data+0x37); } //*********************************************** //* Send a ASCII string to Terminal * //*********************************************** void Display_Terminal(const rom far char *data) { Send_CR_LF(); putrsUSART(data); Delay10KTCYx(10); } void Send_CR_LF(void) { while (BusyUSART()); WriteUSART('\n'); while (BusyUSART()); WriteUSART('\r'); } void parity_bit(unsigned char parity) { unsigned char ebit,result; unsigned char sum=0,cnt; for(cnt=0;cnt<8;cnt++) { sum+=(parity & 0x01); parity=parity>>1; } result=sum%2; }
發表於: 2009/9/25 20:06
|
|||
|
||||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
|---|---|---|---|---|
|
資深會員
![]()
|
我編譯時 出現error在 putsLCD(RX_ARRAY[]);
我改成 putsLCD(RX_ARRAY[cnt]); 編譯通過 但實行結果 LCD沒顯使任何東西 將中斷點設在putsLCD(RX_ARRAY[cnt]); 不能中斷 因此判斷RX_DATA=='*' => false ------------------------------------------------------------------- 不好意思,請改為如下 putsLCD(RX_ARRAY); 你可以用watch看一下你收的時後RX_DATA有沒有東西, 如果有只要把資料正確的放入RX_ARRAY然後顯示,應該是可以才對,用watch看的時候記得斷點設在已收到RX_DATA以後, 另外我測試時都是先以PC送資料給PIC,然後顯示在LCD上, 這樣才能確定你將資料收進來後丟到LCD顯示是否寫對! 你可用LOOKRS232這個軟體來使用,上網抓一下吧
發表於: 2009/9/24 17:02
|
|||
|
||||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
|---|---|---|---|---|
|
資深會員
![]()
|
以下是臨時寫的,沒經測試,可以參考看看
void RX_isr(void) { PIR1bits.RCIF=0; RX_DATA=ReadUSART(); FLAGbits.RX=1; } void main() { unsigned char cnt=0; ... ... . . . . while(1) { if(FLAGbits.RX==1) { RX_ARRAY[cnt]=RX_DATA; if(RX_DATA=='*') //收到checksum前的*號 //checksum可不必理它,除了你一定要用到 { putsLCD(RX_ARRAY[]); FLAGbits.RX=0; cnt=0; } else { cnt++; FLAGbits.RX=0; } } } } /*我是讀電機的,也沒人教,也是從microchip論壇問來的, 希望我們互相交流,可以讓我們這些能力不好的小朋友成長,加油*/
發表於: 2009/9/24 8:45
|
|||
|
||||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
|---|---|---|---|---|
|
資深會員
![]()
|
看了你在最上面的程式,你好像沒有把收進來的資料處理好,
因為gps送出的資料是一大堆,每送一個字你就進入中斷一次, 但是看你的RX_BUFF[CNT]都沒去變動,我之前幫學弟寫過GPS範例的時後,好像也發生過這樣的問題,記得是在資料接收做好之後才沒問題的,另外你可以經由判斷'$'的方式來作段落,記得GPS好像每格協定的結尾是'$',你可以試一下,祝你成功!
發表於: 2009/9/23 8:27
|
|||
|
||||
|
Re: 請問如何解決按鍵彈跳問題?
|
||||
|---|---|---|---|---|
|
資深會員
![]()
|
感謝版主清楚的回答,照您的關念只要程式寫對,
應該是個很好的方式
發表於: 2009/9/17 15:32
|
|||
|
||||
|
Re: 請問如何解決按鍵彈跳問題?
|
||||
|---|---|---|---|---|
|
資深會員
![]()
|
感謝nicecookie大大清楚的說明,畢竟例上總是比較無法適用於實際的應用,經你這麼說就了解了!
發表於: 2009/9/17 9:46
|
|||
|
||||
|
Re: 請問如何解決按鍵彈跳問題?
|
||||
|---|---|---|---|---|
|
資深會員
![]()
|
請教版主:
在實際的應用上,可能因為主程式很複雜,且在判斷按鍵時沒有辦法做其它工作,這樣有辦法解決嗎?
發表於: 2009/9/17 8:30
|
|||
|
||||