[戻る]
新着表示

Re: USART受信プログラム 投稿者:n 投稿日:2017/03/22(Wed) 20:27:12 No.849

radioさん
nです。

受信データが、'S'(文字コード)なら書式に%cを指定します。
RcvData = ReadUSART(); // 1バイト受信
sprintf(buff1,(const far rom char *)"%c",RcvData);

受信データが、文字コードではなく数値だった場合は、
書式に%X(16進)や%d(10進)を指定します。
RcvData = ReadUSART(); // 1バイト受信
sprintf(buff1,(const far rom char *)"%02X",RcvData);
(%Xを%02Xとすると、00が表示できます)

すでにNo.848に投稿されていますが、ReadUSART()を使用する場合、
有効な受信データが到着しているかを確認する必要があります。
以下の、コードでご確認ください。
(getcUSART()は、ReadUSART()の別名ですので統一しました)
(空のループ(while文)を、空の波かっこ{}で表すスタイルです)

void RadioControl(void)
{
while(!DataRdyUSART()){} //必要
RcvData = ReadUSART();
if(RcvData == 'S'){
while(!DataRdyUSART()){} //必要
RcvData = ReadUSART();
if(RcvData == 'S'){
for(i = 0; i < 5; i++){
while(!DataRdyUSART()){}
Buf1[i] = ReadUSART();
}
for(i = 0; i < 5; i++){
while(!DataRdyUSART()){}
Buf2[i] = ~ReadUSART();
}
while(!DataRdyUSART()){}
RcvData = ReadUSART();
delay_ms(100);
MotorControl();
}
}
}

> PIC18F2320 + C18の環境で作成しています。
>
> 下記サイトを参考にさせていただき、無線ラジコンに取り組んでいます。
> 送信側は完成しましたが、受信側のプログラムで躓いています。
>
> [送信側]
> http://www.picfun.com/Sensor/equipj77.html
>
> XCTUで確認した所、受信側で次のデータが受信できていることを確認しました。
>
> 53 53 02 00 00 00 00 FD FF FF FF FF 45
> (S S 方向 右速度H 右速度L 左速度H 左速度L ~方向 ~右速度H ~右速度L ~左速度H ~左速度L E)
>
>
> 続いて、受信側のプログラムに取り掛かりました。
> [受信側]
> http://www.picfun.com/Sensor/equipj78.html
>
> Radio control関数(下記に掲載します)で躓いています。
>
> サイトのコードを参考に、C18環境で書き直して確認していますが、
> (確認の方法は、受信データをLCDに表示させています。)
>
> LCDにデータが何も表示されません。
> カーソルは2マス動くのですが、何も表示されない状態です。
>
> 確認の方法を含めて何かおかしなことをしているのでしょうか。
> 教えていただけると助かります。
>
> void RadioControl(void)
> {
> char buff1[20]; //LCD 1行目表示データ
> char buff2[20]; //LCD 2行目表示データ
>
> // データ受信と受信データ解析
> RcvData = ReadUSART( ); // 1バイト受信
> sprintf(buff1,(const far rom char *)"%2d%",RcvData);
> lcd_cmd(0x80); //1行目へ移動
> lcd_str(buff1);
> lcd_clear(); //LCD全消去
> delay_ms(1000);
>
> if(RcvData == 'S') // 'S'受信待ち
> {
> RcvData = ReadUSART( );
> sprintf(buff1,(const far rom char *)"%2d%",RcvData);
> lcd_cmd(0x80); //1行目へ移動
> lcd_str(buff1);
> lcd_clear(); //LCD全消去
> delay_ms(1000);
> if(RcvData == 'S') // 連続'S'受信待ち
> {
> for(i=0; i<5; i++) // データ受信5バイト
> while (!DataRdyUSART());
> Buf1[i] = getcUSART( );
> for(i=0; i<5; i++) // 反転データ5バイト受信
> while (!DataRdyUSART());
> Buf2[i] = ~getcUSART( );
> RcvData = ReadUSART( ); // 'E'受信
> // データ照合とモータ制御
> //MotorControl();
> }
> }
> }

Re: USART受信プログラム 投稿者:radio 投稿日:2017/03/22(Wed) 15:14:08 No.848

