昨日の実験でリモコンFのパルスタイミングが判った
ので、早速プログラムを書いてみる。
ターゲットのチップとしては、部品箱に大量に余っている
pic16f84か、はたまた使い慣れたat-tiny2313か、どっち
にするかでちょっと悩みつつ、使い慣れたほうをチョイス。
マイクロ秒単位の制御が必要なので、そんなときは
アセンブリ言語の方が融通が利くんだけど、ひねくれて
win-avrにしてみることに。
Cなのでロジック部分はサクッと書けたんだけど、第一の
ずっこけはコードサイズ。
コンパイルしたらコードサイズがいきなり4kBを超えちゃった
ので、何が起きたのかと思ったら、どうやら_delay_ms関数
や_delay_us関数の引数に変数を入れると型変換処理で
なんだかライブラリコールが生じるみたい。
気を取り直して、引数は定数にしてループで一定時間
繰り返すように変更。
もう一つの問題。これはあらかじめ予想付いていたこと。
マイクロ秒単位のwait処理はfor文その他のオーバーヘッド
で遅延が生じるだろうということ。
で、当初の作戦→生じた遅延の分を加味してwaitの時間
から引き算する作戦。ソースを書き終えてからPC上の
シミュレータでクロック数を数えてみる。
…駄目だった…。
本来のwait時間とオーバーヘッド時間がほぼ同じ長さ
になっちゃう。引き算で済む問題じゃぁ無いな。
ミリ秒単位の待ち処理はばっちりなんだけどな。
ということで、マイクロ秒の待ち処理の方はやっぱり
インラインアセンブルが入用みたい。
http://www.scienceprog.com/how-to-use-inline-asm-using-winavr/
http://www.stanford.edu/class/ee281/projects/aut2002/yingzong-mouse/media/GCCAVRInlAsmCB.pdf
ちょっと面倒…
|