家の中でのこだわりスペースはどこですか?

RTC-7301SF(EPSON TOYOCOM)とゆうリアルタイムクロックを使用し、
その計時データをシリアル通信させて、時計機能の確認をしようと
しているのですが・・・
下記のプログラムをステップで実行させると、
ちゃんと時計が進むような形で表示できるのですが、
ループで回すと最初に書いたデータがそのまま
出力され、時計が進んでないような表示になります。

void Rtc_Read(void)
{
 struct RTC_TIME rtc_clock;    //RTC構造体
 if(CONTROL_REG.BIT.BUSY_ADJ){ //BUSYフラグをチェック
  usec_timer(TIME_244US);
  return;
  }
  else{
  rtc_Get_data(&rtc_clock); //RTC構造体の取得
  rtc_time_str(&rtc_clock); //文字列に変換し、シリアル送信
  }
}
シリアル送信後に1秒のウェイトを入れています。

ステップで動作するのに、ループで回すと動作しないとゆうことに
なっていて、行き詰っています。

何か参考になるような意見いただければありがたいです。
よろしくお願いします。

A 回答 (2件)

表示はcpu側ですか、それともシリアル通信の先ですか?


CPUの仕様が分かりませんが、表示ルーチン、もしくはシリアル通信がループの為に割り込みがかからず、表示、もしくは通信が行われなくなっていると思います。
ウエイトも、割り込みが入らないウエイトを入れては駄目で、割り込みが入る様な、コマンドないですか?
又は、割り込みレベルが高くて、割り込みが入らないとか。

この回答への補足

説明不足ですみませんm(_ _)m

表示はシリアル通信の先です。
TeraTermで表示させようとしています。
CPUはHD64F3068Fです。

ループで回すと・・・
2008 March 11 Tuesday 16:40:00
2008 March 11 Tuesday 16:40:00
2008 March 11 Tuesday 16:40:00
2008 March 11 Tuesday 16:40:00
2008 March 11 Tuesday 16:40:00
をひたすら繰り返すような感じになります。

補足日時:2008/03/11 19:06
    • good
    • 0

volatile 関連の確認はお済でしょうか?


RTCから取得したデータが汎用レジスタに保持されたまま、
コンパイルによる最適化によって外部アクセスを発生することなく
汎用レジスタ上のデータをシリアル出力している可能性があります。

ステップ実行する際はきちんと表示されるのであれば、
デバッグ機能の為にレジスタは本来動作するプログラムとは別に
上書きされる為、おのずとRTCへのデータ取得が行われることが
ありますので可能性は濃いかと。

ファンクションコールを噛んでるのでvolatileなくても
きちんと動いてしまいそうですが、使用するCPUによっては
十分にありえる話かな。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報