先程の投稿から少し進展しましたので、報告します。
データを正しく受信できていない件については、データ受信前に遅延(5msec)を追加することで、
正しく受信ができるようになりました。

⇒この確認は、状態確認用のLEDを用意して確認しました。
(LCD表示がおかしくなっていしまう件は、未解決です…)


↓のコードの状態で、データ照合の所まで進みました。
データを照合し、一致していたらLEDが点滅するようにして、点滅することを確認しました。

しかし、データを1度しか受信してくれません。
while(1)文の中のMotorTest();のプログラムは、無限ループになるのですが、
RadioControl();のプログラムは、データを1度受信したきりになってしまいます。

何が原因なのか分からず困っております。



while(1)
{
// モード読み込み
if(PORTBbits.RB0 == 0) // DIPSW No1 On
MotorTest(); // モータテストモード
else{
RadioControl(); // 無線ラジコンモード
}
}
CloseUSART();
}

/************************************
* モータテスト関数
* 1秒間隔で正転、逆転
************************************/
void MotorTest(void)
{
LED_R^=1;
delay_ms(500); //0.5sec
LED_G^=1;
delay_ms(500); //0.5sec
LED_Y^=1;
delay_ms(500); //0.5sec
LED_W^=1;
delay_ms(500); //0.5sec
}



/*********************************************
*  無線ラジコン処理関数
* Buf1, Buf2に受信データ格納
**********************************************/
void RadioControl(void)
{

char buff1[20]; //LCD 1行目表示データ
//char buff2[20]; //LCD 2行目表示データ

// データ受信と受信データ解析
while (!DataRdyUSART());
RcvData = ReadUSART(); //1文字受信

if(RcvData == 'S') // 'S'受信待ち
{
//LED_W^=1;
delay_ms(10);
//while (!DataRdyUSART());
RcvData = ReadUSART(); //1文字受信
if(RcvData == 'S') // 連続'S'受信待ち
{
//LED_Y^=1;
delay_ms(10);
for (i = 0; i < 5; i++) {
while (!DataRdyUSART());
Buf1[i] = getcUSART();
}
delay_ms(10);
for (i = 0; i < 5; i++) {
while (!DataRdyUSART());
Buf2[i] = ~getcUSART();
}

delay_ms(10);
while (!DataRdyUSART());
RcvData = ReadUSART( ); // 'E'受信
delay_ms(100);
// データ照合とモータ制御
MotorControl();
}
}
}

/***********************************************
* データ照合とモータ制御実行サブ関数
* (無線と赤外線で共用)
* Buf1,Buf2に受信データあり
* M1data,M2dataがモータ速度データ
***********************************************/
void MotorControl(void)
{


/*** 2連送照合比較一致の場合のみ制御実行***/
Error = 0; // エラーフラグリセット
for(i=0; i<5; i++){
if(Buf1[i] != Buf2[i]) // 比較実行
{
Error = 0xFF; // エラーフラグオン
LED_R ^= 1; // 赤LED点滅

delay_ms(100);
}
}
if((Error == 0) && (RcvData == 'E')) // 照合一致か?
{

LED_G = 1; // 緑LED点滅
delay_ms(500);
LED_G = 0; // 緑LED点滅
delay_ms(500);

Direction = (int)Buf1[0]; // 方向セット
MLdata = (int)Buf1[1] * 256 + (int)Buf1[2];
MRdata = (int)Buf1[3] * 256 + (int)Buf1[4];
// 制御実行
switch(Direction) // 方向チェック
{
case 0: MLReverse(MLdata); // 後進の場合
MRReverse(MRdata);
break;
case 1: MLFeed(MLdata); // 前進の場合
MRFeed(MRdata);
break;
case 2: MLStop(); // 停止の場合
MRStop();
break;
default: break;
}
}
}

USART受信プログラム 投稿者:radio 投稿日:2017/03/22(Wed) 10:47:49 No.847

PIC18F2320 + C18の環境で作成しています。

下記サイトを参考にさせていただき、無線ラジコンに取り組んでいます。
送信側は完成しましたが、受信側のプログラムで躓いています。

[送信側]
http://www.picfun.com/Sensor/equipj77.html

XCTUで確認した所、受信側で次のデータが受信できていることを確認しました。

