PIC24FJでのUART通信について
Posted: 2015年9月02日(水) 16:14
PIC24FJでのUART通信について質問をします。
現在24FJ128GB206を使用してUARTでの通信を試みているのですが,ループバック機能を利用した自分自身への送受信は成功しても,他の端末(pcなど)での通信ができません。オシロスコープで波形を取ってみると,ボーレート通りに信号が出ているのですが,RS232cを用いたPCからの同じボーレート&信号と比べると,波形の周期が違いました。
PICでの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++;
}
}