タイマのときは入れられなかったテストステートメントがいくらでも入れられる。LEDも一列づつ律義に表示されわかりやすい。テストステートメントで変数の表示をして行って驚くべき事実が明らかになった。外部変数だけでなく、内部変数までいたるところでデータが破壊されている。これでは暴走するはずである。AVRのサイト(AVRWiki)に外部変数だけだと書いたけれどそれどころではない。犯人を追跡する刑事の気分で、地道にひとつづつ破壊しているところを追及する。たどり着いたところは、Tiny2313の標準UARTの受信部分で、受信レジスタからデータをユーザー側に受け取るところである。これはもうどうしようもない。標準UARTが使っているSRAMデータとユーザーデータがぶつかっているのだ。コンパイラのバグである。前から気になることがある。コンパイルの出力結果が示すSRAMの消費量が、配列で確保したバッファ量より小さいことである。こいつ、定義した分だけデータをとっていないのかもしれない。したらと半信半疑で、バッファの大きさ80バイトを半分の40バイトにしてテストしてみた。これまでのすべてのトラブルはうそのように消えて別人のように正確にLEDは表示された。急いでタイマを戻しダイナミック表示にする。作ってあったA、Bの文字が表示される。1ドットづつ点けたり消したりするコマンドもきれいに動く。解決したときの喜びは今までの苦労が多ければ多いほどそれだけ大きくなる。75才でエベレストに登った三浦雄一郎の気持ちと同じだ。勢いに乗って、これまでの配列から構造体に変更し、スクロールに挑戦する。リングバッファーのロジックと同じでこれは簡単にコードが書けた。AとBしかキャラクタがないが、それらしく横スクロールする文字を眺めてひとり悦に入る。(5/31/08)いや、スクロールも手強かった。前にスクロールできたと書いたが、実は1文字づつ独立してスクロールするだけで文字が2文字分流れていく電光掲示板の形ではスクロールできていない。シフトレジスタは2段にカスケードになっていて、16ビットで2文字の縦データを送る。横データはトランジスタアレイ一つで同時に2つのLEDマトリックスの同じ列が点灯するようになっている。これで2文字分のスクロールをするのは結構大変である。これがプログラミングの醍醐味である。人のソースコードを見れば簡単だろうが、このところ人のコードを頼りにしすぎる。久しぶりにメモを書き散らしてロジックに頭を捻った。年をとっても直感的な分析力は落ちていないが、こういう解析力は確実に落ちているのを痛感する。あるところまで論理をつめていくと最初の前提条件を忘れてしまって論理が閉じていかないのだ。年齢相応に色々なアプローチの手法だけは山ほど知っているので、そう悲観はしていないが、思い通り動かないと最後はソースリストの前で、定数を足したり引いたりする不毛なデバッグになり、暫くお休みをとるという繰り返しである。いうときは気分転換が一番である。行き詰ってもう寝ようと風呂に入ったとき、はっと気がついてうまく行ったことが何度もある。このときもそうだった。トランジスタアレイが並行して点灯していくことに気を取られ、その順番と最後まで行ったときの処理をあれこれ考えていたが、黙ってそれぞれの点灯すべきアドレスだけ計算していけばそれでスクロールができることに気づく。そのために配列は並んでいるはずだ。アドレスが表示データを越えれば素直に最初のアドレスに戻ればよい。風呂に入ったのが午前3時近く、今さらまたデバッグするのも何なので寝たが、夢にまでVccだグランドだと基板配線の光景がでてきて夢の中で苦笑する。やることがあるときの朝の目覚めは早い。朝食もそこそこにPCの開発環境を立ち上げる。これで決まりと考えたロジックは最初動かなかった。スクロールの指定もしていないのにそもそも文字が静止しない。あれこれいじるが改善しない。ミリセカンドのオーダーで表示を繰り返し、なおかつ少しづつその表示をずらすというのは確かにそう簡単ではない。これも一休みして原因が判明した。ポインターを止めて別の変数で8バイト分ダイナミック表示をしているときにポインタそのものも動かしていたのである。これでは静止しないはずである。ステートメントでいえば、++の記号をひとつはずすだけ。これでLEDマトリックスは完全に想定どおりのスクロールを開始した。表示フィールドを大きくして少し電光掲示板風にしてみる。家族に自慢する(いつも馬鹿にされるのだけれど吹聴せずにはおられない)。ウェブデザインをバイトにしている次女だけが、「すごい」と驚いてくれた。次女はよく大学まで車で送ってやっているからな。LEDマトリックスの次の目標は文字フォントの導入である。これでこのあいだのSDカードのプロジェクトと合体する。ここにTiny2313を使ったLEDマトリックスをドライブするプログラムを置きます。回路図がないので読みにくいと思いますが、ソースにコメントがありますので、ダイナミック表示やスクロールの参考にしてください。EEPROMにフォントを溜めて16字まで表示できます。本格的な8ビット漢字を表示する電光掲示板(Mega128)のソースはこのあと公開します。「AVR」カテゴリの記事ソフトI2Cはクロックストレッチまで手を出してあえなく沈没(2017.09.02)オシロのテストどころかソフト開発で大はまり(2017.07.26)超音波方式の人感センサーI2C化と新しいオシロ(2017.06.29)motionの動体検知はRaspi3の電源が安定しない(2017.04.16)赤外線学習リモコンはデータ再現で挫折したまま進まず(2016.07.21)コメントコメントを書く名前:メールアドレス:(ウェブ上には掲載しません)アドレス(URL):この情報を登録するコメントは記事投稿者が公開するまで表示されません。スタック領域とSRAM変数。