H8Sマイコンでprintfを複数ポートで使いたい

このQ&Aのポイント
  • H8S2368マイコンを搭載した基板で、複数のポートでprintfを使用したい場合のプログラミング方法について教えてください。
  • 現在UARTのSCI0ポートが未使用の状態であり、このポートにWiFiモジュールのESP-WROOM-02を接続したいと考えています。しかし、printf関数は現在SCI1ポート専用となっています。どのようにしてプログラムを変更すれば良いでしょうか?
  • console.c内で宣言したcharput、charget関数はlowsrc.cで使用されています。具体的なプログラムの修正方法を教えてください。
回答を見る
  • ベストアンサー

H8Sマイコンでprintfを複数ポートで使いたい

現在H8S2368マイコンを搭載した基板のプログラムのデバッグなどを行っています。 このボードではマイコンのUARTのSCI1をRS-232Cポートとして使用しており、外部ユニットに接続したりデバッグ時にはプログラム内にデバッグ用に設置したprintfのキャラクタ出力用のポートとして使用しています。 現在UARTのSCI0ポートが未使用の状態で、このポートにWiFiモジュールのESP-WROOM-02を接続したいと考えております。 WiFiモジュールのESP-WROOM-02との通信はSCI0ポートを介するのでプログラミングではprintf関数を使うと思うのですが、現在printf関数で書かれたコードはSCI1ポート専用となっているのですが、 printf関数使用時にSCI0で出力するのか、SCI1で出力するのかを選択するにはどのようにプログラムしたらよいのでしょうか? なお、printfに関するプログラムはプロジェクト内のこれらのファイルで設定しています。 console.c lowsrc.c iodefine.h console.c内で宣言した”charput”、”charget”はlowsrc.cでしようされています。 どうぞ、ご教示の程よろしくお願い致します。 ------------------------(iodefine.hの内容)------------------------------------------------- #define CONSOLE_P SCI1 #define _CONSOLE_P _SCI1 -------------------------------------------------------------------------------------------------- -------------------------(console.cの内容)-------------------------------------------------- char charget(void); void charput(char); void PutStr(char *); #ifdef CONSOLE_DEBUG char charget(void) { char InputChar; while (CONSOLE_P.SSR.BIT.RDRF == 0) { /* ignore errors */ if ((CONSOLE_P.SSR.BYTE & ORER_FER_PER) != 0x00) CONSOLE_P.SSR.BYTE &= ~ORER_FER_PER; } InputChar = CONSOLE_P.RDR; CONSOLE_P.SSR.BIT.RDRF = 0; charput(InputChar); return (InputChar); } void charput(char OutputChar) { while ((CONSOLE_P.SSR.BIT.TDRE) == 0); CONSOLE_P.TDR = OutputChar; CONSOLE_P.SSR.BIT.TDRE = 0; } void charput_sci1(char OutputChar) { while ((CONSOLE_P_SCI1.SSR.BIT.TDRE) == 0); CONSOLE_P_SCI1.TDR = OutputChar; CONSOLE_P_SCI1.SSR.BIT.TDRE = 0; } void PutStr(char *str) { while (*str != '\0') charput(*str++); } #else char charget(void) { } void charput(char OutputChar) { } void PutStr(char *str) { } #endif --------------------------------------------------------------------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • tadys
  • ベストアンサー率40% (856/2135)
回答No.3

printf()とは別にprintf2()のような関数をデバッグ用に用意するほうが簡単です。 今あまり時間がないのでとりあえず関係ありそうなサイトを紹介しておきます。 http://www.mm2d.net/main/prog/c/printf-01.html わからないところは補足で質問してください。

techhouse
質問者

お礼

回答頂きありがとうございます。 やはり新しいprintfを自作するのが良い方法なのですね。printfはよく使うのでわかってるつもりでしたが、紹介頂いたサイトでどういうふうにできているのかというのは初めて知りました。

その他の回答 (4)

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.5

