:::

論壇索引


Board index » All Posts (lancer0498)




Re: 嵌入式設計論壇,省100元的報名期限快到了!
資深會員
資深會員


這樣子就是不去不行了, 我先報名了!

發表於: 2009/10/8 11:52
不怕苦...苦半輩子;怕苦...苦一輩子
頂部


Re: 求救P18F4520 usart通訊
資深會員
資深會員


嗯,感謝nicecookie大大的回覆,
我有試著將TXRX短路來試,送什麼就收什麼,
代表是正常的,所以應該是對的,如果有問題的話再請教各位,
謝謝!

發表於: 2009/10/8 8:58
不怕苦...苦半輩子;怕苦...苦一輩子
頂部


Re: 求救P18F4520 usart通訊
資深會員
資深會員


請教nicecookie大大及其他前輩:

目前用30F4011寫,改了又改寫了又寫,還是不行,
我用LOOKRS232送12BYTE資料,只收到9BYTE,
我將結果上傳,煩請您幫我看一下
不了解為什麼明明送了12byte,卻只能收到9byte,
而且只有第一個byte的資料是對的,是我抓的時間太慢,
導致loss資料嗎?有方法可以查出若RCREG都滿了的狀態嗎?

#define __dsPIC30F4011__
#include <p30F4011.h>
#include <timer.h>
#include <uart.h>
#include "C30EVM_LCD.h"

#define  FCY 7372800*2
#define  SW5   PORTEbits.RE8
#define  SW6   PORTBbits.RB3
#define  LED1  LATEbits.LATE0
#define  LED1C TRISEbits.TRISE0
#define  SW5C  TRISEbits.TRISE8
#define  SW6C  TRISBbits.TRISB3

#define  INPUT   1
#define  OUTPUT  0

_FOSC(CSW_FSCM_OFF XT_PLL8);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF MCLR_EN);
_FGS(CODE_PROT_OFF);

const 
char string[]="BAT_USART";
const 
char diplaycmd[5]={129,101,2,0,0};

void Init_UART(void);
void sitoa(unsigned char,unsigned char *TXdata);
void Init_UART(void);
void Init_IO(void);
void Scankey(void);
void SendCMD(void);
void DispVolt(void);
void Init_T1(void);
void parity_bit(unsigned char);
void CLR_RXDATA(void);

unsigned char RX_DATA;
unsigned char *RXptr;
unsigned char keydelay=30;
unsigned char RX_ARRAY[12];
unsigned char RXcnt=0;
unsigned int  voltage;
unsigned char SW5_Debance=0;
unsigned char DIG1,DIG2,DIG3;

struct Flag
{
   
unsigned RXEND:1;
   
unsigned Key_Flag:1;
   
unsigned kin:1;
}
FLAGbits;

void _ISR _U1RXInterrupt(void)
{
   *
RXptr=ReadUART1();
   
RXptr++;
   
RXcnt++;
   if(
RXcnt==12)
      {
      
FLAGbits.RXEND=1;
      
RXcnt=0;
      
RXptr=&RX_ARRAY[0];
      }
   
IFS0bits.U1RXIF=0;
}

