開発環境はMacのOS X 10.8.3 MountainLion 上で CrossPack-AVR-20121207とXCode上で開発しています。言語はC++です。Windowsの環境でも多分buildできるかと思います。
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 件のコメント:
コメントを投稿