usartによるpic18fからpic16fへのデータの受け渡しについて

このQ&Aのポイント
  • pic18f2680からpic16f690へデータを渡すためにusartを使用して行おうとしていますがうまくいきません。
  • 送信側で指定したデータが受信側で正しく表示されない問題が発生しています。
  • printfなどの書式を変えても問題が解決せず、原因が分からない状況です。
回答を見る
  • 締切済み

usartによるpic18fからpic16fへの…

usartによるpic18fからpic16fへのデータの受け渡しについて いつもお世話になります。 pic18f2680からpic16f690へデータを渡すためにusartを使用して行おうとしていますがうまくいきません。 送り側(18f2680)で i=3 itoa(i,f);//int f,char i putsUSART(f); 上記のように送信し, 受け側(16f690)で     c= getc();//int c printf("%u",c); と、受けたところ000000000000000000000000510と表示されてしまいます。 printfなどの書式を変えても問題が治りません。 どなたかお詳しい方がいらっしゃいましたらご教授よろしくお願い致します。

noname#230358
noname#230358

みんなの回答

noname#230359
noname#230359
回答No.2

http://ftc.suki.net/tpb/saruc07.html#4-6 返ってくる あたいは ポインターなので 510番地 に 文字列"3"が返ってきてるはずです ついでに itoa(i,f);//int f,char i となってますが char *itoa(int,char *,int); ' それぞれを第一引数・第二引数・第三引数という。 int型の数値を文字列へ変換する。 引数?は変換するint型の数値。 引数?は変換した文字列を格納するメモリ上の先頭アドレス(変換したものを代入する対象)。 引数?は何進数で変換するかを指定する(2なら2進・8なら8進・10なら10進数で変換する)。 戻り値は?のアドレス。 となっているので 受け渡しが逆では? 方言の可能性もあるのでマニュアル参照 まあ、書きながらなんとかわかってきた そもそも、プログラム的におかしいんだ まあ、ここんとこ "C" なんか 使ってないので 忘れがちですが itoa は 数値を 文字列に変換する ものです 例えば 数値 100 を 入れると 文字列には "1"+"0"+"0"+"終末文字" が代入されます ↑ 18f2680 上のあるメモリ上のアドレス ← ポインタ 送信しているのは そのポインター を送っています 16f690 に送られてくるのは 18f2680に "1"+"0"+"0"+"終末文字" と書かれている アドレス 16f690 には そもそも そのアドレスには なにも書きこまれていないので 無意味な数値 000000000000000000000000510 が 返ってきてます まあ、ほかにも 突っ込みどころ満載なんだが プログラム的に 文字列送っているのに 受取側は数値で受け取ってるし まあ、itorで文字列に変換せず そのまま数値で送ったほうがいいと思いますよ

noname#230358
質問者

お礼

ご回答ありがとうございます。 >>返ってくるあたいはポインターなので とありますが、変数が入っているメモリのアドレスが返ってくるということなのでしょうか? ポインタについてあまりよく理解できていないのですが、PIC間通信をする場合にはどのようにプログラムを書けばよいのでしょうか?(microchipのC18コンパイラを使用しています。) また、itoaですが、putsUSARTで変数を送ろうとした場合に数値の変数をそのまま送ろうとした場合に送れなかったため、itoaで一度変換してから送信しました。数値をそのまま送るようなことは無理なのでしょうか?

noname#230359
noname#230359
回答No.1

毎度JOです。 問題を切り分けて見ましょう、投稿内容では判断出来かねます 先ず送信出来ているかの確認からです、 USARTですからインターフェースIC等を挿入しRS232Cに変換すれば、 パソコン等で送信内容が確認出来ます この様な検証手段を用意して始める事が必要ですね USART通信でインターフェースICを使用せずに基板内通信でしょうか? 16f690のデーターシートは熟読されましたか?  Config等以外な落とし穴を読み飛ばしている可能性もあります ハードウエア上では 18f2680  16f690 RC6 ― RC7 RC7 ― RC6 GND ― GND 投稿内容に情報が少ないですね、出来る範囲で開示した方が問題解決の近道です

