• ベストアンサー

C言語のプログラミングについて

マイコン内部のタイマーを使ってmainのプログラムにprintf文を記述することでteraterm上に1秒経過、2秒経過、3秒経過と表示させたいのですが、どのように表示させるのでしょうか? 10 [ms]ごとにタイマの割り込み要求を出すプログラムは作成したのですが、mainプログラムの表示のやり方がわかりません。 マイコンとパソコンの通信はできるようにしてあります。 回答お願いします。

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

  • ベストアンサー
回答No.2

「マイコンとパソコンは通信できるようになっている」のですよね。 これが具体的にはどういう通信なのかにもよりますが。 たとえば、putchar('A'); で、TeraTerm 側に、A が表示されるというようなものが準備できているということでしょうか。 さらに、10msごとに割り込みを発生させるプログラムは既に作成済みということですね。 だとすると、10msごとに、関数(下記の例では、void 10Int())を呼び出すことができます。 printf() で UART にデータを送る事ができるのであれば、下記のソースで良いかなと思います。 あと、TeraTerm で受けるとすると、"\n" じゃなくて、"\r" のほうが一般的かもしれません。 voltile int m10Count; int main() { int secCount; m10Count = 0; // ここでタイマ割り込みを許可 // 具体的な方法は処理系により様々 while(1) { if(checkDiff != (m10Count / 100)) { secCount = m10Count / 100; printf("%d秒後\n", secCount); } } return 0; } #pragma interrupt(m10Int) // ここの指定は処理系により様々 void m10Int() { m10Count++; } UARTから出力できるようなprintf()がない場合は sprintf() があるなら…… char buff[64]; sprintf(buff, "%d秒後\n", secCout); for(i = 0; buff[i]; putchar(buff[i++])); という感じで。(putchar() は具体的にパソコンに1バイト送信する関数に置き換えるとして) sprintf() もない場合には…… たとえば、http://www.nest4.net/tec/strnum.html で紹介されているライブラリを使って、 char buff[] = "xxxx秒後\n"; toStr(secCount, buff, 4, 10); zeroSuppress(buff); for(i = 0; buff[i]; putchar(buff[i++])); こんな感じでいけるかと。

ibayama
質問者

お礼

詳しい解説・回答・サンプルプログラムありがとうございます。 早速プログラム動かしてみたいと思います。

すると、全ての回答が全文表示されます。

その他の回答 (7)

回答No.8

さて、この状態で、出力が発生するためには、m10Count が、カウントアップされる必要があります。 ということは、m10Int() が呼び出される必要があります。 「10msごとに割り込み要求を出すプログラム」で、10msごとに m10Int() を呼び出すようにすれば、OKです。 具体的な方法は、それこそマイコンの機種・ボードの回路によって変わってきます。 「割り込みプログラムは作成した」という前提で回答してきましたので、これ以上はご遠慮いたします。

ibayama
質問者

お礼

素人質問ばかりで申し訳ありませんでした。 多くの回答ありがとうございました。 プログラミングがんばって完成させたいと思います。

すると、全ての回答が全文表示されます。
回答No.7

スペースも含めて、正確に書いていただいたおかげで助かりましたが……。 != はこれでひとつの演算子です。! と = の間にスペースは入れません。 == や ++ や += と同じ(意味は違いますけど)

ibayama
質問者

補足

何度も回答すいません スペースを消したらコンパイルできました。 でも teraterm上では何も動かなくなってしまいました。 どうしたら・・・・・ for文のほうも必要なのでしょうか また、for(i = 0; buff[i]; putchar(buff[i++])); 分のiというのは何を表しているのでしょうか? 本当に申し訳ないのですが、できれば回答お願いします。 ...

すると、全ての回答が全文表示されます。
回答No.6

TeraTerm 上では、望んだものではないにしろとにかく動いていたわけですよね? それでいて、「ソースの ! が認識されない」のですか? そもそも、「「!」の記述が認識されません。」とはどういう意味でしょうか? エラーですか? 警告ですか? それでしたら、正しい内容を書いてください。 それでないのなら、「認識されない」とはどういうことで、「認識されない」と判断した根拠はどこにあるのか? そういったことがないと、さすがに回答不能です。

ibayama
質問者

補足

わかりにくい補足で申し訳ないです。 if(secCount ! = (m10Count / 100))の部分なのですが、 「!」を抜いたらコンパイルすることができるのですが、 if(secCount ! = (m10Count / 100))のままだと syntax errorと表示されます。 何度もすみませんが回答お願いします。

すると、全ての回答が全文表示されます。
回答No.5

さらに、2カ所ほど訂正です。 voltile int m10Count; は正しくは、 volatile int m10Count; sprintf(buff, "%d秒後\n", secCout); は、正しくは、sprintf(buff, "%d秒後\n", secCount); です。 いずれも、このままだとエラーになるので見当は付いたとは思いますが。 だめですね、こんなところで間違えるようでは>自分。

すると、全ての回答が全文表示されます。
回答No.4

No.3 ですが……。 > teraterm上で > 「0 b .」とずっと表示され続けてしまいます。 ずっと表示され続けるということですが 1)どのくらいの頻度でしょうか?   1秒間隔で表示されるのなら、単なる表示の問題   ずら~と表示されるのなら、表示の条件を作っている部分(if(secCount != (m10Count / 100)) とその次の、secCount = m10Count / 100;)が変   1秒じゃない、一定の間隔なら、割り込みの設定が変   くらいの切り分けはできて欲しいのですが。 2)表示の点   まずは、putchar() で、A を毎回表示してみましょう。   正しく表示できるのなら(タイミングも含めて)漢字の扱いとか、buff 周りの設定が変 こんな所かなとは思いますが。 まさかとは思いますが、if(checkDiff != (m10Count / 100)) の間違いは修正されましたよね?

ibayama
質問者

補足

何度も回答ありがとうございます。 まず、プログラムのソースなんですが、 「!」の記述が認識されません。 別の書き方はないでしょうか?

すると、全ての回答が全文表示されます。
回答No.3

No.2 ですが、訂正です。 int secCount = 0; // 初期化忘れですね m10Count = 0; if(checkDiff != (m10Count / 100)) 正しくは、 if(secCount != (m10Count / 100)) ですね。 途中で気が変わって、変数名直したのが漏れていました。

ibayama
質問者

補足

buff、sprintfを使うプログラムを作成したのですが、 teraterm上で 「0 b .」とずっと表示され続けてしまいます。 解決策お願いします。

すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

マイコン全般に使える、汎用的な方法はありません。 開発環境によってはprintf()が勝手にUART出力されるようなものもありますが、基本的にはUART通信の部分も自分で書いて出力することになります。

すると、全ての回答が全文表示されます。

関連するQ&A