ATtiny13のレジスタ操作による使用容量ミニマム化作戦【後編】

ATtiny13

づづき

この前はATtiny13のコード圧縮化を検討するにあたってレジスタ操作を行ってArduino関数であるdigitalWrite()とanalogRead()を再現してみました。

ATtiny13のレジスタ操作による使用容量ミニマム化作戦【前編】
Arduino配下のATtiny13のコード容量を圧縮させるためにレジスタ操作を使用してArduino関数のdigialWrite(),analogRead()を再現します。ミニマムな電子工作には必須なのでぜひご覧ください。

今回はanalogRead()について掘り下げていこうと思います。

具体的には前回が8bt(0~255)分解能のAD変換であったために10bit(0~1023)分解能のAD変換の実装とAD変換に関するレジスタをちょっと解説しつつ進めていこうかなと思っております。

16bit analogRead()の再現

実装

準備する材料とテスト回路については前回と変わらず可変抵抗入力回路です(変わり映えがなくてすみません、、、)。

では早速16bitのAD変換コードになります。

※効果は不明ですがDIDR0レジスタを操作して指定のADCピンのデジタル入力を禁止しています。省電力化の効果があるようです。

いかがでしょうか、うまく書き込むことが出来きたら10bitのAD変換ができた、、、はずです。

考察と解説

コード的には前回の8bit_AD変換とほとんど変わりませんが10bitアナログ値にするためにアナログ値が格納されているADCL, ADCHのレジスタを組み合わせる処理をしています。イメージ図を下記に示しますね。

※今回は左揃え(ADLAR=1)としています。

  • 符号なし16bitの箱を2個用意してADCL, ADCHを格納します。

  • adを6bit右にシフトさせて、ad2を2bit左にシフトさせる。

  • ビット演算子OR(|)で足し合わせてad2に格納。

今回は左詰めで行いましたが、右詰めの時も考え方は同じです。

まず、右詰めの時はADMUXレジスタの5bit目(ADLAR)を0とします。

演算に関しては上記と同じく符号なし16bit変数を2個用意して、ADCHが入っている方を8bit左にシフトさせてORで足し合わせればOKです。参考に差分のコードを載せますね。

  • 上記コードの11行目と入れ替えてください。

  • 上記のコードの19, 20行目と入れ替えてください。

以上になります!

ちなみに今回は単発でAD変換を行っております。

ちょっとだけおまけで、連続変換でAD変換した時に変換完了割り込みでの連続ADC値取得を最後に行ってみます。

おまけ 連続ADC

という事で最後に連続ADCの値を変換完了割り込みで取り込んでみたいと思います。

割り込みのヘッダファイル<avr/interrupt.h>は以下のサイトを参考にしました。

avr-lib

連続変換を有効にして、ISR(ADC_vect)で割り込みを実行しているつもりですが、、、

シリアルモニタでモニタするにも割り込みが早すぎるのかうまくモニタ出来なく確かめることができなかったす。。。

ちょっとこのやり方でのADCはもう少しお勉強してみます。詳しい方がいらっしゃったらADCの連続変換とADC完了割り込みからのアナログ値取り込みの使い道を教えてくれたら幸せになります。

以上、よろしくお願いいたします。

ではでは~

コメント

タイトルとURLをコピーしました