No.3です。 SCI0ポートはESP-WROOM-02用に、SCI1ポートはデバッグ用に分けて使用するものとします。 使い分けるには次のようにします。 fprintf( stdout, const char *format , ... );をESP-WROOM-02用に fprintf( stderr , const char *format , ... );をデバッグ用に使います。 fprintf( stdout, const char *format , ... );はprintf()を使うことが出来ます。 ただし、_SINT write()のなかではstdout、stderrの切り替えが行われていないので、その部分は自分で作る必要が有ります。 元のソースでは、二つのポートcharput(c);、charput_sci1(c);に同じ文字を同時に出力するようになっています。 質問とは直接関係ないのですが、SCIポートによる通信は遅いので割り込みを使わないとCPU時間が無駄に使われてパフォーマンスが低下します。 割り込みを使う方法をお勧めします。 こちらを参考にしてください。 http://hirose.sendai-nct.ac.jp/~ckuma/micom/3664/exsci.html#2-5

techhouse
質問者

お礼

回答頂きありがとうございます。 SCIポートの割り込み制御などもいろいろと調べていきたいと思います。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.4

補足を見ました。 lowsrc.cは低水準入出力関数が定義されているようですね。 printf()で出力先をSC0にするかSCI1にするかを選べるようにするにはprintf()関数自体を改造してfprintf()関数のようなものにする事になるかと思います。 もしくは、printf()を実行する前に出力先を指定する関数(自作することになります)を実行するようにし、printf()では出力先を固定しないような改造をする、といったことも考えられます。 いずれにしても標準ライブラリで提供されているprintf()もしくはそこから呼ばれている低水準入出力関数に手を加えることになり、他の関数への影響があるかもしれません。 そういう訳で、他の回答者様のご意見にあるように、printf()と同等の機能でSCI0に出力する新たな関数を作ったほうが結局は手っ取り早くて他の関数等に影響を及ぼさず安全なのかなと思いました。

techhouse
質問者

お礼

回答頂きありがとうございます。 もともと初期状態で用意されているprintfを改造するというのは、少し自分には難しいのではと思うので、自分で追加できるならそれで済ましたいと思っています。 こちらのサイトなどでもH8マイコンに自作のprintfを追加する方法などが掲載されていたり、いろいろと方法があるようなので、やってみるつもりです。 イチから作って丸ごと学ぶ! H8マイコン道(12):シリアル通信でオリジナルprintf関数を作ろう (3/3) - MONOist(モノイスト) http://monoist.atmarkit.co.jp/mn/articles/1003/26/news096.html

  • skp026
  • ベストアンサー率45% (1011/2238)
回答No.2

標準ライブラリ構築ツールを確認すると良いと思います。 でも標準のcからして、入出力の切り替えなん て考慮してないのでは?なんて思っちゃいます。 また、大規模な拡張になる気がするので、 全体の動作もかわらないか心配です。 私もH8のプログラミング経験があるだけで、 リアルタイムOSは導入したことないんです。 ROMもRAMも基本キツキツなので、全てアセンブラで自作してました。 私の師匠は使ったことあるみたいでした。 あと、ルネサスで用意してるフォーラムを利用した方が、 情報集めやすいかもしれないです。 役にたたなくてごめんなさい。

techhouse
質問者

お礼

回答頂きありがとうございます。 現在デバッグを行っているボードでは確かにマイクロOSを搭載しています。プログラミング領域はまだ余裕があるようなのですが、グローバル変数を管理しているRAM領域がかなりキツキツみたいで、以前LCD画面表示のデバッグでいろいろとプログラムを追加している時にオーバーしているとの警告が出てきたことがあり、mapファイルでそれが分かったことがありました。 次回プログラム修正などでの追加は無理かなぁ・・・ みたいな感じで思ってたので今回とても心配です。 ルネサスさんのサイトだとより詳細な感じもするので、活用させていただきます。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.1

ちなみにlowsrc.cはどのようなソースでしょうか。printfとcharget,charputの関係性がよくわからないので補足いただけると何かわかるかもしれません。

techhouse
質問者

お礼

回答頂きありがとうございます。 現在のlowsrc.cのファイルを下記のサイトに置かせていただきました。 https://github.com/KenjiMaehara/ios_apply_test/tree/20150720_test/H8S2368_console/console ご確認頂き、ご指摘頂きますようよろしくお願い致します。

