ページ 11

PIC24FJでのUART通信について

Posted: 2015年9月02日(水) 16:14
by dklngh
PIC24FJでのUART通信について質問をします。
現在24FJ128GB206を使用してUARTでの通信を試みているのですが,ループバック機能を利用した自分自身への送受信は成功しても,他の端末(pcなど)での通信ができません。オシロスコープで波形を取ってみると,ボーレート通りに信号が出ているのですが,RS232cを用いたPCからの同じボーレート&信号と比べると,波形の周期が違いました。
PICでのUART通信を行う上で気を付けなければいけないことなどあれば教えてください。よろしくお願いします。
以下プログラムを載せます(ピン配置は別の場所で定義してます)

コード:

#include <uart.h>
#include<xc.h>
#include"lcd.h"
#include"uartest.h"
#include"PPS.h"

#define CPU_CLOCK 32000000L                        // クロック [Hz]
#define CPU_PLL   8                                // PLL
#define FCY       16000000L  // 命令サイクルクロック [Hz
#define BAUDRATE  19200L   
unsigned char cdata[128];
int m=0;
void __attribute__(( interrupt, auto_psv )) _U1RXInterrupt(){
   cdata[m]=U1RXREG;
   if(U1STAbits.OERR==1){gotoxy(0,1); lcdprintf("suck");
   } else {gotoxy(0,1); lcdprintf("load");}
    m++;
    IFS0bits.U1RXIF = 0;
    
}
void uarttest(void){
    int i,count=0,j;
    volatile int errCount  = 0; // 受信エラー回数
    unsigned char debug[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    unsigned char data[8]={0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00};
    const unsigned int Mode
         = UART_EN              // UARTモジュール - 有効
         & UART_IDLE_CON       // アイドルモード - 動作停止
         & UART_DIS_WAKE        // ウェイクアップ - 無効
         & UART_DIS_LOOPBACK    // ループバック - 無効 
         & UART_NO_PAR_8BIT     // パリティなし/データ 8ビット
         & UART_1STOPBIT// ストップビット - 1ビット
         & UART_UXRX_IDLE_ZERO // U1RXのアイドルを1にする
         & UART_BRGH_SIXTEEN    // 高速転送を無効
         & UART_DIS_ABAUD         // ボーレートの自動検出を無効
         & UART_MODE_FLOW;

    const unsigned int Status
         = UART_TX_ENABLE           // 送信 - 有効
         & UART_INT_TX_BUF_EMPTY    // 送信の割り込み条件 - 送信バッファが空
         & UART_INT_RX_CHAR         // 受信の割り込み条件 - 受信するたび
         & UART_ADR_DETECT_DIS      // アドレス検出 - 無効
         & UART_IrDA_POL_INV_ZERO; 
         //& UART_RX_OVERRUN_CLEAR;   // 受信バッファオーバーランエラー - クリア

    const double Baudrate = ( double )FCY / ( 16 * BAUDRATE ) - 1;
    // ボーレートの小数点以下を四捨五入する
    unsigned int urg= ( unsigned int )( Baudrate  );
    
    OpenUART1( Mode,Status,urg );//ポートの動作設定
    IPC2bits.U1RXIP2=1;
    IPC2bits.U1RXIP1=0;
    IPC2bits.U1RXIP0=0;
    IEC0bits.U1RXIE=1;
    clrscr();
    waitms(100);
    /*
    for(i=0;i<8;i++){   
        U1TXREG=debug[i];
        while ( U1STAbits.TRMT == 0 );
    }
    */
    for(j=0;j<3;j++){
		for(i=0;i<8;i++){   
			U1TXREG=data[i];
			while ( U1STAbits.TRMT == 0 );
		}
    waitms(50);
    }
    i=0;
    while(1){
        waitms(1000);
        clrscr();
        if (   U1STAbits.FERR == 1  ) {//||  U1STAbits.PERR == 1        if ( U1STAbits.OERR || ) {//||  U1STAbits.PERR == 1
            errCount++;
        }
        gotoxy(0,0); lcdprintf("%x",cdata[i]);
        if(errCount==0){
            gotoxy(4,1); lcdprintf("OK");
        }else {
            gotoxy(4,1); lcdprintf("NG");
        }
        gotoxy(4,0); lcdprintf("%d",i);
        if(U1STAbits.OERR == 1) U1STAbits.OERR =0;
        errCount=0;
        i++;
    }
}

Re: PIC24FJでのUART通信について

Posted: 2015年9月02日(水) 22:14
by みけCAT
投稿日時と内容が近く、質問者の名前が一致する質問が見つかりました。
この掲示板を含めてマルチポストを行う際は、相互リンクが必要です。

魚拓|アーカイブ

[hr]
dklngh さんが書きました:オシロスコープで波形を取ってみると,ボーレート通りに信号が出ているのですが,RS232cを用いたPCからの同じボーレート&信号と比べると,波形の周期が違いました。
「波形の周期」とはどういうものでしょうか?
具体的な図で示していただけるとわかりやすいです。
dklngh さんが書きました:

コード:

    const unsigned int Mode
         = UART_EN              // UARTモジュール - 有効
         & UART_IDLE_CON       // アイドルモード - 動作停止
         & UART_DIS_WAKE        // ウェイクアップ - 無効
         & UART_DIS_LOOPBACK    // ループバック - 無効 
         & UART_NO_PAR_8BIT     // パリティなし/データ 8ビット
         & UART_1STOPBIT// ストップビット - 1ビット
         & UART_UXRX_IDLE_ZERO // U1RXのアイドルを1にする
         & UART_BRGH_SIXTEEN    // 高速転送を無効
         & UART_DIS_ABAUD         // ボーレートの自動検出を無効
         & UART_MODE_FLOW;
IrDA®を無効にしていない気がするのですが、大丈夫なのでしょうか?
また、「U1RXのアイドルを1にする」というコメントと実際のコードが一致していない気がしますが、大丈夫なのでしょうか?
参考にした情報:
PIC24FJ256GB210 Family Data Sheet
Header for UART module library functions

Re: PIC24FJでのUART通信について

Posted: 2015年9月03日(木) 16:21
by dklngh
>>「波形の周期」とはどういうものでしょうか?
  具体的な図で示していただけるとわかりやすいです。

ボーレートを調整したことで波形の問題は解決しました.お手数おかけして申し訳ありませんでした.

>>IrDA®を無効にしていない気がするのですが、大丈夫なのでしょうか?
  また、「U1RXのアイドルを1にする」というコメントと実際のコードが一致していない気がしますが、大丈夫なのでしょうか?

IrDA®を無効にしてみましたが,解決しませんでした...
また,コメントのことですが試行錯誤しているうちにコードとコメントが一致しなくなっていた部分がありました.
混乱させてしまい申し訳ありません.


新たに問題が発生しました...
マイコンからの通信を見ると,最初の1byte目の送ったデータが必ず受信されていないのですが,なぜでしょうか?

コード:

unsigned char data[8]={0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00};
このようなデータを送信したときに必ず0x40のみ受信されないです.
原因が分かりません.

Re: PIC24FJでのUART通信について

Posted: 2015年9月30日(水) 15:29
by dklngh
答えろし