2015-05-11 13:41 | カテゴリ:PIC応用回路
ドットマトリックスLED表示の不具合ですが、アセンブラのリストをしげしげ見ていても、動作不良の原因が見つかりません。
プログラム本体部分各々は問題が無く見えます。
PICの開発環境であるMPLABには、アセンブラのシミュレータが装備されていますので、それを利用して、ワンステップずつ確認していきました。
で、キャラクターコードからドットのフォントデータを持ち帰るサブルーチンに問題があることが分かりました。

詳細は省きますが、アセンブラでは、プログラムカウンター自身に数値を加減算して、自分のジャンプ先や、テーブルデータを取り込んで持ち帰る「技」があります。
高級言語(CやBASICなど)では、プログラムの流れは、GOTO命令などでプログラムカウンターを変更して、ジャンプしますが、アセンブラでは、これ以外に、プログラムカウンターを直接変更してジャンプする事も許されています。
これは、ある意味、奥の手、なんです。
と言うのは、間違った値をプログラムカウンターに加えてジャンプすると、命令以外の場所にジャンプして、プログラムが暴走したり、一見上手く動作しているように見えて、時々変な動きをする、様な問題が生じやすいのです。

今回の不具合(文字コードからフォントデータをゲットするテーブルサーチでおかしな動きがあった件)もそれを使用していました。
ルックアップテーブルの大きさが小さければ問題なく動作したのですが、アスキーコードを変換するので、テーブルが大きく、ジャンプエリアが256バイトを超えてしまって、アドレス指定が不十分だったので、「暴走」していました。
しかし、幸か不幸か途中で、正常のルーチンの途中にジャンプしていたので、条件によっては動作しているように、見えてしまい、発見が遅れました。

「R」の一部が欠けていたのは偶然で、その他の誤動作が、正常に見えてしまっていました。

これから、この部分のプログラミングを変更しますが、ちょっと厄介になりそうです。

テスト動作では、最初の文字コードから、順に表示できました。

DSC00903.jpg

DSC00904.jpg

管理者のみに表示する