2016-11-28 11:06 | カテゴリ:PIC応用回路



MPLABXのフリーコンパイラーである、XC8のプログラミングにもずいぶん慣れてきたつもりです。
最初は、C言語特有の「作法」に戸惑ったりしました。
いきなり、void とか、突然出てきて、面食らいました。

習うより慣れろで、壁にぶち当たりながら、息子に教えを乞うこともあって、なんとかプログラミングに慣れてきました。

しかしながら、寄る年波、デバッグには結構てこずっています。

論理上のプログラムの流れのデバッグは、手がありませんが、予想外にてこずったのが、ERRORの出ない、文法のミスでした。
そこで、初心者の私が、未だに結構はまってしまっている、落とし穴を整理して、備忘録としたいと思います。
どう考えても、プログラムが正常と思われても、期待通りの動作をしない時にチェックしてみたら良いと思われるポイントを、自分なりに挙げてみました。



チェックポイントとティップです(順不同)
私の記憶では、下記の記述ではERRORにならないと思います。
それだけにバグの発見はなかなか困難です(笑)


* IF分の条件判断で、等しい場合に等号を一つしか記述しない。
  正しくは、 A == Bとする。
  感覚と異なるので、はまると発見しずらいERROR。
  わかっていても私はこれが一番多いミスです。

* 論理記号、&「AND」と|「OR」。 文献やWEBのC言語では、「&&」とか「||」とか記述されている場合がある。
  XC8では、一つを記述すればよい。

* FOR分の開始点。 A=0; が正しいが、IF文と混同する場合あり。A==0としてしまうかも。

* 常数の指定で、16進数は、0xFFFF、2進数は、0b00001010。
  以前、16進表記から2進表記に途中で変更した際に、0xを0bに変更するのを忘れて、バグ取にはまりました。

* 左右のシフトの論理演算の結果を得る際、 ABC = ABC >>2 とする。
  ABC>>2;
  では不正。
 
* EEPROMに常数を定義する方法は eeprom JOUSU[10];
  で、確保できる。特別に書き込み、読み出しルーチンを用意しなくても良い。

* 文字列の配列にASCII文字などを代入して、ポインターを利用して表示させる際、配列のデータの最後は、'0\' の終了記号をセットする。
  これがないと、プログラムが「終わりがないと」理解して、暴走する。

* 16ビットデータと8ビットデータのビット計算のコツ。二バイトのデータから16ビットのデータにまとめる。
  受け側の変数と代入する変数のバイト数を考える。

  例 
        unsigned char CMD_dataH, CMD_dataL; //  8ビット変数
        unsigned int cmd_entry; // 16ビット変数

        として

     cmd_entry = CMD_dataH;   // 一旦16ビット変数に代入
    cmd_entry = cmd_entry << 8; // それをシフト
     cmd_entry = cmd_entry | CMD_dataL; // そしてORをとる


ひとまず、この様なところをチェックポイントとして上げてみます。
今度バグではまったら、ここをチェックしてみることにします(笑)


【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(4)

管理者のみに表示する