[戻る]
過去ログ [ 0001 ]
過去ログ:     ワード検索: 条件: 表示:

タイトル
記事No
投稿日
投稿者
参照先
PIC18Fシリアル通信について
37
: 14/12/19-14:12
PIC入門者

IC18Fマイコンによるシリアル通信。

PIC18F2620、C18コンパイラで次のシリアル通信プログラムを作成していますが、構文エラーの原因が分からずに困っています。
初心者の為、細かいミスが多いかもしれませんが、コードの不備を指摘して頂けると助かります。

/*///////////////////////////コマンドに応じた処理///////////////////////////////*/
コマンドI(i): PortBの状態(1or0)を送信
コマンドO(o): 8bitの受信データをPort Bに出力
コマンドA(a): 指定ポート(例A0なら、コマンドA0)のコマンドを受信し、AD変換後のデータを送信

コードを参考に添付させていただきます。


#include<p18f2620.h>
#include<delays.h>
#include<usart.h>
#include"lcdlib18.h"

#pragma config OSC = INTIO67 , FCMEN = OFF , IESO = OFF
#pragma config PWRT = OFF , BOREN = OFF , BORV = 1
#pragma config WDT = OFF , WDTPS = 32768
#pragma config MCLRE = ON , LPT1OSC = OFF , CCP2MX = PORTC
#pragma config STVREN = OFF , LVP = OFF , XINST = OFF

/*メッセージの定義*/
char Msg[] = "Data Receive Test ";
/*メイン関数*/
void main(void)
{
char cmnd;
OSCCON = 0b01100000;
//入出力設定
TRISA = 0b11111111;// RA0-7 Input
TRISB = 0b11111111;// RB0-7 Input
TRISC = 0b00000000;// RC0-7 output

//USART初期設定 非同期で9600bps
OpenUSART( USART_TX_INT_OFF & //割込み送信:OFF
USART_RX_INT_OFF & //割込み受信:OFF
USART_ASYNCH_MODE & //調歩同期通信モード
USART_EIGHT_BIT & //データ長:8ビット
USART_CONT_RX & //連続受信モード
USART_BRGH_HIGH,25);

lcd_init(); //LCD初期化
lcd_clear(); //LCD全消去

byte t;
output_low(PIN_A4);
delay_ms(100);
output_high(PIN_A4);

while(1)
{
lcd_cmd(0x80); //1行目へ移動
lcd_str(Msg); //LCDの表示

if(!input(RXF)) {
output_low(RC);
t = port_C;
output_high(RC);
if(t == 0x0d) cr_flag = 1;

RX_Buff[next_in] = t;
t = next_in;
next_in = (next_in+1) % BUFFER_SIZE;
if(next_in == next_out) next_in = t; // Buffer full !!
}
if(cr_flag == 1) Command_Dispat();
}
}


void Command_Dispat(void)
{
byte i,j,cmd[BUFFER_SIZE];
putsUSART(CmdMsg); //メッセージ送信
while(!DataRdyUSART()); //受信待ち
cmnd = ReadUSART(); //1文字受信

switch(cmnd[i]) {
case 'I': // Input Port
case 'i':
j = port_B;
putsUSART((long int)j);
break;

case 'O': // Output Port
case 'o':
j = atoi(&cmnd[i+1]);
port_C = j;
break;

case 'A': // Read ADC
case 'a':
j = cmnd[i+1] - '0';
set_adc_channel(j);
delay_us(5);
data = read_adc();
putsUSART(data);
break;

case 'L': // LED ON/OFF
case 'l':
j = atoi(&cmnd[i+1]);
if(j == 0) {
output_high(PIN_A4);
}
else
{
output_low(PIN_A4);
}
break;

default:
break;

}
cr_flag = 0;
}

//遅延関数
/**1msec Delay SubFunction at 10MIPS**/
void delay_ms(int time){
while(time > 0){
Delay1KTCYx(10);
time--;
}
}
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: PIC18Fシリアル通信について
38
: 14/12/19-21:56
ハマ

コンパイルした時のエラー名を書かれた方がよろしいかと思います。
コピー&ペーストで貼りつけられたはずです。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
エラーコード
39
: 14/12/22-08:23
PIC入門者

エラーコードを掲示させていただきます。

