:::

論壇索引


Board index » All Posts (lancer0498)




Re: 如何使用for迴圈寫delay時間?
資深會員
資深會員


for(cnt=0;cnt<100;cnt++) Nop();

發表於: 2009/9/28 9:36
頂部


Re: P18F4520 USART設定...請問版主
資深會員
資深會員


請教版主,以下是C18內建的USART函式
因為在應用上有個疑問,我目前使用9BIT模式,
TX9D放的是parity,會將TXSTAbits.TX9設為1,
但我使用這個內建函式時會有問題,
一進入函式內因為我的TX9=1,那我TX9D會立刻被設定為0,
還是這個函式不適用在9BIT模式,須要自己寫一個嗎?

void WriteUSART(char data)
{
if(TXSTAbits.TX9) // 9-bit mode?
{
TXSTAbits.TX9D = 0;
// Set the TX9D bit according to the
if(USART_Status.TX_NINE)
// USART Tx 9th bit in status reg
TXSTAbits.TX9D = 1;
}

TXREG = data; // Write the data byte to the USART
}

發表於: 2009/9/28 9:09
頂部


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
頂部



« 1 ... 11 12 13 (14) 15 16 17 ... 21 »



:::

Microchip連結

https://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=64
https://www.linkedin.com/company/microchiptechnologytaiwan
https://www.facebook.com/microchiptechnologytaiwan/?locale=zh_TW
https://mkpage.microchip.com/l/1082123/2025-03-12/2stnv5
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
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... ]

教育訓練中心

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