0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DSP FMラジオ RDA5807FP+ATTINY85+AQM0802A その6 STC割込み

Posted at

はじめに

  • 電池駆動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重割込みは用いない方が良い、という記事が多かったので。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?