nanoに実装されているATmega328/Pのデータシートを見ていてふと思ったのが内部レジスタを直接見れるんじゃないかと。試しにレジスタ名を入れるだけで簡単に読み取れました。前回の記事に′′基準電圧を決めるanalogReference();がsetup内で正常に動作せずINTERNALへ変わらなかった。INTERNAL(内部電圧基準)を設定後、1秒ディレイを入れてから電圧値を取得した後にDEFAULT(電源電圧基準)に戻すことで解決。′′ディレイ使うのにちょっと抵抗感を感じていたのでADC関係のレジスタが設定通りになっていることを確認してから次のステップへ進むよう変更しようと思います。実験回路は前回のラストと同じです。情報収集まず、レジスタ名を知るためにデータシートをダウンロード。11/2016手始めにLEDをレジスタを操作して動かそうと考え、D13に該当するPB5を探す。RegisterのレジスタPORTBのbit5がD13あたり、それに”1′′を書き込むことでON、”0′′でOFFになる。}コメントアウトしていますが、どちらでも出来るようです。BIN);で状態を読み取ることが出来ます。次は本命のディレイ取り除き作戦まず初めにanalogReference(INTERNAL)でちゃんとレジスタが思うように変わっているか確認。RegisterレジスタADMUXのBit7:6が基準電圧の選択で”01′′がAVcc(+5V)、”11′′が内部1.1Vとなるはず。実際にINTERNALを実行後にレジスタを読み取り表示させてみた。BIN);結果、Bit7:6は変わってなかった。analogRead()実行後はADMUXが設定されていた。これが実行されて初めて書き換えられるのか?!分からないので次。今度はADMUXを直接変更してどうなるか試してみた。確かにADMUXの値は変わるが結果が変わらなかった・・・。仕方なくIDE内を見て各関数が何をしてるか調査。先ほどのanalogRead()でADMUXが設定されるのは正しかったようだ。analogReference()は基準電圧の設定値を格納するだけにすぎない。スケッチ上でADMUXを書き換えてもanalogRead()内でADMUXを書き換えられてしまう。IDEソース:wiring_analog.c30行目がanalogReference()について。39行目から98行目がanalogRead()について。70行目でanalogReference()で設定した値をADMUXに書き込んでいる。最終案は、ディレイを入れるか。REFピンにプルダウン抵抗を入れるか。今のスケッチのセットアップはこんな感じ。_BV(5);}なぜ、ディレイを入れるか。そもそも電気的、タイミング的によくなかったようで、AREFが1.1Vへ上がる途中で値を取得していたようだ。CH1:AREF(黄)、CH2:D13(青)、CH3:D12(紫)※安価オシロの為正確ではないかも。ON(3)アナログ読み取りから(4)電源電圧を求めるまでの間のAREFは、まだ1.1Vに達していないのが分かります。1.1Vに到達する時間を稼ぐのにディレイを入れます。下記のように10kΩの抵抗を入れることで一応は解決した。こちらも同様に波形を取り見てみました。測定個所と動作は先ほどと同じです。1.1Vに到達後、アナログ取得しているのが分かります。若干乱れた波形になっているので抵抗値は変える必要がありそうですね。結局、目標だったレジスタの値見て動作させるのは今回達成できず・・・。今回のプログラムはPORTBいじる位で他は前回と同じなので省略。電子工学の基礎と言ったら駆動系、モーターかなと思いモーター動かします。Arduinoのプログラムは一応形にはなったので経過報告。電子工学の基礎と言ったら駆動系、モーターかなと思いモーター動かします。...書いてる人おがP猫に包囲された居住空間で飼育されています。