2013年4月6日土曜日

HA-2モジュールのAVRマイコンのソースコード

HA-2モジュールのデバッグと動作検証がだいたい完了したのでソースコードを公開しておきます。
開発環境はMacのOS X 10.8.3 MountainLion 上で CrossPack-AVR-20121207とXCode上で開発しています。言語はC++です。Windowsの環境でも多分buildできるかと思います。

AVR_ha2.tgz   (<- gitに移行しました。HA2module)


main.ccはリセット直後に飛んでくるmain()関数からMainScheduler.Loop()を呼び出すだけのコードです。Scheduler classのloop()の中のwhile(1){}がメインループになります。
基本的には10ms周期のTickのタイミングか、何らかの割り込みが発生するまではsleepしています。
起きるとWatchDogをリセットし、PORTD6のHertBeatを1秒毎に点滅させる処理をしてXB.Wakeup()を呼びます。戻ってくるとまたsleepします。

XBee classはXBeeのコマンドの処理をするclassです。
コマンドを受け取るとそれを処理して結果をサーバーに返す処理をしています。
実際の通信処理はUsart classで行ない、取得したデータをQueue classで管理されるバッファに積んでいきます。
Usart classでは通信処理自体は割り込みで処理しSend/ReceiveFIFOでデータを管理します。

XBee classのコマンドで処理されるHA端子の制御はHAControl class, 赤外線リモコンの送信処理はIrOutput classで行います。
HAControl classの方は100ms程度の処理が最小なのでScheduler classでカウントしているTickCountを用いてタイミング管理をしています。
IrOutput classの方は38kHzの搬送波はTIMER0の8bit timerでPWMをfree runさせて作りoutputのみをコントロールします。TIMER1の16bit timerの方で次のon/off処理までの時間を設定し割り込みを発生させます。割り込み処理の中でSequenceNumberを進めながらAEHA, NEC, SONY, Otherの各赤外線リモコンシーケンスを発生させています。

コントロールサーバー側のRaspberryPiの赤外線リモコン記録時のOtherフォーマット用のコマンドバッファの最大値を1KBで作ったため、最大1KBのコマンドがやってくる想定でQueue用バッファを1KBに設定しています。このためstack,bss等も合わせてSRAMが1.5KB程度必要になりATmega328以上でないと動きません。
実際は256byteもいかないと思うのでもっと小さなものでも動くとは思いますが、値段差も数十円なので328を使用しています。



0 件のコメント:

コメントを投稿