53 53 02 00 00 00 00 FD FF FF FF FF 45
(S S 方向 右速度H 右速度L 左速度H 左速度L ~方向 ~右速度H ~右速度L ~左速度H ~左速度L E)


続いて、受信側のプログラムに取り掛かりました。
[受信側]
http://www.picfun.com/Sensor/equipj78.html

Radio control関数(下記に掲載します)で躓いています。

サイトのコードを参考に、C18環境で書き直して確認していますが、
(確認の方法は、受信データをLCDに表示させています。)

LCDにデータが何も表示されません。
カーソルは2マス動くのですが、何も表示されない状態です。

確認の方法を含めて何かおかしなことをしているのでしょうか。
教えていただけると助かります。

void RadioControl(void)
{
char buff1[20]; //LCD 1行目表示データ
char buff2[20]; //LCD 2行目表示データ

// データ受信と受信データ解析
RcvData = ReadUSART( ); // 1バイト受信
sprintf(buff1,(const far rom char *)"%2d%",RcvData);
lcd_cmd(0x80); //1行目へ移動
lcd_str(buff1);
lcd_clear(); //LCD全消去
delay_ms(1000);

if(RcvData == 'S') // 'S'受信待ち
{
RcvData = ReadUSART( );
sprintf(buff1,(const far rom char *)"%2d%",RcvData);
lcd_cmd(0x80); //1行目へ移動
lcd_str(buff1);
lcd_clear(); //LCD全消去
delay_ms(1000);
if(RcvData == 'S') // 連続'S'受信待ち
{
for(i=0; i<5; i++) // データ受信5バイト
while (!DataRdyUSART());
Buf1[i] = getcUSART( );
for(i=0; i<5; i++) // 反転データ5バイト受信
while (!DataRdyUSART());
Buf2[i] = ~getcUSART( );
RcvData = ReadUSART( ); // 'E'受信
// データ照合とモータ制御
//MotorControl();
}
}
}

USART送信 ワーニング[解決] 投稿者:radio 投稿日:2017/03/21(Tue) 09:01:16 No.846

n様

情報ありがとうございました。
無事解決できました。

harmony trouble 投稿者:窪田秀明 投稿日:2017/03/20(Mon) 05:45:54 No.844

mplabxide xc32 harmony をインストールし、プロジェクトを立ち上げコード化しましたが peripheralファイルと<stdint.h>がインクルードされません。パスの設定を追加しても解決されません。解決法を教えてください。

Re^2: USART送信 ワーニング 投稿者:tanaka 投稿日:2017/03/19(Sun) 00:47:17 No.843

> radioさん
>
> はじめましてnです。
>
> CCSCのputc()に対応する関数は、
> WriteUSART()だと思います。
>
> void putsUSART(char *data);
> void WriteUSART(char data);
>
> putsUSART()ですと、引数はchar型データへのポインタ型になります。
> 一連の警告は、これが原因でしょう。
> Cでは、"S"と'S'は似ているが異なる型です(ポインタと整数)
> (アセンブラでは、"S"と'S'が同じになるものが多数派です)
>
> 以下のコードでご確認ください。
> (タイミングをとるコードが必要かもしれません)
>
> //USART送信
> WriteUSART('S');//putsUSART("S");同等
> WriteUSART('S');
> WriteUSART(Direction);
> WriteUSART(MLdata >> 8);
> WriteUSART(MLdata & 0x00FF);
> WriteUSART(MRdata >> 8);
> WriteUSART(MRdata & 0x00FF);
> WriteUSART(~Direction);
> WriteUSART(~(MLdata >> 8));
> WriteUSART(~(MLdata & 0x00FF));
> WriteUSART(~(MRdata >> 8));
> WriteUSART(~(MRdata & 0x00FF));
> WriteUSART('E');
>
> > PIC18F2320 + C18コンパイラを使用しています。
> >
> > 次のサイトを参考にしてUSART通信プログラムを作成しています。
> > [参考サイト]
> > http://www.picfun.com/Sensor/equipj77.html
> >
> > USART通信用プログラムをコンパイルすると、
> > 大量のワーニングが出てしまい困っています。
> >
> > ワーニングの原因が分かりません。どなたか教えてください。
> >
> > //変数の宣言
> > static unsigned int Direction;
> > static unsigned long MRdata,MLdata;
> >
> > //USART送信
> > putsUSART("S");
> > putsUSART("S");
> > putsUSART(Direction);
> > putsUSART(MLdata >> 8);
> > putsUSART(MLdata & 0x00FF);
> > putsUSART(MRdata >> 8);
> > putsUSART(MRdata & 0x00FF);
> > putsUSART(~Direction);
> > putsUSART(~(MLdata >> 8));
> > putsUSART(~(MLdata & 0x00FF));
> > putsUSART(~(MRdata >> 8));
> > putsUSART(~(MRdata & 0x00FF));
> > putsUSART("E");
> >
> >
> > //ワーニング
> > Warning [2066] type qualifier mismatch in assignment
> > Warning [2066] type qualifier mismatch in assignment
> > Warning [2054] suspicious pointer conversion
> > C
> > Warning [2054] suspicious pointer conversion
> > C
> > Warning [2054] suspicious pointer conversion
> > C
> > Warning [2054] suspicious pointer conversion
> > C
> > Warning [2054] suspicious pointer conversion
> > C
> > Warning [2054] suspicious pointer conversion
> > C
> > Warning [2054] suspicious pointer conversion
> > C
> > Warning [2054] suspicious pointer conversion
> > C
> > Warning [2054] suspicious pointer conversion
> > C
> > Warning [2054] suspicious pointer conversion
> > C
> > Warning [2066] type qualifier mismatch in assignment

