PIC初心者用掲示板

★★ 質問する前に下記をチェック ★★
(PICに関する疑問は必ず解決するはず)
←←←「電子工作の実験室」へ
←←←← 

■最新ツリー一覧

□このツリー付近のツリー一覧

★新規ツリー作成

◆ 9843. PIC間通信 [ユッケ2006/03/09 12:06


9843. PIC間通信 [ユッケ2006/03/09 12:06
RS232CインターフェースIC(ADM3202AN)を使ってPIC間のデータのやり取りをしたいのですが、パソコン-PIC間では正常に動作しますが、PIC-PIC間で行うとまったく動きません。PICはそれぞれ16F873でADM3202はそれぞれPICのUSARTピンにつないでいます。
根本的に間違っているかも知れないですが、組んだプログラムの流れは次のとおりです(CCS社のPCMでC言語で組んでいます)。
・送信側
1送る変数の値(4桁)の1桁ずつをbuffer[0]〜[3]の配列に割り振る。
2putc('S'); で変数の開始記号を送信。
3for(i=0 ; i>3 ;i++)
{ putc(buffer[i]) ;
delay_us(500);
} 4桁を送信

・受信側
USARTの受信割り込みで読み取ります。
1data=getc(); でdataに1桁受信
2if(word=='n' && data=='S')
word='s'; nだったwordをsに変える。
3if(word=='s'){
buffer[i]=getc();
i++;
if(i>3) {
hensu=buffer[0]*1000+buffer[1]*100+buffer[2]*10+buffer[3];
i=0;
word='n';
}}
大体このような流れになっています。
クロックはセラロックで20MHz,通信速度は9600bpsです。何かアドバイスをいただければ幸いです。よろしくお願いします。

9844. Re: PIC間通信 [TAKI2006/03/09 12:46
>・送信側
>1送る変数の値(4桁)の1桁ずつをbuffer[0]〜[3]の配列に割り振る。
>2putc('S'); で変数の開始記号を送信。
>3for(i=0 ; i>3 ;i++)
> { putc(buffer[i]) ;
> delay_us(500);
> } 4桁を送信

4桁送信なら for(i=0; i<4; i++) か for(i=0; i=<3; i++) とすべきなのでは?

9862. Re: PIC間通信 [KB2006/03/10 18:49
>PICはそれぞれ16F873でADM3202はそれぞれPICのUSARTピンにつないでいます。

ADM3202って要らないよねぇ…
TxとRxをつなげば良いだけでは?

9864. Re: PIC間通信 [PICマスター2006/03/10 20:41
>ADM3202って要らないよねぇ…
>TxとRxをつなげば良いだけでは?
ですね。
こんなのを間に挟んじゃうと、昇圧した側で受けるPICはお亡くなりになっているんじゃないかな?

9874. Re: PIC間通信 [ユッケ2006/03/12 15:15
>4桁送信なら for(i=0; i<4; i++) か for(i=0; i=<3; i++) とすべきなのでは?
返信が送れてすいません。
自分の書いたソースをみたらi<4となっていましたので、この掲示板に書き込む際の打ち間違えでした、すいません^^;

9876. Re: PIC間通信 [ユッケ2006/03/12 15:23
>PICマスターさん、KBさん
ADM3202はいらないんですか?^^;;
C言語によるPICプログラミング入門を参考にしてるんですが、送り側のPIC+ADM3202と受け取り側のPIC+ADM3202で組んでみたんですが、この構成では無理なのでしょうか?っというのも5m以上の距離間での通信を想定しているのでADM3202を間に入れたのですが。

9877. Re: PIC間通信 [PICマスター2006/03/12 15:33
>というのも5m以上の距離間での通信を想定しているのでADM3202を間に入れたのですが。

「5m以上もの距離がある」のなら必要です。
文面からほぼ直結であると判断したのですが、そういう条件はきちんと書くべきです。でないと回答が変わりますので。

9878. 不具合判定方法 [Kazu2006/03/12 15:52
>ADM3202はいらないんですか?^^;;
必要だと思います。
1枚のボード内での通信などでは必要ないでしょうが
装置外の機器とやりとりする場合は、CPUのIOポートを直接出すのはおすすめできません。

PICマスターさんやKBさんが指摘しているのは、
複数の装置間の通信による制御で不具合があった場合
ソフト側の問題かハード側の問題かを見極めるのが
まず最初で大事だと言うことだと思います。

ADM3202を抜いてPICとつながっているピンをジャンパー線などでショートします。
・・・PICの送受信ポートが直結した状態になります。

簡単な送受信プログラムを組んで
データーが正常に受信できるかチェックすれば判断がしやすくなります。

単体で正常に動作確認後、実機をつないで通信をさせてみます。
・・・こんな風にすれば変な落とし穴に陥ることが少なくてすむと思います。

9879. Re: PIC間通信 [KB2006/03/12 17:47
>>PICマスターさん、KBさん
>ADM3202はいらないんですか?^^;;

ええと、PIC→ADM3202→PICと誤解してました…
PIC→ADM3202→ADM3202→PICってことなら、TXとRXを間違えていると思います。だからPIC→PICで接続したらどう?

9885. Re: PIC間通信 [恥ずかしいほどに初心者2006/03/13 10:18
私も以前同じような質問をさせていただきましたときは、
set_tris_c(0x80);
の設定値が
set_tris_c(0x00);
になっていて、通信が上手くいかない原因でした。
確認してみてはいかがでしょうか?

9886. Re: PIC間通信 [nyannnyannko2006/03/13 11:58

PORTC の bit7 と bit6 の TRIS の値は PIC のシリーズによって異なります。
いつもと違う PIC を 使う場合は事前にデーターシートで確認しておく事を
お勧めします。

9887. Re: PIC間通信 [初心者キング2006/03/13 13:31
>
>PORTC の bit7 と bit6 の TRIS の値は PIC のシリーズによって異なります。

横から質問ですみません。
例えばどのような品種でしょうか?
パッケージによって、RXD,RXDのピン配が異なるという意味でしょうか。
よろしければ、教えてください。

9889. Re: PIC間通信 [nyannnyannko2006/03/13 14:39

具体例としては下記の場合などが有ります。

PIC18F425 の 場合 DS39564B-page165 より抜粋
bit SPEN(RCSTA<7>) must be set(=1),
bit TRISC<6> must be cleared(=0),and
bit TRISC<7> must be set(=1).

PIC18F4620 の 場合 DS39626B-page201 より抜粋
bit SPEN(RCSTA<7>) must be set(=1)
bit TRISC<7> must be set(=1)
bit TRISC<6> must be set(=1)

9890. Re: PIC間通信 [ユッケ2006/03/13 14:49
説明不足でお手数おかけしてすいません。

9901. Re: PIC間通信 [初心者キング2006/03/14 03:17
>
>具体例としては下記の場合などが有ります。
>
>PIC18F425 の 場合 DS39564B-page165 より抜粋
>bit SPEN(RCSTA<7>) must be set(=1),
>bit TRISC<6> must be cleared(=0),and
>bit TRISC<7> must be set(=1).
>
>PIC18F4620 の 場合 DS39626B-page201 より抜粋
>bit SPEN(RCSTA<7>) must be set(=1)
>bit TRISC<7> must be set(=1)
>bit TRISC<6> must be set(=1)
>

ありがとうございました。18Fの場合ですね。16Fでは見たことなかったもので。
18Fは見たこともさわったことも無いですが、
品種によってTXDピンの方向設定が逆の場合もあるんですね。
ありがとうございました。