noname#230358
質問者

お礼

ご回答ありがとうございます。 パソコンに送信して確認はしています。 18f2680→PCでは問題なく送信できています。 18f2680→16f690→PCのときに、数値がおかしくなってしまいます。 よろしくお願い致します。 pic同士は直接配線しています。 18f2680のC6(TXピン)を16f690のB5(RXピン)に接続後、 16f690のB7(TXピン)とデバック用のPCはRS232の変換ICを経由して接続してデータを送っています。 gndは共通です。 18fからPCまたは16fからPCでは問題なく送信できます。 ためしに16fから16fでも行ってみましたが、こちらはうまくいきませんでした。 (数値で2とおくると50と表示されました。)

関連するQ&A

  • PICでUSARTとステッパのドライブ方法について

    PIC16F873を使用して、USARTでデータを送受信しながら、ステッピングモータをドライブしたい。 ステッピングモータのドライブ用にTIMER0の割込みを使用すると、USARTの割込みができず。   USARTで送受信しながら、ステッピングモータドライブ用に一定周期のパルスを 出力したいのですが、いい方法を教えてください。  ちなみにUSARTはステッピングモータをドライブするパラメータを送受信します。  PIC-Cを使用していますのでプログラムベース 大歓迎です。

  • picからpicへのデータ送信方法について

    pic16f690間でUSARTを使用して、データのやり取りを行おうとしています。 送信側から1~25の10進数を送信し、受信側で受けとった数値の回数の処理を行おうとしています。 コンパイラはCCS社のものを使用しています。 データ送信側は printf("%2x",送りたいデータ) 受信側は usart受信割り込みで  getc(受信したデータを入れる変数) 上記のようにコードを書いています。 しかし、受信側で正しい数値を受信できていないようです。 ただ単に1又は2桁の数値を受信する場合はどのようにすればいいでしょうか? よろしくお願い致します。

  • PIC18F2550でのUSARTの使い方について

    フリーのC18コンパイラで電子工作をしています。 今回18F2550でシリアル通信に挑戦していますが、自分の目的の動作のためのレジスタ設定が理解できません。教えて下さい。 動作内容はPICからシリアル通信でデータを送り12ビットシリアル-パラレル変換の「NJU3714」でシリパラ変換させることです。PICのデータ受信は今のところしないつもりです。

  • c18でのusart受信割り込み

    いつもお世話になっております。 pic18f14k50を使用して設計を行っています。 コンパイラはc18です。 usartで受信したときに割り込みを発生させ、規定の処理を実行したいのですが、割り込みが発生せずに困っております。 timer0を使用した割り込みの記述を行った場合は、割り込みは問題なく発生しました。 usart受信割り込みを以下のようなコードで行いたいのですが、間違いがわかる方がいらっしゃいましたら、ご指摘をお願い致します。 void main(){ TRISB=0x20; TRISC=0; OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,10);     IPENbits.IPEN=0; IPR1bits.RCIP=1; PIE1bits.RCIE=1; INTCONbits.GIE=1; while(1){ } } #pragma interrupt isr #pragma code isrcode = 0x08 void jump_isr(void){ _asm goto isr _endasm } #pragma code void isr(void){ //割り込み関数 if (PIR1bits.RCIF == 1){ PIR1bits.RCIF =0;         処理; } }

  • PIC16F877内蔵USARTが受信しない

    PIC16F877です。 [環境]  MPLAB IDE 6.6  CCS 3.15  WinXP sp3 送受信ピンは専用ピンに割り当て、内蔵USARTを使ってRS232C通信しています。 PICから相手機器にコマンド発行し、相手から応答データが帰ってきていますが、 kbhit()を確認してもHighになってくれません。 PIC入力ピンをオシロで当たって波形も確認済み、また信号ラインをシリアルモニタで 受信データラインを横取りして確認してもデータは正常に読み取れていますので、データは 正常だと思います。 同じような経験をお待ちの方はおられませんか? よろしくご教授、お願いします。

  • PIC、USART USART送信ができません

    下記のプログラムでUSART接続してPICマイコンからPCに送信しようとしています。 PICマイコンはP16F877 アプリにはTera Term というアプリケーションを使用しています。 このプログラムはUSARTの送信とステッピングモータを交互に動作させるプログラムです。 このプログラムを実行したところ、ステッピングモータが微小に動作したままとまってしまいました。 Tera Termにも文字は出力されませんでした。 そのため、1周目だけTXREGレジスタにデータを格納するところまでは出来ていると思います。 しかし、データ送信が行われないため、2週目以降はTSRレジスタがBUSY状態となりプログラムが進行しないのだと考えています。 以下のサイトを参考に模索しましたが、原因が分かりませんでした。 http://www.kimurass.co.jp/pic/0625p.htm http://www.picfun.com/pic19.html どのように対処したらよろしいでしょうか? 原因やアドバイスなど教えていただけたら幸いです。 ~~プログラム~~ list p=16F877 #include <p16F877.inc> __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF& _LVP_OFF w_temp EQU 0x0C status_temp EQU 0x0D ;変数 cblock 020h CNT15mS ;15mSカウンタ CNT5mS ;5mSカウンタ CNT1mS ;1mSカウンタ CNT50uS ;50μSカウンタ USART_TEMP ;USARTのワークレジスタ POINT ;point of table BUFFER ;buffer endc ;*************************割り込み退避************************** ORG 0x000 goto MAIN ORG 0x004 movwf w_temp movf STATUS,w movwf status_temp movf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie ;************************************************************* MAIN ;-----------------------------設定---------------------------- ;BANK1 Setting bsf STATUS,RP0 clrf TRISA movlw B'11110000' clrf TRISB movlw B'01000000' movwf TRISC ;RXピンを入力に設定 movlw B'00100000' movwf TXSTA ;SET TX MODE movlw 0FH ;Set Baud Rate 19Kbps movwf SPBRG ;Set BRG ;BANK0 Setting bcf STATUS,RP0 clrf INTCON movlw 07H movwf ADCON1 ;------------------------------------------------------------ ;----------------------------初期化--------------------------- clrf PORTA clrf PORTB bcf STATUS,C bcf STATUS,Z ;------------------------------------------------------------ ;===========================MAIN_LOOP======================== MAIN_LOOP bsf STATUS,RP0 READY_CHECK btfss TXSTA,TRMT goto READY_CHECK bcf STATUS,RP0 movlw 'A' movwf TXREG call STEPPING_MOTTER goto MAIN_LOOP ;============================================================ ;================= STEPPING MOTORE ========================== STEPPING_MOTTER call wait1ms call wait1ms movlw B'00000001' movwf PORTB call wait1ms call wait1ms movlw B'00000010' movwf PORTB call wait1ms call wait1ms movlw B'00000100' movwf PORTB call wait1ms call wait1ms movlw B'00001000' movwf PORTB RETURN ;================= 15mS WAIT ================================ wait15ms MOVLW d'3' MOVWF CNT15mS wait15ms_loop CALL wait5ms DECFSZ CNT15mS,F GOTO wait15ms_loop RETURN ;================= 5mS WAIT ================================= wait5ms MOVLW d'100' MOVWF CNT5mS wait5ms_loop CALL wait50us DECFSZ CNT5mS,F GOTO wait5ms_loop RETURN ;================= 1mS WAIT ================================= wait1ms MOVLW d'20' MOVWF CNT1mS wait1ms_loop CALL wait50us DECFSZ CNT1mS,F GOTO wait1ms_loop RETURN ;================= 50μS WAIT ================================ wait50us ; 1サイクル(4クロック):0.2μS ; 50μS=0.2μS×250サイクル MOVLW d'82' ;1 MOVWF CNT50uS ;1 wait50us_loop DECFSZ CNT50uS,F ;1 GOTO wait50us_loop ;2 RETURN ;2+1 ;============================================================ ;------------------------------------------------------------ END

  • PICのプログラムについて質問です

    使用するPICは16F84Aで、MPLAB IDEv8.88を使ってこのようなプログラムを作りました。 #include"pic.h" static void pic_init(); static void Delay_ms(unsigned char ms); static void Delay_1ms(); void main(){ pic_init(); while(1) { RB0 = 1 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); RB0 = 0 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); } static void pic_init() { // GPIO = 0b00000000; TRISA = 0xFF ; TRISB = 0x00 } static void Delay_ms(unsigned char ms) { unsigned char c; for (c=ms ; c>0 ; c--) { Delay_1ms(); } } static void Delay_1ms() { unsigned int cnt; unsigned int i; cnt = 76; for (i=0 ; i<cnt ; i++) { NOP(); } } ポートB0の出力を0から1にするプログラムなのですが、実行すると Error [314] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 52.24 ";" expected Error [254] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 77.0 undefined variable: "pic_init" ********** Build failed! ********** というエラーが出ます。このようなエラーが出る原因を教えて頂けないでしょうか。お願いします。

  • プログラミング教えてください!!!お願いします。

    プログラミング教えてください!!!お願いします。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) int func1(), func2(); int data = 100; main() { int w = 1; static x =10; printf("** %d, %d, %d\n" ,w,x,data); func1(); printf("** %d, %d, %d\n" ,w,x,data); } int func1(){ int w = 2; static int x = 20: printf("*** %d, %d, %d\n", w, x, data); x += 10; func2(); printf("*** %d, %d, %d\n" , w,x,data); x *= 2; data = data - x; } int func2() { int w = 3; static int x = 30; printf("**** %d, %d, %d\n" ,w,x,data); data -= x; } (2) int func1(char *, char *, char *); int func2(char *, char *, char *); main() { char sta[20], stb[20], stc[20], std[20]; int i=0; func1("abc","xyz",sta); printf("%d -- %s\n" ,++i,sta); func1("123","456",stb); printf("%d -- %s\n" ,++i,stb); func1(sta,stb,stc); printf("%d -- %s\n" ,++i,stc); func2(sta,stb,std); printf("%d -- %s\n" ,++i,std); } int func1(char *a, char *b, char *c){ while(*a) *c++ = *a++; while(*b) *c++ = *b++; * c = 0x00; } int func2(char *a, char *b, char *c){ int i = 0; while(*b){ if(i%2 == 0) *c++ = *a++; else *c++ = *b++; i++; } *c = 0x00; }

  • pic12f675の待ち時間関数について

    初めて質問します。 現在pic12f675で遊んでいるのですが、 http://homepage3.nifty.com/mitt/pic/picc/picc675_04_1.html にある、 // =================== 50uSウェイトルーチン =============== static void wait_50uS() { unsigned int cnt; unsigned int i; cnt = 2; for (i=0 ; i<cnt ; i++) { NOP(); } } の意味がわかりません。 特にfor (i=0 ; i<cnt ; i++) { NOP(); } の箇所です。 これでなぜ、50μsの待ち時間関数になるのでしょうか? どなたか答えてくれませんか?

  • PIC18Fで変数の受け渡しが出来ない

    次の環境でPICを動かしているのですが変数の受け渡しが出来ません。 お心当たりがありましたらご教授いただけないでしょうか。 現象 int val1,Val2; : val1 = 1;・・・・・(1) val2 = val1;・・・・(2) ※(1)ではval1に1が正しく入ります ※(2)でval2にval1の値(1)が正しく入りません ※(2)を「val2 = 1;」とするとval2に1が正しく入ります ※longや関数の戻り値「val=func();」なども(2)と同様に正しく入りません CPU:PIC18F66J15 コンパイラ:CCS ライター:MPLAB ICD2