Release build of project `C:\Users\nagata\Documents\nagata\PIC\PIC Program\Test06_USART\Test06.mcp' started.
Language tool versions: mpasmwin.exe v5.45, mplink.exe v4.43, mcc18.exe v3.42, mplib.exe v4.43
Mon Dec 22 08:22:28 2014
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Users\nagata\Documents\nagata\PIC\PIC Program\Test06_USART\Test06.mcs".
Clean: Done.
Executing: "C:\Program Files\Microchip\mplabc18\v3.42\bin\mcc18.exe" -p=18F2620 "Test06.c" -fo="Test06.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\Users\PIC\PIC Program\Test06_USART\Test06.c:41:Error: syntax error
Halting build on first failure as requested.
----------------------------------------------------------------------
Release build of project `C:\Users\nagata\Documents\nagata\PIC\PIC Program\Test06_USART\Test06.mcp' failed.
Language tool versions: mpasmwin.exe v5.45, mplink.exe v4.43, mcc18.exe v3.42, mplib.exe v4.43
Mon Dec 22 08:22:28 2014
----------------------------------------------------------------------
BUILD FAILED
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: PIC18Fシリアル通信について
40
: 14/12/22-09:47
Gokan <gokan@picfun.com>

記述がCCSコンパイラ用とMPLAB C18コンパイラ用が混在していますね。
MPLAB C18はすでに古くなっていますので、MPLAB XC8をお使い下さい。
記述方法は下記にあります。

http://www.picfun.com/xcframe.html

             以上



> IC18Fマイコンによるシリアル通信。
>
> PIC18F2620、C18コンパイラで次のシリアル通信プログラムを作成していますが、構文エラーの原因が分からずに困っています。
> 初心者の為、細かいミスが多いかもしれませんが、コードの不備を指摘して頂けると助かります。
>
> /*///////////////////////////コマンドに応じた処理///////////////////////////////*/
> コマンドI(i): PortBの状態(1or0)を送信
> コマンドO(o): 8bitの受信データをPort Bに出力
> コマンドA(a): 指定ポート(例A0なら、コマンドA0)のコマンドを受信し、AD変換後のデータを送信
>
> コードを参考に添付させていただきます。
>
>
> #include<p18f2620.h>
> #include<delays.h>
> #include<usart.h>
> #include"lcdlib18.h"
>
> #pragma config OSC = INTIO67 , FCMEN = OFF , IESO = OFF
> #pragma config PWRT = OFF , BOREN = OFF , BORV = 1
> #pragma config WDT = OFF , WDTPS = 32768
> #pragma config MCLRE = ON , LPT1OSC = OFF , CCP2MX = PORTC
> #pragma config STVREN = OFF , LVP = OFF , XINST = OFF
>
> /*メッセージの定義*/
> char Msg[] = "Data Receive Test ";
> /*メイン関数*/
> void main(void)
> {
> char cmnd;
> OSCCON = 0b01100000;
> //入出力設定
> TRISA = 0b11111111;// RA0-7 Input
> TRISB = 0b11111111;// RB0-7 Input
> TRISC = 0b00000000;// RC0-7 output
>
> //USART初期設定 非同期で9600bps
> OpenUSART( USART_TX_INT_OFF & //割込み送信:OFF
> USART_RX_INT_OFF & //割込み受信:OFF
> USART_ASYNCH_MODE & //調歩同期通信モード
> USART_EIGHT_BIT & //データ長:8ビット
> USART_CONT_RX & //連続受信モード
> USART_BRGH_HIGH,25);
>
> lcd_init(); //LCD初期化
> lcd_clear(); //LCD全消去
>
> byte t;
> output_low(PIN_A4);
> delay_ms(100);
> output_high(PIN_A4);
>
> while(1)
> {
> lcd_cmd(0x80); //1行目へ移動
> lcd_str(Msg); //LCDの表示
>
> if(!input(RXF)) {
> output_low(RC);
> t = port_C;
> output_high(RC);
> if(t == 0x0d) cr_flag = 1;
>
> RX_Buff[next_in] = t;
> t = next_in;
> next_in = (next_in+1) % BUFFER_SIZE;
> if(next_in == next_out) next_in = t; // Buffer full !!
> }
> if(cr_flag == 1) Command_Dispat();
> }
> }
>
>
> void Command_Dispat(void)
> {
> byte i,j,cmd[BUFFER_SIZE];
> putsUSART(CmdMsg); //メッセージ送信
> while(!DataRdyUSART()); //受信待ち
> cmnd = ReadUSART(); //1文字受信
>
> switch(cmnd[i]) {
> case 'I': // Input Port
> case 'i':
> j = port_B;
> putsUSART((long int)j);
> break;
>
> case 'O': // Output Port
> case 'o':
> j = atoi(&cmnd[i+1]);
> port_C = j;
> break;
>
> case 'A': // Read ADC
> case 'a':
> j = cmnd[i+1] - '0';
> set_adc_channel(j);
> delay_us(5);
> data = read_adc();
> putsUSART(data);
> break;
>
> case 'L': // LED ON/OFF
> case 'l':
> j = atoi(&cmnd[i+1]);
> if(j == 0) {
> output_high(PIN_A4);
> }
> else
> {
> output_low(PIN_A4);
> }
> break;
>
> default:
> break;
>
> }
> cr_flag = 0;
> }
>
> //遅延関数
> /**1msec Delay SubFunction at 10MIPS**/
> void delay_ms(int time){
> while(time > 0){
> Delay1KTCYx(10);
> time--;
> }
> }
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
PIC18Fシリアル通信について
41
: 14/12/22-12:05
PIC入門者

