マイコンカーラリー printfデバッグ (4) トラブル原因の特定

printfデバッグの実行

準備ができたのでデバッグ文を入れたプログラムをボードに書き込み実行してみると次のような結果になりました。

なんと50ms毎にwriteDataFlashが呼び出されて32回毎にDataFlashの消去が行われています。
データフラッシュの耐久性は1万回の消去までOKとなっています。
実際はかなりマージンがあるはずなので2万回が寿命と考えて2万回×32=32万回のデータ消去で寿命を迎えてデータエラーが発生するようになります。
時間にすると1.6秒×32万回=512000秒=142.2時間になり、如何に熱心に練習されているかがこのデータから読み取れます。

writeDataFlash関数が呼ばれているところをファイル検索で調べるとメインループの中とメインループから呼び出された関数lcdProcessの中でスイッチを押した時に呼ばれるようになっています。

で、次のようにしてメインループの最初でスイッチの値を表示してみました。

while( 1 ) {
   // デバッグ表示
#ifdef DEBUG  スイッチ状態の表示
   printf("pushsw_get()=%d, SW_1=%d, SW_2=%d, SW_3=%d, SW_4=%d\r\n",
          pushsw_get(), getSwFlag(SW_1), getSwFlag(SW_2), getSwFlag(SW_3),       getSwFlag(SW_4));
   // printf("%04X\n",trf); // TRF 表示 20/32 MHzクロック
#endif
   // LCD表示、パラメータ設定処理
   lcdProcess();  <== この中で呼ばれる

   ...
   ...
   switch( pattern ) {
     case 0:
       /* プッシュスイッチ押下待ち */
       servoPwmOut( 0 );
       if( pushsw_get() ) {
           writeDataFlashParameter(); // パラメータ保存  <== ここで呼ばれる

   ...

プログラムを実行すると次の結果が表示されました

SW_4だけが時々ONになっています、SW_4は同じ信号線を使ってLCDの表示とスイッチの読み込みを兼ねているのでハードウェアとの相性かソフト的な原因でこのようなことが起こっていると思われます。
SW_4の動作を修正することが目的ではなくpushsw_get()が押された時だけwriteDataFlash関数を呼び出すようにすれば実用上問題無いのでSW_4誤動作の件は無視してlcdProcessの中の呼び出しを削除するようにアドバイスしました。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)