• 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) 3 4 »


Re: 請教GPS To Uart Receive By PIC24F
#29
資深會員
資深會員


查看用戶資訊
黃兄以下是我目前寫的一個老師交代的東西
也是讀取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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教GPS To Uart Receive By PIC24F
#28
初級會員
初級會員


查看用戶資訊
今天在UART與GPS連接後,run程式
用watch看U1STA的Value為0xC544(若沒連接Value則為0xC550)
16近位轉換後為'1100 0101 0100 0100'(若沒連接則為'1100 0101 0101 0000')
發現
bit0 為'0',0 = Receive buffer is empty
bit0 為'1',1 = Receive buffer has data, at least one more character can be read
bit2 為'1',1 = Framing error has been detected for the current character (character at the top of the receive FIFO)
bit2 為'0',0 = Framing error has not been detected
bit4 為'0',0 = Receiver is active
bit4 為'1',1 = Receiver is Idle
我的包率明明有設對(4800),我還有用其他包率測試過2400、9600、19200
其他包率 用watch看U1STA的Value為0xC554(UART與GPS連接)
16近位轉換後為'1100 0101 0101 0100'
bit4 為'1',1 = Receiver is Idle
所以我的包率有設對!!
我想請問bit2 為'1'的可能性有哪些??有什麼解決方法??

發表於: 2009/9/25 19:09
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教GPS To Uart Receive By PIC24F
#27
初級會員
初級會員


查看用戶資訊
TO cct1210兄:
我有用示波器測量,只有RX腳位有訊號
訊號是+5V/-5V 上下跳
應該就是你所說的 要先使用Transceiver轉換後才能與PIC24FJ溝通吧!? 是嗎??
非常感謝你的經驗相談~~讓我又學到東西!!再次感謝妳~

發表於: 2009/9/24 23:18
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教GPS To Uart Receive By PIC24F
#26
資深會員
資深會員


查看用戶資訊
不曉得你是否有用示波器量一下GPS的TX腳位,看看有沒有輸出?
我使用過兩款GPS,第一種訊號的輸出位準為+/-5V,所以要使用Transceiver轉換後與PIC24FJ溝通,而且要先從PIC24FJ的RS232下一個起始命令後,GPS才開始每一秒傳一串資料回來;另外一款輸出位準為0/5V,直接接到PIC24FJ即可,且此型GPS會一直傳字串回來,不需要下命令,所以我就將接收的buffer開大一點,接收超過2秒的字串資料,然後再從字串中找'$'字元,來判斷起始的GPS資料,再解碼.
希望我的經驗對你有幫助.

發表於: 2009/9/24 22:15
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教GPS To Uart Receive By PIC24F
#25
初級會員
初級會員


查看用戶資訊
我將程式改成
void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void) // UART1接收資料中斷副程式
{
IFS0bits.U1RXIF = 0 ; // 清除中斷旗標

RX_DATA = ReadUART1(); // Get RS-232 data 將UART讀取資料暫存器的內容讀出
UART_RX_Flag = 1 ;
}
int main(void)
{
while(1)
{
if(UART_RX_Flag == 1) // 判斷資料傳送狀態旗標
{
RX_ARRAY[cnt]=RX_DATA;
LCD_SetCursor(0,1);
putsLCD(RX_ARRAY);
UART_RX_Flag = 0 ;
cnt=0;
}
}
}

--------------------------------------------------------------------
結果 watch中 RX_DATA 最常出現的 Value = 0x00 or 0xF8
RX_ARRAY 的 Value 還是為 "." LCD上顯示"X"

至於你說的LooKRS232 我下載了
File -> Connection -> 設定好 com1,4800,8,1,None,None -> OK
結果
Serial port 'COM1' was successfully opened with selected settings
Serial port 'COM1' is accessible for using
接著就沒東西
Serial Satatus 中 每一個都是off ....
不曉得 lancer0498 兄願不願意留個e-mail or MSN 做個交流?

發表於: 2009/9/24 20:18
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教GPS To Uart Receive By PIC24F
#24
資深會員
資深會員


查看用戶資訊
我編譯時 出現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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教GPS To Uart Receive By PIC24F
#23
初級會員
初級會員


查看用戶資訊
參照:

lancer0498 寫道:
以下是臨時寫的,沒經測試,可以參考看看
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論壇問來的,
希望我們互相交流,可以讓我們這些能力不好的小朋友成長,加油*/


感謝lancer0498兄的意見~~!!
我編譯時 出現error在 putsLCD(RX_ARRAY[]);
我改成 putsLCD(RX_ARRAY[cnt]); 編譯通過
但實行結果 LCD沒顯使任何東西
將中斷點設在putsLCD(RX_ARRAY[cnt]); 不能中斷 因此判斷RX_DATA=='*' => false

會是我本身GPS有問題嗎??

發表於: 2009/9/24 16:24
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教GPS To Uart Receive By PIC24F
#22
資深會員
資深會員


查看用戶資訊
以下是臨時寫的,沒經測試,可以參考看看
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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教GPS To Uart Receive By PIC24F
#21
初級會員
初級會員


查看用戶資訊
非常感謝lancer0498兄給的意見,你的意見讓我學到不少!!再次感謝妳!!!
$GPRMC,171216.000,A,4139.6583,N,08336.5562,W,7.87,300.93,071207,,*1C == > 這應該是代表$是斷落的開始吧!?
經過我一天的修改 還是沒辦法....
我在
int main(void)
{
LCD_Delay200usX(50) ;

PMP_Initial() ;
ADC_Initial() ;
Timer1_Initial();
OC_Initial() ;
UART1_Initial() ;
LCD_Initial() ;

LCD_SetCursor(2,0);
putrsLCD(LCDString);

while(1)
{
if(UART_RX_Flag == 1) // 判斷資料傳送狀態旗標
{
RX_BuffDisplay(RX_Buff);

UART_RX_Flag = 0 ; ==>設中斷點
}
} ==> 中斷後 指標所指位置
}
第一次中斷 watch觀看結果是 cnt = 0x007,RX_Buff 全部都是.或x,UART_RX_Flag = 0x00
在執行一次後中斷 watch觀看結果是 cnt = 0x009,RX_Buff 全部都是.或x,UART_RX_Flag = 0x00
lancer0498兄可不可以請妳再詳細說明,我有點不太懂你的意思...很抱歉,我是學通訊網路出身的,對於這個不太懂,有勞你多多指點!!
=============主要程式============
void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void) // UART1接收資料中斷副程式
{
IFS0bits.U1RXIF = 0 ; // 清除中斷旗標

RX_Buff[cnt]=ReadUART1(); // Get RS-232 data 將UART讀取資料暫存器的內容讀出
if (cnt < 17)
{
cnt++ ;
}
else
{
cnt = 0 ;
UART_RX_Flag = 1;
}
}

void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
{
IFS0bits.T1IF = 0 ;
Timer1Tick = 1 ;
}

int main(void)
{
LCD_Delay200usX(50) ;

PMP_Initial() ;
ADC_Initial() ;
Timer1_Initial();
OC_Initial() ;
UART1_Initial() ;
LCD_Initial() ;

LCD_SetCursor(2,0);
putrsLCD(LCDString);

while(1)
{
if(UART_RX_Flag == 1) // 判斷資料傳送狀態旗標
{
RX_BuffDisplay(RX_Buff);

UART_RX_Flag = 0 ;
}
}
}

void RX_BuffDisplay(unsigned char *buff)
{
LCD_SetCursor( 0,1);
LCD_Delay200usX(50) ;
putsLCD(buff) ;
LCD_Delay200usX(50) ;
}

Attach file:



jpg  (0.00 KB)

Link only for registered users

發表於: 2009/9/24 0:02
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請教GPS To Uart Receive By PIC24F
#20
資深會員
資深會員


查看用戶資訊
看了你在最上面的程式,你好像沒有把收進來的資料處理好,
因為gps送出的資料是一大堆,每送一個字你就進入中斷一次,
但是看你的RX_BUFF[CNT]都沒去變動,我之前幫學弟寫過GPS範例的時後,好像也發生過這樣的問題,記得是在資料接收做好之後才沒問題的,另外你可以經由判斷'$'的方式來作段落,記得GPS好像每格協定的結尾是'$',你可以試一下,祝你成功!

發表於: 2009/9/23 8:27
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... ]

教育訓練中心

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