関連するQ&A

  • H8S 調歩同期通信のデータ送信ができない

    ルネサスのCPU H8S2378 を使用してプログラムを組んでいるのですが、 どうしても調歩同期式通信によるデータの送信が上手く行きません。 自分でマニュアル等を調べているのですが、原因が分からず困っています。 どなたか、アドバイス頂けないでしょうか。 以下に現状の動作とソースを記述致します。 プログラムがスタートすると、 ポート割り込みなどの初期設定を行い、 無限ループに入り、LEDの点滅とデータ'A'の送信を繰り返すことを 意図して記述しました。 しかし、実際にはLEDの点滅、データ送信は行われず、 SCI1.TDR = data; で送信するデータをセットして、 SCI1.SSR.BIT.TDRE = 0x00; で送信フラグのクリアをした後、 送信フラグ(TDRE)がセットされていないようで 2ループ目のwhile( SCI1.SSR.BIT.TDRE == 0x00 );のところで 止まっているようです。 送信動作の確認は、PCに接続してteratermで行ったのですが、 データが入ってきていないようで、オシロスコープでTXD1のポートを当たったのですが、データは全く出力されていないようです。 /*初期化部分*/ void h8_sciinit( void ){  SCI1.SCR.BYTE = 0x00;  /* 内部クロック/SCK*/  SCI1.SMR.BYTE = 0x00;  /* 調歩同期式モード*/              /* データ長:8ビット*/              /* バリティ:なし*/              /* ストップビット:1ビット*/              /* 内部クロック:Φクロック*/  SCI1.BRR = 0x6A;//106  /* ビットレート設定(9600bit/s)*/  for(i = 0;i < 0xFFFF; i++);/*待ち*/  SCI1.SCR.BYTE = 0x30; /* RE,TE->1送受信を許可*/  SCI1.SSR.BYTE; /* ダミーリード*/  SCI1.SSR.BYTE = 0x80; /* エラービットをクリア*/ } /* 送信部分 */ void SCI1_SendData( char data ) { while( SCI1.SSR.BIT.TDRE == 0x00 ); /*未送信データが送られるまで待つ */ SCI1.TDR = data; /* 送信データのセット*/ SCI1.SSR.BIT.TDRE = 0x00; /* 送信フラグのクリア*/ } /* Main関数 */ void Main(void) { GA_Port_init(); //各GAのポートを初期化 INT_INIT(); /* 割り込みの初期設定 */ ipr_register_set(); /* 割り込み優先順位レジスタ 設定 */ DEBUG_LED1 = 0x01; /* デバッグLED設定 */ DEBUG_LED2 = 0x01; /* デバッグLED設定 */ DEBUG_LED3 = 0x00; /* デバッグLED設定 */ DEBUG_LED4 = 0x00; /* デバッグLED設定 */ h8_sciinit(); /* SCI初期設定 */ while(1){  SCI1_SendData( 'A' );  wait();  DEBUG_LED2 = ~DEBUG_LED2 ;  } }

  • H8マイコンのシリアル通信について。

    H8マイコンでのシリアル通信についてお聞きしたいことがあります。 現在PCとマイコン(H8/3052F)をRS32Cでシリアル通信ができています。 今回は有線ではなく無線(Bluetooth)を利用してシリアル通信が行いたく、RBT-001というものを購入しました。 そのマニュアルには一番簡単に通信する方法としてPICマイコンとの例が挙げられており、要するに初期設定さえすれば無線を意識せずに使えるとの事だったのですが、どうも出来ていないみたいです。 --------------------私のプログラム---------------------- #include<3052.h> void initSCI1 (void){ int i; SCI1.SCR.BYTE = SCI1.SMR.BYTE = 0;//初期値は0、本文参照 SCI1.BRR = 80; //ビットレート for (i = 0; i <4000; i++) ; //待つ SCI1.SCR.BYTE = 0x30; //受信割り込み許可、送受信許可 SCI1.SSR.BYTE; //ダミーリード SCI1.SSR.BYTE = 0x80; //エラーフラグクリア } //1文字受信 char SCI1_IN_d(void){ //受信文字を返す。 unsigned char c; //受信データの格納変数 while (!(SCI1.SSR.BYTE & 0x78)); //受信またはエラーフラグが立つまで待つ if (SCI1.SSR.BIT.RDRF == 1) { //受信完了なら c = SCI1.RDR; //データを取り出す。 SCI1.SSR.BIT.RDRF = 0; //受信フラグクリア } else { SCI1.SSR.BYTE &= 0x80; //エラーならエラーフラグクリア c = 0; } return c; } //1文字送信 void SCI1_OUT_d(char c) //文字コードを受け取る。 { while (SCI1.SSR.BIT.TDRE == 0); //0でデータあり、1になるまで待つ。 SCI1.TDR = c; //受け取った文字を送信 SCI1.SSR.BIT.TDRE = 0; //TDREビットをクリア } //BLUETOOTH初期設定 void BT_Init(void){ SCI1_OUT_d(0x02); SCI1_OUT_d(0x52); SCI1_OUT_d(0x4E); SCI1_OUT_d(0x01); SCI1_OUT_d(0x00); SCI1_OUT_d(0xA1); SCI1_OUT_d(0x03); SCI1_OUT_d(0x03); return; } int main (void){ unsigned char rd; BT_Init(); initSCI1(); while(1){ rd=SCI1_IN_d(); SCI1_OUT_d(rd); } } ------------------------------------------------------------ 問題はmain文中「initSCI1();」でSCI1を初期化するとズット変な文字化けみたいなのを延々と吐き出して、逆に初期化しないとPCでなんらかのキーを押すとRBT-001は点滅はするけど、文字を返してこないという状況です。 なので「initSCI1();」がおかしいのかと思うのですが、有線では現にこれで出来ているのでなにが原因かわかりません。 良かったらどこがダメでどうするべきか教えてください。 本当に困っています。よろしくお願いします。 通信速度9600bps データ長8ビット長 ストップピット1 パリティ無 CPU最高動作周波数25MHz -------------------RBT-001マニュアルに記載されているサンプルプログラム------------------------- char text; void BT_Init(); void MPU_Init(); int TRISB,ANSEL,ANSELH; int _LCD_FIRST_ROW,_LCD_CURSUR_OFF,_LCD_CLEAR; void main(){ MPU_Init(); BT_Init(); while(1){ if(Uart1_Data_Ready()){ text = Uart1_Read(); Uart1_Write(text); Lcd_Chr_Cp(text); } } } void MPU_Init(){ TRISB = 0; ANSEL = 0; ANSELH = 0; Uart1_init(9600); Lcd_Init(); Lcd_Cmd(_LCD_FIRST_ROW); Lcd_Cmd(_LCD_CURSUR_OFF); Lcd_Cmd(_LCD_CLEAR); return; } void BT_Init(){ Uart1_Write(0x02); Uart1_Write(0x52); Uart1_Write(0x4E); Uart1_Write(0x01); Uart1_Write(0x00); Uart1_Write(0xA1); Uart1_Write(0x03); Uart1_Write(0x03); return; } -------------------------------------------------------------------

  • H8Sマイコンに新規printfを追加でエラー

    前回、 http://okwave.jp/qa/q9191153.html こちらのサイトでH8S2368にprintfを追加したい内容の質問をした時の続きです。 現在、 イチから作って丸ごと学ぶ! H8マイコン道(12):シリアル通信でオリジナルprintf関数を作ろう (3/3) - MONOist(モノイスト) http://monoist.atmarkit.co.jp/mn/articles/1003/26/news096.html こちらのサイトの内容を参考に、printfのサンプルコードを追加してみました。 https://github.com/KenjiMaehara/ios_apply_test/blob/20150720_test/H8S2368_console/console/console.c しかし、コード追加後にコンパイルを実施すると次のようなエラーが発生します。 (コンパイルエラー内容) HMAKE MAKE UTILITY Ver. 2.1.00.000 Copyright (C) 2001,2006 Renesas Technology Europe Ltd. Copyright (C) 2001,2006 Renesas Technology Corp. and Renesas Solutions Corp. Executing Hitachi H8S,H8/300 C/C++ Library Generator01 phase set CH38TMP=C:\Users\KMAEH_~1\AppData\Local\Temp set PATH=c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\bin set CH38=c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\include Executing Hitachi H8S,H8/300 C/C++ Compiler02 phase "c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\bin\ch38.exe" -ws=C:\Users\KMAEH_~1\AppData\Local\Temp\hmk6689.tmp Executing Hitachi H8S,H8/300 Assembler03 phase Executing Hitachi OptLinker04 phase "c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\bin\LnkSpawn.exe" -subcommand=C:\Users\KMAEH_~1\AppData\Local\Temp\hmk6A82.tmp ** L2310 (E) Undefined external symbol "_mprint_test_sci1" referenced in "..\myproject\obj\main.obj" Optimizing Linkage Editor Abort ERROR: Process failed with return code: 1 mprint_test_sci1という関数の宣言は #include "all_includes.h" こちらのヘッダーファイルに (all_includes.hの内容の一部) extern void outs_sci1(char *, short); extern void outc_sci1(char, short); extern void outn_sci1(char, unsigned long, short); extern void mprint_test_sci1(char *fmt, ...); extern void charput_sci1(char OutputChar); このような形で宣言しています。 しかし、エラーが出てくるのですが、これをどのように解決すればよいのかご教示頂きますよう、よろしくお願い致します。

  • H8/36064を使ったシリアル通信について

    今学校のほうでH8/36064をつかってA/D変換したデータをPCに送るためのプログラムを作っているのですが、取り込んだデータをシリアル通信を使ってPCに送るとどうしても文字化けしてしまいます。 だめな原因などを教えていただけないでしょうか。 /*プログラム*/ #include "iodefine.h" #include <machine.h> //割り込みマスクビット変更関数set_imask_ccr()を              //使用するためのインクルードファイル #include <stdio.h> void main(void) { while(1){ if(AD.ADCSR.BIT.ADF == 1) Getad(); } } init() //A/D変換およびタイマV初期設定用関数 { set_imask_ccr(1); //割り込み禁止設定 AD.ADCSR.BIT.SCAN = 1; AD.ADCSR.BIT.CH = 101; TV.TCRV1.BIT.ICKS = 0; TV.TCRV0.BIT.CKS = 3; //Φ/128 TV.TCORA = 115-1; //コンペアマッチAの値 TV.TCRV0.BIT.CCLR = 1; //タイマカウンタクリア TV.TCRV0.BIT.CMIEA = 1; //割り込み発生フラグ設定 set_imask_ccr(0); //割り込み禁止解除 } void Sci3() //シリアル通信設定 { unsigned int dmy; IO.PMR1.BIT.TXD = 1; //TXD端子使用設定 SCI3.SCR3.BYTE = 0; //SCR3クリア SCI3.SMR.BYTE = 0; //SMRフォーマット設定 SCI3.BRR = 47; //9600bps for(dmy = 280;dmy > 0;dmy--); SCI3.SCR3.BIT.TE = 1; //送信動作許可 } void sendCharSCI(char data) //データ送信設定 { while(SCI3.SSR.BIT.TDRE==0); //トランスミットデータレジスタエンプティが真になるまで待機 SCI3.TDR = data; //トランスミットデータレジスタに送信データ(8bit)をセット SCI3.SSR.BIT.TDRE = 0; //「送信中」フラグを立てる return; } void print(char *str) { while(*str !='\0') { sendCharSCI(*str); str++; } return; } Getad() { volatile unsigned int *data = (unsigned int *)0xfa00; volatile unsigned int *data2 = (unsigned int *)0xfa10; *data =AD.ADDRA; *data = *data >> 6; //右に6bitシフト *data2 =AD.ADDRB; *data2 = *data2 >> 6; //右に6bitシフト AD.ADCSR.BIT.ADF = 0; AD.ADCSR.BIT.ADST = 0; Sci3(); // SCI3初期化 sendCharSCI(*data); sendCharSCI(*data2); } #pragma interrupt (TimerV(vect=22)) //割り込み処理関数としてTimerVを宣言 void TimerV(void) { static int count; //20000回(0.1秒)ごとにGetad // コンペアマッチフラグを0に戻し、次のコンペアマッチに備える。 TV.TCSRV.BIT.CMFA = 0; if(count<100) count++; else { count = 0; AD.ADCSR.BIT.ADST = 1; //AD変換開始 } }

  • printfが!

    int main(void){ .... while(!(i==EOF)){ num=0; while((i=fgetc(stream))!='\n'){ if(i==EOF) break; str[num]=i; num++; } kannsuu1(); kannsuu2(); } return 0; void kannsuu1(void){ printf("出力されない"); for(i=0;str[i]!=NULL;i=i+2){ printf("%c%c",str[i],str[i+1]);/*これも出力されない*/ } } void kannsuu2(void){ .... } 簡単に上記のように記述したプログラムがあるのですが、コンパイラの警告はまったくかかりませんでしたが、関数の中のprintfがdosプロンプトに出力されないのですよ。だれか心あたりがありましたらおしえてもらえないでしょうか? お願いいたします。

  • H8-3052Fを用いた文字列の受信

    私は現在、H8-3052Fを用いて別の回路と画像データなどを送受信するソフトをGCC-Developpers Liteを用いて作っています。 H8-3052Fを用いてunsigned char型の文字列をRS-232Cで受信して、配列に格納する方法を教えて下さい。 現在は下記の1文字受信関数を用いていますが、うまく出来ません。 Main文では常に文字列受信を待っている状態で、またITU割り込みで1秒ごとに別の処理が走るようにしています。 char SCI1_IN_d(void) //受信文字を返す { char c; //受信データ格納変数 while (!(SCI1.SSR.BYTE&0x78)); //受信もしくはエラーフラグが立つまで待つ if(SCI1.SSR.BIT.RDRF==1) //受信完了でRDRF=1 { c=SCI1.RDR; //データ取り出し SCI1.SSR.BIT.RDRF=0; //受信フラグクリア } else { //受信完了していないならRDRF=0 SCI1.SSR.BYTE&=0x80; //エラーならエラーフラグクリア c=0; } return c; //受信文字を返す } 以上です。 何分素人なので解りかねることがあると思いますが、宜しくお願い致します。

  • H8SマイコンでUARTを115.2kに設定したい

    現在、H8S2368マイコンとwifi通信モジュールであるESP-WROOM-02をUART通信で接続するためにプログラムを作成しています。 H8S2368のSCI0のUARTでESP-WROOM-02とをつなぎました。 とりあえずSCI0から”AT”というコマンドを出したのですが、wifiモジュールから”OK”という回答が戻ってきません。 原因を調べてみると、H8S2368のSCI0は38.4kbpsで出力していて、ESP-WROOM-02は初期通信速度が115.2kで速度があっていないことが判りました。 とりあえずH8S2368のSCI0を115.2k変更したいのですが、どのようにすれば115.2kbpsに変更できるのか教えていただきますよう、よろしくお願い致します。 現在のSCI0のUARTに関する設置はこちらです。 (hwsetup.c) SCI0.SCR.BYTE = 0x00; SCI0.SMR.BYTE = 0x00; SCI0.BRR = 15; for(i=0;i<30000L;i++); /* Async, 8-data, odd-parity, 1-stop, N-multi, CLK */ SCI0.SCR.BIT.TE = 1; /* Transmit Enable */ SCI0.SCR.BIT.RE = 0; /* Receive Enable */ SCI0.SCR.BIT.RIE = 1; /* Receive Interrupt */ SCI0.SCR.BIT.TIE = 0; /* Transmit-data-empty Interrupt */ SCI0.SCR.BIT.TEIE = 0; /* Transmit End Interrupt */ SCI0.SSR.BIT.TDRE = 0; /* Clear TDR Empty flag */ H8S2368のデータシートを見ていると、 SCI0.BRR = 15; このBBRレジスタに代入する値をもう少し下げていけば115.2kHzに近づいていくのかなぁ、と感じるのですが、正確な計算方法など教えていただけると助かります。

  • Aki-h8/3052マイコンについて

    今Aki-h8/3052マイコンを勉強しているのですが、初心者のためうまくいかず質問をしました。知識がないと思われるような質問をしてしまいますが、よろしくお願いします。 次のようなプログラムを書き込んで、LEDを点滅させたいのですが点滅しません。原因がわからないので、教えていただける方がいたらよろしくお願いします。 #define P5DDR (*(volatile unsigned char*)0xffffc8) #define P5DR (*(volatile unsigned char*)0xffffca) void wait (long loop){ while(loop--); } int main(void){ P5DDR = 0xff; while(1){ P5DR = 0xff; wait(200000); P5DR = 0; wait(200000); } } ポートBを使用した場合うまくいくのですが、ポート5を使用するとうまくいきません。 コンパイラにはGDLを、書き込みにはH8Write Turboを使用しています。

  • C言語について

    2つの文字列を入力して別の文字列にコピーするプログラムをつくっているのですが、どこが間違っているのでしょうか?教えていただけませんか? /*文字列連結*/ void *my_stract(char*, char*, char*); void main(void) { char bun1[100],bun2[100],bun3[200]; printf("文字列1を入力してください\n"); gets(bun1); printf("文字列2を入力してください\n"); gets(bun2); my_stract(bun1,bun2,bun3); puts(bun3); } char *my_stract(char *str3, char *str2, char *str1) { char *p1, *p2, *p3; p1=str1; p2=str2; p3=str3; while(*p1) { *p3=*p1; p1++; p3++; } while(*p2) { *p3=*p2; p2++; p3++; } *p3='\0'; return str3; }

  • H8/36064のAD変換データの文字列化について

    たびたびの質問失礼いたします。 前回シリアル通信によって文字化けがおきることについて質問させていただいたものです。 前回の質問後、10ビットのA/D変換データを文字列に置き換える方法を調べstatic void uint2Hex()によって文字列に置き換えを行っているのですがまだうまく解消できませんでした。 申し訳ないのですが再び助言をいただけないでしょうか。 H8/36064を使用しTera Termに取り込むことで確認を行っています。 ボーレートなどのシリアル通信の設定はマイコン側、Tera Term側であわせてあります。 #include "iodefine.h" #include <machine.h> //割り込みマスクビット変更関数set_imask_ccr() を使用するためのインクルードファイル #include <stdio.h> void main(void) { init(); while(1){ if(AD.ADCSR.BIT.ADF == 1) Getad(); } } init() //A/D変換およびタイマV初期設定用関数 { set_imask_ccr(1); //割り込み禁止設定 AD.ADCSR.BIT.SCAN = 1; AD.ADCSR.BIT.CH = 101; TV.TCRV1.BIT.ICKS = 0; TV.TCRV0.BIT.CKS = 3; //Φ/128 TV.TCORA = 115-1; //コンペアマッチAの値 TV.TCRV0.BIT.CCLR = 1; //タイマカウンタクリア TV.TCRV0.BIT.CMIEA = 1; //割り込み発生フラグ設定 set_imask_ccr(0); //割り込み禁止解除 } void initSCI3(void) //シリアル通信設定 { unsigned int dmy; IO.PMR1.BIT.TXD = 1; //TXD端子使用設定 SCI3.SCR3.BYTE = 0; //SCR3クリア SCI3.SMR.BYTE = 0; //SMRフォーマット設定 SCI3.BRR = 47; //9600bps for(dmy = 280;dmy > 0;dmy--); SCI3.SCR3.BIT.TE = 1; //送信動作許可 } void rs_putc(char c) //1文字送信 { while(SCI3.SSR.BIT.TDRE == 0); //トランスミットデータレジスタエンプティが真になるまで待機 SCI3.TDR = c; //トランスミットデータレジスタに送信データ(8bit)をセット SCI3.SSR.BIT.TDRE = 0; //「送信中」フラグを立てる } void rs_puts(char *st) //文字列送信 { while(*st != 0){ rs_putc(*st); st++; } } static void uint2Hex(unsigned long n, short upper, char *buf) { char c; char a = 'a'; short len = 0; short i, half; if(upper) a = 'A'; // 大文字/小文字の設定 // 16進文字列へ変換し文字数をカウント do{ i = n & 0x0F; if(i > 9) buf[len] = (unsigned char)(i + a - 10); else buf[len] = (unsigned char)(i + '0'); len++; n >>= 4; }while(n != 0); half = len >> 1; // 文字の並び順を直す for(i=0; i < half; i++){ c = buf[i]; buf[i] = buf[(len-1)-i]; buf[(len-1)-i] = c; } buf[len]='\0'; // 終端コードの挿入 } Getad() { volatile unsigned int *data = (unsigned int *)0xfa00; volatile unsigned int *data2 = (unsigned int *)0xfa10; initSCI3(); // SCI3初期化 *data =AD.ADDRA; *data = *data >> 6;//右に6bitシフト *data2 =AD.ADDRB; *data2 = *data2 >> 6;//右に6bitシフト rs_putc(*data); rs_putc(*data2); AD.ADCSR.BIT.ADF = 0; AD.ADCSR.BIT.ADST = 0; } #pragma interrupt (TimerV(vect=22)) //割り込み処理関数としてTimerVを宣言 void TimerV(void) { static int count; //20000回(0.1秒)ごとにGetad // コンペアマッチフラグを0に戻し、次のコンペアマッチに備える。 TV.TCSRV.BIT.CMFA = 0; if(count<100) count++; else { count = 0; AD.ADCSR.BIT.ADST = 1; //AD変換開始 } }

専門家に質問してみよう