FPGA FMチューナの選局ようにATTiny85で赤外線リモコンの信号を受信する小さなモジュールを作っています。シリアルの仕様はこちら。
SONYのアナログテレビなどのリモコンを再利用できるように作られています。
たまにリモコンが見つからないとか、電池切れとかあるので、スイッチでも選局を変更できるようにすることを思いつきました。ちょうど良いプッシュスイッチが部品箱にありました。
INT0を赤外線受光器につないで割り込みとタイマーで信号を解析してuartで信号を送出しているようですが、今自分で見てもどうやってうごいているのかわかりません。 ^ ^;
uartのコードがクロックに依存していて、クロックのために5Vで駆動してシリアル信号は抵抗の分圧で3.3Vにしています。
省電力とノイズ削減の効果があるかと考え、sleepするようになっていて、INT0で復帰するように作られています。
とりあえず既存コードはできるだけいじらず、スイッチを付ける方法を考えます。
ATTinyでsleepの復帰は外部割り込みで、外部割り込みはINT0とPin Change Interrupt(PCI)が使えます。INT0とPCIの違いはINT0は信号のH,Lなどの細かい設定ができるのに対してPCIはすべての変化を拾ってしまうとろろです。sleepして復帰にINT0かPCIかのどちらかを使った方法を書いているページはありましたが、両方待つ方法を書いたページは見当たりませんでした。
sleep後のmainではGIFRは空になっています。ハンドラ処理が実行されるとクリアされるようです。
いろいろ試行錯誤して、PCIのハンドラを追加する方法にしたのですが、PCI_vectではなくて、PCINT0_vectでした。おそらく以前もはまりました。
このハンドラでスイッチからの復帰を確認して信号を送るようにしました。
sleepのデバッグはテスターで電圧を測っておこないました。pull upを追加したので、幾分増えていますが、稼働時8mAでsleep時は0.8mAくらいになっています。
当初は実機で確認していたのですが、効率が悪いのでMacにつないだFTDIのチップでシリアル信号を受けて確認にしました。
開発環境はMBA Originalの雪豹です。
たまに赤外線のノイズを拾って誤動作することがありますが、気が向いたら直そうと思います。