情報ありがとうございます。

Re^2: 12F1571 投稿者: 投稿日:2017/03/18(Sat) 12:25:05 No.841

> 初心者は今時、機械語は使わないでしょう・・・

何のための投稿じゃ
荒しと変わらんぞ !

Re: USART送信 ワーニング 投稿者:n 投稿日:2017/03/16(Thu) 21:42:04 No.840

radioさん

はじめましてnです。

CCSCのputc()に対応する関数は、
WriteUSART()だと思います。

void putsUSART(char *data);
void WriteUSART(char data);

putsUSART()ですと、引数はchar型データへのポインタ型になります。
一連の警告は、これが原因でしょう。
Cでは、"S"と'S'は似ているが異なる型です(ポインタと整数)
(アセンブラでは、"S"と'S'が同じになるものが多数派です)

以下のコードでご確認ください。
(タイミングをとるコードが必要かもしれません)

//USART送信
WriteUSART('S');//putsUSART("S");同等
WriteUSART('S');
WriteUSART(Direction);
WriteUSART(MLdata >> 8);
WriteUSART(MLdata & 0x00FF);
WriteUSART(MRdata >> 8);
WriteUSART(MRdata & 0x00FF);
WriteUSART(~Direction);
WriteUSART(~(MLdata >> 8));
WriteUSART(~(MLdata & 0x00FF));
WriteUSART(~(MRdata >> 8));
WriteUSART(~(MRdata & 0x00FF));
WriteUSART('E');

> PIC18F2320 + C18コンパイラを使用しています。
>
> 次のサイトを参考にしてUSART通信プログラムを作成しています。
> [参考サイト]
> http://www.picfun.com/Sensor/equipj77.html
>
> USART通信用プログラムをコンパイルすると、
> 大量のワーニングが出てしまい困っています。
>
> ワーニングの原因が分かりません。どなたか教えてください。
>
> //変数の宣言
> static unsigned int Direction;
> static unsigned long MRdata,MLdata;
>
> //USART送信
> putsUSART("S");
> putsUSART("S");
> putsUSART(Direction);
> putsUSART(MLdata >> 8);
> putsUSART(MLdata & 0x00FF);
> putsUSART(MRdata >> 8);
> putsUSART(MRdata & 0x00FF);
> putsUSART(~Direction);
> putsUSART(~(MLdata >> 8));
> putsUSART(~(MLdata & 0x00FF));
> putsUSART(~(MRdata >> 8));
> putsUSART(~(MRdata & 0x00FF));
> putsUSART("E");
>
>
> //ワーニング
> Warning [2066] type qualifier mismatch in assignment
> Warning [2066] type qualifier mismatch in assignment
> Warning [2054] suspicious pointer conversion
> C
> Warning [2054] suspicious pointer conversion
> C
> Warning [2054] suspicious pointer conversion
> C
> Warning [2054] suspicious pointer conversion
> C
> Warning [2054] suspicious pointer conversion
> C
> Warning [2054] suspicious pointer conversion
> C
> Warning [2054] suspicious pointer conversion
> C
> Warning [2054] suspicious pointer conversion
> C
> Warning [2054] suspicious pointer conversion
> C
> Warning [2054] suspicious pointer conversion
> C
> Warning [2066] type qualifier mismatch in assignment