void _ISR _T1Interrupt(void)
{
   if (
SW5_Debance!=0)
   {    
      if (!
SW5
         
SW5_Debance=10;
      else    
         
SW5_Debance--;
   }    
   else 
   {
      if (!
SW5)
      { 
         
FLAGbits.Key_Flag =;
         
SW5_Debance=10;
      }
   }
   
IFS0bits.T1IF=0;
}

int main(void)
{
   
Init_IO();
   
Init_T1();
   
Init_UART();
   
OpenLCD();
   
setcurLCD(0,0);
   
putrsLCD(string);
   
//CLR_RXDATA();
   
RXptr=&RX_ARRAY[0];

   
FLAGbits.RXEND=0;
   
FLAGbits.kin=0;
   
IFS0bits.U1RXIF=0;
   
IFS0bits.T1IF=0;

   while(
1)
   {
      
Scankey();
      if(
FLAGbits.RXEND==1)
      {
         if(
RX_ARRAY[11]-129==0)
         {
            
voltage=(RX_ARRAY[2]<<8+RX_ARRAY[3]);
            
CLR_RXDATA();
         }
         
FLAGbits.RXEND=0;
      }
   }              
}

void Init_T1(void)
{
   
ConfigIntTimer1(T1_INT_PRIOR_6   &
                   
T1_INT_ON
                  
);
   
   
OpenTimer1(T1_ON            
              
T1_IDLE_STOP     &
              
T1_GATE_OFF      &
              
T1_PS_1_1        &
              
T1_SYNC_EXT_OFF  &
              
T1_SOURCE_INT    ,
              
FCY/1000         //Timer1 period 1ms
             
);
}

void Init_UART(void)
{
   
unsigned int baudvalue;
   
unsigned int U1MODEvalue;
   
unsigned int U1STAvalue;
   
CloseUART1();
   
ConfigIntUART1(
                 
UART_RX_INT_EN  
                 
UART_RX_INT_PR7 
                 
UART_TX_INT_DIS 
                 
UART_TX_INT_PR7
                 
);
   
baudvalue=191;    //UXBRG=((7372800*2/4800)/16)-1=191
   
U1MODEvalue=UART_EN             
               
UART_IDLE_CON       &
               
UART_DIS_WAKE       
               
UART_DIS_LOOPBACK   &
               
UART_DIS_ABAUD      
               
UART_EVEN_PAR_8BIT  &
               
UART_1STOPBIT;
  
   
U1STAvalue=UART_INT_TX_BUF_EMPTY  &
              
UART_TX_PIN_NORMAL     &
              
UART_TX_ENABLE         
              
UART_INT_RX_CHAR       &
              
UART_RX_OVERRUN_CLEAR;

   
OpenUART1(U1MODEvalue,U1STAvalue,baudvalue);

   return;
}   

void Init_IO(void)
{
   
ADPCFG=0XFFFF;
   
SW5C=INPUT;
   
LED1C=0;
   
LED1=0;
}

void Scankey(void)
{
     if (
FLAGbits.Key_Flag)                // SW2 press ?
    
{
        
FLAGbits.Key_Flag=0;            // Clear key press flag
        
SendCMD();
    }
}

/*void Scankey(void)
{
   if(SW5==0)
      {
      FLAGbits.kin=1;
      }
   if(keydelay==0)
   {
      if(SW5==1)
      {
         LED1=!LED1;
         SendCMD();
         keydelay=30;
      }
      FLAGbits.kin=0;
   }
}
*/
        
void SendCMD(void)
{
   
unsigned char cnt;
   for(
cnt=0;cnt<5;cnt++)
   {
      while(
BusyUART1());
      
WriteUART1(diplaycmd[cnt]);
   }
}
 
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;
}

