はじめに
- 電池駆動DSPラジオのその6。SEEKでの受信完了を割込みを用いてATTINY85で処理する話です。
選局完了のトリガ処理
- その2でも書きましたが、RDA5807FPは、SEEK機能での選局が完了すると、GPIOピンがトリガを発生します(要レジスタ設定)。
- このトリガを利用して、周波数、RSSIを読み込むようにします。想定していたのは以下のような形。
- SEEK機能開始 → ある周波数を選局 → トリガ発生 → ATTINY85で割り込み発生 → RDA5807FPのレジスタからデータ読み込み → LCDにデータ表示 → 割込み終了
- ところが、実際のコードを作成するにあたっては、以下の理由により、少し形を変更する必要がありました。
- 割込み関数(割込み発生後に飛ぶ関数)の中では、WIRE関数(レジスタからの読み込みに利用)は利用できない(すべきではない)。なぜならWIRE関数も割込み処理を行うため、2重に割込みをかけることになってしまうため。
- なので実際の処理は以下のような形になりました。
- SEEK機能開始 → ある周波数を選局 → トリガ発生 → ATTINY85で割り込み発生 → 割込み関数でフラグを変更し割込み終了 → このフラグをLOOPで監視して、周波数表示関数へ飛ぶ
- 割込み関数の中では、WIRE関数は用いず、単にフラグを変更し、フラグの状態をLOOPで監視するような形です。ワンクッション置くようなイメージでしょうか。
- この形で動作はしたのですが、よく考えてみると、割込みを使っている意味が小さいような気もしてきました。結局LOOPで監視するのなら、割込みを用いなくても処理可能な気もします。
- 今回は、勉強も兼ねているので割込み処理を使うことにしています(実際、勉強になりました)。
ATTINY85の割込み機能
- ATTINY85(というかAVRマイコン)の割込み機能には以下の2種類の割込みがあります。
- 通常割込み(INT0とかINT1とか):いわゆる普通の割込み。トリガの種類(立ち上がり、立下り)なども指定可能。
- ピンチェンジ(Pin Change)割込み(PCINT0とか):いろいろ制限あり。High⇔Lowの変化が起きると、どちらの方向であっても割込みが発生してしまいます。
- 本件でも通常割込み(INT0)を用いる予定でした。ATMEGAで試作したときは通常割込みでよかったのですが、ATTINY85の場合、ピン数が少ないため、通常割込みが利用できないことがわかりました。
- ピンアサインは適宜ググってほしいのですが、ATTINY85の場合、通常割込みピンは1つだけなのですが、このピンがI2CのSCKと同じピンアサインとなっているため、本件の割込みには利用できないのです。
- Pin7(PB2): SCK/INT0
- 従って、ピンチェンジ割込みを利用せざるを得なくなり、以下のピンを利用しています。RDA5807FPのGPIOピンをPin3に接続することになります。
- Pin3(PB4): PCINT4
PCINTを利用する場合の注意点
- PCINTは、High⇔Lowのどちらでも割込みが起きてしまいます。RDA5807FPからのトリガは「High → Low → High」という形ですので、1回のトリガで2度割込みが発生することになります。1回目:High → Low、 2回目:Low → High。
- 割込み処理は1回でよいので、2度目の割込みでは割込み処理は行わないようにしました。具体的には、割込みピンの状態がLowの時だけ割込み処理を行います。そうすると2回目の割込みでは割込み処理は行われないことになります(割込みピンがHighなので)。
- このような処理は面倒なので出来れば通常割込み(INT0)を使いたかったのですが…
ATTINY85の割込み設定
- PCINT4を利用するための設定は以下の通りです。データシートのp34あたりを参照してください。
GIMSK = B00100000; //PCINT ENABLE
PCMSK = B00010000; //PCINT4 ONLY
- PCINTが発生した場合に飛ぶ関数は、以下のような形にて指定します。上記で触れたように、ピンの状態がLowのときだけ割込み処理をしています。
ISR(PCINT0_vect){
if(digitalRead(4)==0)
stc=1;
}
- 「PCINT4を利用しているのに、何故PCINT0_vectなのか」という点については、「PCINT0~PCINT7は割込ソース0を利用しているから」ということになります。
おまけ
- ATTINY85の前に、ATMEGAで試作してみたのですが、その時はピンに余裕があり、通常割込みで割込み処理を行っていました。ATTINY85ではPCINTを利用することになりましたが、図らずも両方を勉強できました。
- 2重割込みを許可する命令(sei)があるようですが、今回は使いませんでした。2重割込みは用いない方が良い、という記事が多かったので。