USART送信 ワーニング 投稿者:radio 投稿日:2017/03/16(Thu) 16:53:14 No.839

PIC18F2320 + C18コンパイラを使用しています。

次のサイトを参考にしてUSART通信プログラムを作成しています。
[参考サイト]
http://www.picfun.com/Sensor/equipj77.html

USART通信用プログラムをコンパイルすると、
大量のワーニングが出てしまい困っています。

ワーニングの原因が分かりません。どなたか教えてください。

//変数の宣言
static unsigned int Direction;
static unsigned long MRdata,MLdata;

//USART送信
putsUSART("S");
putsUSART("S");
putsUSART(Direction);
putsUSART(MLdata >> 8);
putsUSART(MLdata & 0x00FF);
putsUSART(MRdata >> 8);
putsUSART(MRdata & 0x00FF);
putsUSART(~Direction);
putsUSART(~(MLdata >> 8));
putsUSART(~(MLdata & 0x00FF));
putsUSART(~(MRdata >> 8));
putsUSART(~(MRdata & 0x00FF));
putsUSART("E");


//ワーニング
Warning [2066] type qualifier mismatch in assignment
Warning [2066] type qualifier mismatch in assignment
Warning [2054] suspicious pointer conversion
C
Warning [2054] suspicious pointer conversion
C
Warning [2054] suspicious pointer conversion
C
Warning [2054] suspicious pointer conversion
C
Warning [2054] suspicious pointer conversion
C
Warning [2054] suspicious pointer conversion
C
Warning [2054] suspicious pointer conversion
C
Warning [2054] suspicious pointer conversion
C
Warning [2054] suspicious pointer conversion
C
Warning [2054] suspicious pointer conversion
C
Warning [2066] type qualifier mismatch in assignment

Re^2: 12F1571 投稿者:煩悩 投稿日:2017/03/09(Thu) 20:03:42 No.837

はじめましてnさん。

nさんの言うとおりにしたら解決できました。
ありがとうございます。
助かりました。

> 煩悩さん
>
> はじめましてnです。
>
> 以下のコードが、PORTAではなくTRISAをテストしています。
>
> BTFSC PORTA,0 ;SWの確認
> (BTFSC TRTSA,0と同じコード)
>
> TRISAを設定した後、MAIN_LOOPに入る前に、
> BANKSEL PORTAが必要です。
>
> #include <p12f1571.inc>
>
> MAIN
> BCF INTCON,GIE
> BANKSEL PORTA
> CLRF PORTA
> BANKSEL LATA
> CLRF LATA
> BANKSEL ANSELA
> CLRF ANSELA
> BANKSEL TRISA
> MOVLW B'00000011'
> MOVWF TRISA
> BANKSEL PORTA
>
> MAIN_LOOP
> BTFSC PORTA,0 ;SWの確認
> GOTO MAIN_LOOP
> NEXT
> GOTO NEXT
> END
>
> > 初心者です。教えてください。
> >
> > MAIN
> > BCF INTCON,GIE
> > BANKSEL PORTA
> > CLRF PORTA
> > BANKSEL LATA
> > CLRF LATA
> > BANKSEL ANSELA
> > CLRF ANSELA
> > BANKSEL TRISA
> > MOVLW B'00000011'
> > MOVWF TRISA
> >
> > MAIN_LOOP
> > BTFSC PORTA,0 ;SWの確認
> > GOTO MAIN_LOOP
> > NEXT
> >
> > PIC12F1571のピックを使用しています。
> > RA0,RA1は入力。RA2は出力。
> > RA4,RA5は外部クロックに使用しています。
> > MPLAB Xのシミュレータを使用してPORTA,0に変数"1"を入れても
> > 無視されてMAIN_LOOPから抜けだせません。
> > どこが間違っているのでしょうか?よろしくお願いします。

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |

- WebForum -