char Hex_ASCII_Code(char Data)                     // call by value & return value
{

    if (
Data<0x0a
       return (
Data+0x30);            
    else 
       return (
Data+0x37);
}

void DEC_ASCII(unsigned char HEX_DATA)
{
   
//if HEX_DATA=0XFF-->DEC:255-->ASCII 2 5 5
   
DIG1=Hex_ASCII_Code(HEX_DATA/100);  
   
DIG2=Hex_ASCII_Code((HEX_DATA-DIG1*100)/10);
   
DIG3=Hex_ASCII_Code(HEX_DATA-DIG1*100-DIG2*10);
}

void CLR_RXDATA(void)
{
   
unsigned char cnt;
   for(
cnt=0;cnt<12;cnt++)
   {
      
RX_ARRAY[cnt]=0x00;
   }
}

Attach file:


Link only for registered users

發表於: 2009/10/5 22:46

Edited by Ryang on 2009年10月20日 09:57:04
不怕苦...苦半輩子;怕苦...苦一輩子
頂部


Re: PICDEM Mechatronics編譯問題
資深會員
資深會員


看看是不是振盪器設錯了

發表於: 2009/10/2 8:13
頂部


Re: 求救P18F4520 usart通訊
資深會員
資深會員


nicecookie大大:
晚上回去再把昨天的問題po出來,
感謝您的回覆,受益良多!

發表於: 2009/10/1 16:40
頂部


Re: 求救P18F4520 usart通訊
資深會員
資深會員


nicecookie大大:

對不起,小弟能力不太好!
請問我如何量鮑率,是量輸出端每bit之間的間格時間嗎?
然後計算出每秒可以送多少bit嗎?
如我每bit間格200us,那算出的鮑率大約為5000bit per second(如果沒錯的話,這是之前量測出來的)

發表於: 2009/10/1 11:45
頂部


Re: 求救P18F4520 usart通訊
資深會員
資深會員


nicecookie大大
已將接收邏輯有錯的部份修正了,昨晚改程式的時候,找到一個問題,我如果用8bit的模式,收發正常,但如果切9bit的模式,收一樣的資料確沒辦法正確收資料,
很納悶,因為只是多收個RX9D,如果我不想去管RX9D,應該也沒差,因為只是放同位檢查罷了,請前輩指點!

不為因為這樣需要換有同位檢查功能的IC吧?如pic24 or dspic 30f

發表於: 2009/10/1 8:21
頂部


Re: 求救P18F4520 usart通訊
資深會員
資深會員


nicecookie大大 ,
我想你應該有講到問題之一,因為昨天寫到半夜很累,
我看昨天在寫啥也亂寫了,剛剛看了程式之後的確有這樣的狀況,
另外lcd顯示的問題,應該不會發生,我是等到全收完後,再做顯示動作,而且只有我發送display cmd給保護板,才會收到板子傳回的資訊,並不會一直收到資料,不過我還是會再檢查一下,也許真的有錯,才會這樣!
真的感謝您的回覆,如有新的想法,煩請您幫我回覆一下!
希望其它高手也能給點意見!

發表於: 2009/9/30 17:30
頂部


求救P18F4520 usart通訊
資深會員
資深會員


各位前輩幫幫忙:
小弟用p18f4520收鋰電池保護板的資訊,
通訊格式4800 8 E 1,因由PIC發送之資料不長,
因此同位元自行算出填入
目前小弟出的問題是一開使無法與保護板溝通,
就先用PC測試,一開使是與PC收送資料都可以,
但接上保護板收送確不行,後來改了程式,
現在連PC溝通都有些問題!

目前PC端使用LOOKRS232來收送
1.於lookrs232設定UART format: Baud Rate =4800bps, Data Bits=8, Stop Bits=1, Parity Check=even., com port1
手動來收發
1.我由pic送出129 101 2 0 0(dec),然後看電腦有收到
129 101 2 0 0(dec)
2.由pc送出
101 2 103 104 105 106 107 108 109 110 111 129(dec)
lookrs232 指令----->
按D 101 2 103 104 105 106 107 108 109 110 111 129 <----(間格都要加空白鍵)共12byte

每個byte間加空格,101 2 為電池ID 129為結束碼
然後由pic接收看是否收到且正確!

目前硬體皆正常,因將pc與保護板連線是ok的(使用lookrs232)
pic端使用實驗板,也測試過,也換過板子,都ok
請各位前輩指點一下,小弟已經很努力了
真不知道該怎麼辦?
已經連續1個星期都拼到半夜了!

Attach file:


Link only for registered users

發表於: 2009/9/30 15:53
頂部


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


我記得 Microchip 的 UART 函數會去判斷是否有使用9-bit 傳輸的。不過我還是建議你將相關的 UART Source cdoe 函數找出來加以檢查一下,畢竟使用 9-bit 的功能還是要看一下其操作的程序,9-bit 接收後 bit 9 又釋放在哪裡的這些都是要看一下 Source Code 才會了解的。
*********************************************
小弟目前資料進來時,進中斷就直RX_DATA=ReadUSART();
然後回主程式將資料丟進陣列,並沒有去讀TX9D這個位元,
想說直接不做同位元的驗證,但都資料出去時會用到TX9D這個位元來放parity!
另外請教版主,我接收時是否須讀TX9D這個bit?

發表於: 2009/9/28 13:07
頂部



« 1 ... 10 11 12 (13) 14 15 16 ... 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... ]

教育訓練中心

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