XC8について教えていただき、ありがとうございます。
これから勉強していきたいと思います。

今回のコードを、まずC18用に統一して記載すると、どのようになりますでしょうか。お手数をお掛けして申し訳ありませんが、教えていただけると助かります。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: PIC18Fシリアル通信について
42
: 14/12/22-13:16
Gokan <gokan@picfun.com>

修正箇所は多いですが、多くはI/O関連ですね。
 output_low や output_high input はないので
書き換えが必要です。
 あとUSARTの受信チェック方法も異なります。
記述方法の詳細は下記を参照ください。

 http://www.picfun.com/mod18frame.html

        以上

> XC8について教えていただき、ありがとうございます。
> これから勉強していきたいと思います。
>
> 今回のコードを、まずC18用に統一して記載すると、どのようになりますでしょうか。お手数をお掛けして申し訳ありませんが、教えていただけると助かります。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
PIC18Fシリアル通信について
43
: 14/12/24-13:19
PIC入門者

指摘して頂いた箇所について修正してみましたが、
最初と同じエラーがまだ出てしまいます。
おかしな記述がありましたら、指摘していただけると助かります。
//////////////////////////////////////////////
#include<p18f2620.h>
#include<delays.h>
#include<usart.h>
#include"lcdlib18.h"

#pragma config OSC = INTIO67 , FCMEN = OFF , IESO = OFF
#pragma config PWRT = OFF , BOREN = OFF , BORV = 1
#pragma config WDT = OFF , WDTPS = 32768
#pragma config MCLRE = ON , LPT1OSC = OFF , CCP2MX = PORTC
#pragma config STVREN = OFF , LVP = OFF , XINST = OFF


/*メッセージの定義*/
char Msg[] = "Data Receive Test ";

/*メイン関数*/
void main(void)
{
char cmnd;
OSCCON = 0b01100000;
//入出力設定
TRISA = 0b11101111;// RA0-3,5-7 Input, RA4 output
TRISB = 0b11111111;// RB0-7 Input
TRISC = 0b00000000;// RC0-7 output



//USART初期設定 非同期で9600bps
OpenUSART( USART_TX_INT_OFF & //割込み送信:OFF
USART_RX_INT_OFF & //割込み受信:OFF
USART_ASYNCH_MODE & //調歩同期通信モード
USART_EIGHT_BIT & //データ長:8ビット
USART_CONT_RX & //連続受信モード
USART_BRGH_HIGH,25);

lcd_init(); //LCD初期化

lcd_clear(); //LCD全消去


byte t;
LATAbits.LATA4 = 0;
delay_ms(100);
LATAbits.LATA4 = 1;

while(1)
{
lcd_cmd(0x80); //1行目へ移動
lcd_str(Msg); //LCDの表示

if(!DataRdyUSART()) {
LATC=0x00;
t = port_C;
LATC=0xFF;
if(t == 0x0d) cr_flag = 1;

RX_Buff[next_in] = t;
t = next_in;
next_in = (next_in+1) % BUFFER_SIZE;
if(next_in == next_out) next_in = t; // Buffer full !!
}

if(cr_flag == 1) Command_Dispat();

}
}


void Command_Dispat(void)
{
byte i,j,cmd[BUFFER_SIZE];
putsUSART(CmdMsg); //メッセージ送信
while(!DataRdyUSART()); //受信待ち
cmnd = ReadUSART(); //1文字受信

switch(cmnd[i]) {
case 'I': // Input Port
case 'i':
j = port_B;
putsUSART((long int)j);
break;

case 'O': // Output Port
case 'o':
j = atoi(&cmnd[i+1]);
port_C = j;
break;

case 'A': // Read ADC
case 'a':
j = cmnd[i+1] - '0';
set_adc_channel(j);
delay_us(5);
data = read_adc();
putsUSART(data);
break;

case 'L': // LED ON/OFF
case 'l':
j = atoi(&cmnd[i+1]);
if(j == 0) {
LATAbits.LATA4 = 1;
}
else
{
LATAbits.LATA4 = 0;
}
break;

default:
break;

}
cr_flag = 0;
}



//遅延関数
/**1msec Delay SubFunction at 10MIPS**/
void delay_ms(int time){
while(time > 0){
Delay1KTCYx(10);
time--;
}
}
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: PIC18Fシリアル通信について
44
: 14/12/24-16:25
Gokan <gokan@picfun.com>

outputの窓に出力される青色のERRORという行をクリックすると
その行にカーソルが移動しますから、それらの行を修正しては
コンパイルし直すという作業を繰り返してください。

byte は使えません char に変更してください。
port_Cも使えません PORTC に変更してください。
set_adc_channel read_adcなどの関数も使えません。
同様にputsUASRTなどの関数はCCSのものですから使えません。

次に質問する際には、どの行のエラーかを教えてください。

                以上

> 指摘して頂いた箇所について修正してみましたが、
> 最初と同じエラーがまだ出てしまいます。
> おかしな記述がありましたら、指摘していただけると助かります。
> //////////////////////////////////////////////
> #include<p18f2620.h>
> #include<delays.h>
> #include<usart.h>
> #include"lcdlib18.h"
>
> #pragma config OSC = INTIO67 , FCMEN = OFF , IESO = OFF
> #pragma config PWRT = OFF , BOREN = OFF , BORV = 1
> #pragma config WDT = OFF , WDTPS = 32768
> #pragma config MCLRE = ON , LPT1OSC = OFF , CCP2MX = PORTC
> #pragma config STVREN = OFF , LVP = OFF , XINST = OFF
>
>
> /*メッセージの定義*/
> char Msg[] = "Data Receive Test ";
>
> /*メイン関数*/
> void main(void)
> {
> char cmnd;
> OSCCON = 0b01100000;
> //入出力設定
> TRISA = 0b11101111;// RA0-3,5-7 Input, RA4 output
> TRISB = 0b11111111;// RB0-7 Input
> TRISC = 0b00000000;// RC0-7 output
>
>
>
> //USART初期設定 非同期で9600bps
> OpenUSART( USART_TX_INT_OFF & //割込み送信:OFF
> USART_RX_INT_OFF & //割込み受信:OFF
> USART_ASYNCH_MODE & //調歩同期通信モード
> USART_EIGHT_BIT & //データ長:8ビット
> USART_CONT_RX & //連続受信モード
> USART_BRGH_HIGH,25);
>
> lcd_init(); //LCD初期化
>
> lcd_clear(); //LCD全消去
>
>
> byte t;
> LATAbits.LATA4 = 0;
> delay_ms(100);
> LATAbits.LATA4 = 1;
>
> while(1)
> {
> lcd_cmd(0x80); //1行目へ移動
> lcd_str(Msg); //LCDの表示
>
> if(!DataRdyUSART()) {
> LATC=0x00;
> t = port_C;
> LATC=0xFF;
> if(t == 0x0d) cr_flag = 1;
>
> RX_Buff[next_in] = t;
> t = next_in;
> next_in = (next_in+1) % BUFFER_SIZE;
> if(next_in == next_out) next_in = t; // Buffer full !!
> }
>
> if(cr_flag == 1) Command_Dispat();
>
> }
> }
>
>
> void Command_Dispat(void)
> {
> byte i,j,cmd[BUFFER_SIZE];
> putsUSART(CmdMsg); //メッセージ送信
> while(!DataRdyUSART()); //受信待ち
> cmnd = ReadUSART(); //1文字受信
>
> switch(cmnd[i]) {
> case 'I': // Input Port
> case 'i':
> j = port_B;
> putsUSART((long int)j);
> break;
>
> case 'O': // Output Port
> case 'o':
> j = atoi(&cmnd[i+1]);
> port_C = j;
> break;
>
> case 'A': // Read ADC
> case 'a':
> j = cmnd[i+1] - '0';
> set_adc_channel(j);
> delay_us(5);
> data = read_adc();
> putsUSART(data);
> break;
>
> case 'L': // LED ON/OFF
> case 'l':
> j = atoi(&cmnd[i+1]);
> if(j == 0) {
> LATAbits.LATA4 = 1;
> }
> else
> {
> LATAbits.LATA4 = 0;
> }
> break;
>
> default:
> break;
>
> }
> cr_flag = 0;
> }
>
>
>
> //遅延関数
> /**1msec Delay SubFunction at 10MIPS**/
> void delay_ms(int time){
> while(time > 0){
> Delay1KTCYx(10);
> time--;
> }
> }
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
PIC18Fシリアル通信について
45
: 14/12/24-17:12
PIC入門者

Gokan様 
毎回返信していただき、ありがとうございます。
おっしゃる通り、Errorの箇所をダブルクリックして、修正->ビルドを繰り返していきたいと考えているのですが、今の状態だと、↓のErrorが表示されてしまい、エラー箇所を探すのに手間取っています。

素人質問で申し訳ありませんが、返信頂けると助かります。

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Program Files\Microchip\mplabc18\v3.42\bin\mcc18.exe" -p=18F2620 "Test06.c" -fo="Test06.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\Users\PIC\PIC Program\Test06_USART\Test06.c:40:Error: syntax error
Halting build on first failure as requested.
----------------------------------------------------------------------
Release build of project `C:\Users\PIC\PIC Program\Test06_USART\Test06.mcp' failed.
Language tool versions: mpasmwin.exe v5.45, mplink.exe v4.43, mcc18.exe v3.42, mplib.exe v4.43
Wed Dec 24 17:05:58 2014
----------------------------------------------------------------------
BUILD FAILED
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: PIC18Fシリアル通信について
47
: 14/12/24-17:17
Gokan <gokan@picfun.com>

syntax errorと表示されている行をダブルクリックすればよいはずです。


> Gokan様 
> 毎回返信していただき、ありがとうございます。
> おっしゃる通り、Errorの箇所をダブルクリックして、修正->ビルドを繰り返していきたいと考えているのですが、今の状態だと、↓のErrorが表示されてしまい、エラー箇所を探すのに手間取っています。
>
> 素人質問で申し訳ありませんが、返信頂けると助かります。
>
> Clean: Deleting intermediary and output files.
> Clean: Done.
> Executing: "C:\Program Files\Microchip\mplabc18\v3.42\bin\mcc18.exe" -p=18F2620 "Test06.c" -fo="Test06.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
> C:\Users\PIC\PIC Program\Test06_USART\Test06.c:40:Error: syntax error
> Halting build on first failure as requested.
> ----------------------------------------------------------------------
> Release build of project `C:\Users\PIC\PIC Program\Test06_USART\Test06.mcp' failed.
> Language tool versions: mpasmwin.exe v5.45, mplink.exe v4.43, mcc18.exe v3.42, mplib.exe v4.43
> Wed Dec 24 17:05:58 2014
> ----------------------------------------------------------------------
> BUILD FAILED
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: PIC18Fシリアル通信について
48
: 14/12/24-18:00
avo <kazuchiyo@hotmail.com>

PIC入門者 様

色々ご苦労されているようなので、少しご提案があります。
コンパイラの使い方もまだ慣れていないようですので
今使っている内蔵モジュールを入出力だけにして
スイッチ入力とLEDの点滅・点灯動作から始めた方が良いかと思いますが・・・?

コーディングやコンパイラの設定が最小限に抑えられるので
間違いが探しやすいと思います。
LEDの点滅・点灯動作が出来るようになれば、プログラムコードの中に
LEDの制御コードを入れてデバッグツールとして使えるようになります。

次にLCDの制御が出来るようになれば、ADCの値やUARTの送受信データーを
LCDに表示できるようになるので、デバッグも効率よく出来るようになると思います。

私はいつもLEDの点滅・点灯制御を作ってから色々な制御をするようにしています。
面倒なようですが色々なエラーが重なっている場合は、この方法が一番早道だと思います。
▲pagetop

- WebForum -