作った! [ATmarquino Arduino]
牛歩の如き進みよう。
大丈夫か?。
Make: Technology on Your Time Volume 06
- 作者:
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/03/27
- メディア: 大型本
イラスト求む! [ATmarquino Arduino]
ここ、このグラフィックLCDに表示するイラストを募集しています。
ATmarquinoを今度のMTM03にて展示しますが、適当なイラストが無くて困っています。
画面サイズは横101ピクセル×縦64ピクセル、白黒で諧調無しです。ビットマップデータで送ってもらえればこちらで変換します。できれば複数枚。若干文字も入れて下さい。
どなたか宜しくお願いします。
ATmarquinoを今度のMTM03にて展示しますが、適当なイラストが無くて困っています。
画面サイズは横101ピクセル×縦64ピクセル、白黒で諧調無しです。ビットマップデータで送ってもらえればこちらで変換します。できれば複数枚。若干文字も入れて下さい。
どなたか宜しくお願いします。
Make: Technology on Your Time Volume 06
- 作者:
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/03/27
- メディア: 大型本
「オープンソースハードウェアセミナーVol1」レポート Arduino Ether Shield 電源起動で、、、 [ATmarquino Arduino]
chip1 Stopからいらした方、Arduino関連カテゴリをお試しください。http://hamayan.blog.so-net.ne.jp/archive/c2300498101-1
スケッチを書いてしまえばUSBは外してしまう訳です。地球温暖化(笑)を防ぐ為にPCを24時間起動している訳には行かないので、適当なACアダプターを接続します。
手元に有った適当なのは、9V/1Aのそれでした。多分電流足りるよね。
何処にも電源スイッチなるものが無いのでACアダプタの抜き差しで電源入り/切となるのですが、電源を入れた時にEther Shieldがだんまりになります。具体的にはRXのランプが点きっ放しです。PINGも通りません。
多分ですねー、電源起動後のリセットシーケンスが上手く行っていないのではないかと思うのですが、詳しいところは判りません。しょうがないので毎回Ether Shield上のリセットスイッチをポチッとします。ってこんな物用意していると言う事は設計者は知っているんじゃないのかな?。まあ邪推ですけれどね。
と言う訳で現状のEther Shieldを無人の何処かに設置したい場合は、何らかの方法でPOWER ON RESETを入力した方が良いですよ。
※と言うか、どうしてあの回路で正常なPower On Resetが行われると言う事になったんだろう?。
ちなみにNICがだんまりになる事は良くある事で、慎重な設計者ならNICのりセットはCPUのポートの操作でリセットしたりします。シーーーー!。
スケッチを書いてしまえばUSBは外してしまう訳です。地球温暖化(笑)を防ぐ為にPCを24時間起動している訳には行かないので、適当なACアダプターを接続します。
手元に有った適当なのは、9V/1Aのそれでした。多分電流足りるよね。
何処にも電源スイッチなるものが無いのでACアダプタの抜き差しで電源入り/切となるのですが、電源を入れた時にEther Shieldがだんまりになります。具体的にはRXのランプが点きっ放しです。PINGも通りません。
多分ですねー、電源起動後のリセットシーケンスが上手く行っていないのではないかと思うのですが、詳しいところは判りません。しょうがないので毎回Ether Shield上のリセットスイッチをポチッとします。ってこんな物用意していると言う事は設計者は知っているんじゃないのかな?。まあ邪推ですけれどね。
と言う訳で現状のEther Shieldを無人の何処かに設置したい場合は、何らかの方法でPOWER ON RESETを入力した方が良いですよ。
※と言うか、どうしてあの回路で正常なPower On Resetが行われると言う事になったんだろう?。
ちなみにNICがだんまりになる事は良くある事で、慎重な設計者ならNICのりセットはCPUのポートの操作でリセットしたりします。シーーーー!。
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 濱原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
Making Things Talk -Arduinoで作る「会話」するモノたち
- 作者: Tom Igoe
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/11/17
- メディア: 大型本
アーデュイーノ互換マイコン・ボードを作る (プリント基板付き電子工作解説書シリーズ)
- 作者: 小坂 貴美男
- 出版社/メーカー: CQ出版
- 発売日: 2009/04
- メディア: 単行本
「オープンソースハードウェアセミナーVol1」レポート Arduino Ether Shield WEBサーバーをひっそり公開 [ATmarquino Arduino]
chip1 Stopからいらした方、Arduino関連カテゴリをお試しください。http://hamayan.blog.so-net.ne.jp/archive/c2300498101-1
※現在機能追加の為の改造中で、稼動していません。
多分ここをクリック
または
http://hamayan.ddo.jp:8888/
でどうぞ。
ただしDNSが不調で接続できない時も多いです。その場合は20分くらい待ってからアクセスしてください。
※まだ十分検証している訳ではないのであれですが、今のところ感じているのは、まああの訳の判らないバグはおいて置いて、でもこのレスポンスの高さは結構魅力ですよね。
組み込みにも使えるのかなぁ。でもまだ他に訳の判らんバグ有りそうだぁなぁ。微妙だなぁ。
※現在機能追加の為の改造中で、稼動していません。
多分ここをクリック
または
http://hamayan.ddo.jp:8888/
でどうぞ。
ただしDNSが不調で接続できない時も多いです。その場合は20分くらい待ってからアクセスしてください。
※まだ十分検証している訳ではないのであれですが、今のところ感じているのは、まああの訳の判らないバグはおいて置いて、でもこのレスポンスの高さは結構魅力ですよね。
組み込みにも使えるのかなぁ。でもまだ他に訳の判らんバグ有りそうだぁなぁ。微妙だなぁ。
Making Things Talk -Arduinoで作る「会話」するモノたち
- 作者: Tom Igoe
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/11/17
- メディア: 大型本
「オープンソースハードウェアセミナーVol1」レポート Arduino Ether ShieldサンプルWEBサーバー 早速改良だ! [ATmarquino Arduino]
chip1 Stopからいらした方、Arduino関連カテゴリをお試しください。http://hamayan.blog.so-net.ne.jp/archive/c2300498101-1
とまあ、ことさらタイトルが長くなっているのは、割と早めにレポートを書いているつもりだったのに、依然としてイベント参加レポートにリストされていないのは、
http://www.chip1stop.com/knowledge/Arduino/
タイトルが悪かったからなんだろうか、それともネガティブなイメージを感じてしまうからか、、、。
投稿後はこちらから連絡が必要でした。
まあそれはそれとして、masatoさん情報を元に改良してみました。
直接send関数を呼び出すことは叶わなかったので、Client.cppに小細工を入れました。(やはりC++の勉強が必要だな)
まずClient.cppには以下のメソッドを追加
Client.hには以下のプロトタイプ宣言を追加
それで実際に改造したスケッチが以下です。
もろにC言語ですね。まあ私は組み込みの人間なので全然気にならないのですが。
パケットモニタ(PacMon)のキャプチャ画面を見れば判る様に、前回は1画面で収まらず、えらいスクロールしないとFINまで到達できませんでしたが、今回は1画面で全てのやり取りが完了しています。
まあ静的なページの表示ではなくCGIなのでforループの分だけパケットが増えていますが、これ位は許容範囲でしょう。
すっきりしましたね。
※追記
考えてみれば関数のオーバーライドができるんだから、
Client.hには以下のプロトタイプ宣言を追加
の方がよっぽどC++らしいですね。
前から気になっていたのですが、よくArduinoの事を簡単、簡単と説明されるのですが、一体何に対して”簡単”なのでしょう。統合環境上の開発ならArduino環境よりも便利な物が沢山あるのですが、例えばルネサスのHEWにしても、フリースケールのCodeWarriorにしてもIARのEWにしても、最近の統合環境では一々CRTやベクターテーブルから書かなくても良くなっています(勿論好みでそうしても良い)。 それらと比較してそれでも簡単と言う話でしょうか。しかしArduinoにはデバッカーが無いのでこれら統合開発環境と比較した場合、むしろ、、、しーーーーー。
投稿後はこちらから連絡が必要でした。
まあそれはそれとして、masatoさん情報を元に改良してみました。
直接send関数を呼び出すことは叶わなかったので、Client.cppに小細工を入れました。(やはりC++の勉強が必要だな)
まずClient.cppには以下のメソッドを追加
void Client::bwrite( const uint8_t *buf, int size ) { send(_sock, buf, size ); }
Client.hには以下のプロトタイプ宣言を追加
void bwrite( const uint8_t *buf, int size );
それで実際に改造したスケッチが以下です。
/* * Web Server * * A simple web server that shows the value of the analog input pins. */ #include <Ethernet.h> #include <string.h> #include <stdlib.h> #include <stdio.h> char *buf; const byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; const byte ip[] = { 192, 168, 1, 177 }; const char http_head[] = "HTTP/1.1 200 OK\r\n" \ "Content-Type: text/html\r\n\r\n" \ "<h3>designed by hamayan</h3>\r\n"; Server server(80); void setup() { Ethernet.begin( (uint8_t *)mac, (uint8_t *)ip); server.begin(); buf = (char *)malloc( 80 ); } void loop() { Client client = server.available(); if (client) { // an http request ends with a blank line boolean current_line_is_blank = true; while (client.connected()) { if (client.available()) { char c = client.read(); // if we've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so we can send a reply if (c == '\n' && current_line_is_blank) { // send a standard http response header client.bwrite( (const uint8_t *)http_head, sizeof( http_head ) - 1 ); // output the value of each analog input pin for (int i = 0; i < 6; i++) { sprintf( buf, "analog input %d is %d <br />\r\n", i, analogRead(i) ); client.bwrite( (const uint8_t *)buf , strlen( buf ) ); } break; } if (c == '\n') { // we're starting a new line current_line_is_blank = true; } else if (c != '\r') { // we've gotten a character on the current line current_line_is_blank = false; } } } // give the web browser time to receive the data delay(1); client.stop(); } }
もろにC言語ですね。まあ私は組み込みの人間なので全然気にならないのですが。
パケットモニタ(PacMon)のキャプチャ画面を見れば判る様に、前回は1画面で収まらず、えらいスクロールしないとFINまで到達できませんでしたが、今回は1画面で全てのやり取りが完了しています。
まあ静的なページの表示ではなくCGIなのでforループの分だけパケットが増えていますが、これ位は許容範囲でしょう。
すっきりしましたね。
※追記
考えてみれば関数のオーバーライドができるんだから、
void Client::write( const uint8_t *buf, int size ) { send(_sock, buf, size ); }
Client.hには以下のプロトタイプ宣言を追加
void write( const uint8_t *buf, int size );
の方がよっぽどC++らしいですね。
前から気になっていたのですが、よくArduinoの事を簡単、簡単と説明されるのですが、一体何に対して”簡単”なのでしょう。統合環境上の開発ならArduino環境よりも便利な物が沢山あるのですが、例えばルネサスのHEWにしても、フリースケールのCodeWarriorにしてもIARのEWにしても、最近の統合環境では一々CRTやベクターテーブルから書かなくても良くなっています(勿論好みでそうしても良い)。 それらと比較してそれでも簡単と言う話でしょうか。しかしArduinoにはデバッカーが無いのでこれら統合開発環境と比較した場合、むしろ、、、しーーーーー。
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 濱原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
Arduino Ether Shieldに早速PINGを撃ち込め!ブラウジングさらせ!、、、 バグ? [ATmarquino Arduino]
chip1 Stopからいらした方、Arduino関連カテゴリをお試しください。http://hamayan.blog.so-net.ne.jp/archive/c2300498101-1
画像はクリックすると拡大できます。
バグ?
ネットワーク物の接続状態や限界を確認するもっとも手軽で、少なくとも同じLAN上でエラーなんぞ発生していたら、ちょっとWAN上での利用は微妙ではない?チェックであるPINGを打ってみた結果がこれです。
まずは普通にPINGを打ってみます。デフォルトのデータサイズは32byteでこれは問題ない様です。そのままデータサイズを増やしていくと119byteまでは問題ない様です。32byteの返信も大体300μs位で返してくるのは流石ハードウエアプロトコルスタックと言えるのかもしれません。
ところが120byteになったとたんミスコンペアを発生しています。おやおや?。
120byte送ったら、確かに120byte返して来ているのですが、キャプチャ画面の様にオフセット119、つまり一番最後のデータがこけている事がパケットモニタでも確認できます。
さて、プロトコルスタックはこのWIZnetのW5100と言うICが実行している筈なので、このICのバグなんでしょうか?。それとも、、、。
W5100のマニュアルを読むと概要のところに16Kbyteのバッファの事が書いてあるので、まさか120byte程度のデータも受信できないなんて事は無いよね。
もう少しマニュアルを読んでみるか。
次に進みます。
Arduino-0015のサンプルのWEBサーバーを実行させてみました。
4枚目の画像です。まあこんな感じでしょうかね。一見!まともに動いているように見えます。
ですが裏ではものすごい事が起きています。
なんとこのサーバー、一文字一文字パケットで送ってきます。言い換えると、一回のパケットにはTCPなら最大1460byte詰め込めますが、実際に送って来るのは1byteだけです。(※しかも1byte毎にPSHしている)
最後の画像はパケットモニターの画面ですが、60byteのパケットが延々と続いているのが判ります。60byteの中身の大半はヘッダーとパディングです。ハイライトしている行の直前の465byteはブラウザからのリクエストです。
普通、この程度のWEB情報なら1回か2回のパケットの送信で完了します。
これはちょっとトホホではないでしょうか。LANなら良いですが、インターネットに接続できません。あまりにもひんしゅくで。
スケッチを見る限りは1byte毎に送るなんて想像も付きませんが、なんでこうなっちゃうんだろう?。
※Serial.printlnから派生しているっぽいから、ブロックデバイスではなくキャラクタデバイス扱いになっちゃうんだろうか?、まあC++詳しく知らないからなんとも言えないけれど。
画像はクリックすると拡大できます。
ネットワーク物の接続状態や限界を確認するもっとも手軽で、少なくとも同じLAN上でエラーなんぞ発生していたら、ちょっとWAN上での利用は微妙ではない?チェックであるPINGを打ってみた結果がこれです。
まずは普通にPINGを打ってみます。デフォルトのデータサイズは32byteでこれは問題ない様です。そのままデータサイズを増やしていくと119byteまでは問題ない様です。32byteの返信も大体300μs位で返してくるのは流石ハードウエアプロトコルスタックと言えるのかもしれません。
ところが120byteになったとたんミスコンペアを発生しています。おやおや?。
120byte送ったら、確かに120byte返して来ているのですが、キャプチャ画面の様にオフセット119、つまり一番最後のデータがこけている事がパケットモニタでも確認できます。
さて、プロトコルスタックはこのWIZnetのW5100と言うICが実行している筈なので、このICのバグなんでしょうか?。それとも、、、。
W5100のマニュアルを読むと概要のところに16Kbyteのバッファの事が書いてあるので、まさか120byte程度のデータも受信できないなんて事は無いよね。
もう少しマニュアルを読んでみるか。
次に進みます。
Arduino-0015のサンプルのWEBサーバーを実行させてみました。
4枚目の画像です。まあこんな感じでしょうかね。一見!まともに動いているように見えます。
ですが裏ではものすごい事が起きています。
なんとこのサーバー、一文字一文字パケットで送ってきます。言い換えると、一回のパケットにはTCPなら最大1460byte詰め込めますが、実際に送って来るのは1byteだけです。(※しかも1byte毎にPSHしている)
最後の画像はパケットモニターの画面ですが、60byteのパケットが延々と続いているのが判ります。60byteの中身の大半はヘッダーとパディングです。ハイライトしている行の直前の465byteはブラウザからのリクエストです。
普通、この程度のWEB情報なら1回か2回のパケットの送信で完了します。
これはちょっとトホホではないでしょうか。LANなら良いですが、インターネットに接続できません。あまりにもひんしゅくで。
スケッチを見る限りは1byte毎に送るなんて想像も付きませんが、なんでこうなっちゃうんだろう?。
client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); // output the value of each analog input pin for (int i = 0; i < 6; i++) { client.print("analog input "); client.print(i); client.print(" is "); client.print(analogRead(i)); client.println("<br >>"); }
※Serial.printlnから派生しているっぽいから、ブロックデバイスではなくキャラクタデバイス扱いになっちゃうんだろうか?、まあC++詳しく知らないからなんとも言えないけれど。
イタリアから熱いあいつがやって来た [ATmarquino Arduino]
chip1 Stopからいらした方、Arduino関連カテゴリをお試しください。http://hamayan.blog.so-net.ne.jp/archive/c2300498101-1
Chip One StopさんからArduino Duemilanove(読めない)が送られてきました。どうも、有難うございます。
ついでに気になっていたEther Shieldと、配送料無料とするべく調整用にシリアルEEPROM(M25P40-VMN6P)も注文です。
このシリアルEEPROMはインタフェースのColdFire Ethernet基板に搭載できる奴です。なんかいっつもここ空いていて気になって仕方が無かったので、買ってみました。4Mbit有るので、フォントデータを入れたり、写真を入れたりできますしね。
今、国内や海外に沢山通販で電子部品を購入できることろがありますが、その中でもChip One Stopさんは「お!こんなICも取り扱っているんだ!」とか、さんざん探し回って「やっと見つけたよこの部品!」と、普通は代理店を通さないと購入できないようなマニアックなパーツが売っているところが魅力ですね。
ColdFire Ethernet基板、Ether Shield、それにNavajoの3種類のネットワークマイコンボードが揃ったので、色々比較しながら遊んでみようかと思っています。
ついでに気になっていたEther Shieldと、配送料無料とするべく調整用にシリアルEEPROM(M25P40-VMN6P)も注文です。
このシリアルEEPROMはインタフェースのColdFire Ethernet基板に搭載できる奴です。なんかいっつもここ空いていて気になって仕方が無かったので、買ってみました。4Mbit有るので、フォントデータを入れたり、写真を入れたりできますしね。
今、国内や海外に沢山通販で電子部品を購入できることろがありますが、その中でもChip One Stopさんは「お!こんなICも取り扱っているんだ!」とか、さんざん探し回って「やっと見つけたよこの部品!」と、普通は代理店を通さないと購入できないようなマニアックなパーツが売っているところが魅力ですね。
ColdFire Ethernet基板、Ether Shield、それにNavajoの3種類のネットワークマイコンボードが揃ったので、色々比較しながら遊んでみようかと思っています。
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 濱原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
Interface (インターフェース) 2009年 06月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2009/04/25
- メディア: 雑誌
ATmarquinoにガイダンス機能を [ATmarquino Arduino]
だが、何度もやってると鬱陶しくなって来るので、表示する/しないを選択出来る様にしておこう。
下はおまけの画像。残念な事にROMサイズが足りなくてアニメーションの実現が困難な事に。
コマ絵を作るのが大変で嫌になっちゃった!とも言えるけれど。
それと、以下のセミナーに行って来ました。過去もそうだけれどイベントでのsimさん遭遇率高し!。今回もね。
http://hamayan.blog.so-net.ne.jp/2009-05-08-1
質疑応答の時間で、Arduino環境をIDEを使わずにコマンドラインとかで開発できないか?と言った質問が出ていたけれど、殊このArduino環境に関してはIDEを使わないメリットは感じられないなぁ。そりゃArduinoで実際にコンパイルを行うのはTOOL見れば判る様にAVR-GCCなので、はなっからGCCで開発する気になれば可能でしょうけれども。
正直言ってAVRの様な小規模のマイコンでC++を使うメリットがよく判らなかったけれど、このArduinoのIDEを使っていると「小規模開発でもC++良いかも~~~」と思ってしまいます。C++、勉強し直してみようかな。
※つまりArduinoの開発はC言語ではなくC++で行っていると言った方が正しいと思う。
と言う訳でChip One StopさんもArduinoの販売を手掛ける事となりました。
Making Things Talk -Arduinoで作る「会話」するモノたち
- 作者: Tom Igoe
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/11/17
- メディア: 大型本
Arduinoのバンドギャップの読み出しエラーについて [ATmarquino Arduino]
今回は基準電圧をVCC(電源電圧)として変換し、バンドギャップの値を読み出す事で正確な電源電圧を求め、更にアナログ入力0に入った別の電源系統の電圧を求めた電源電圧から算出すると言う処理をし、、、しようと思ったのですが何故か上手く行きません。さて、、、。
例えば以下の様なスケッチを作成してA/D変換した値をシリアルに出力してみます。
すると一枚目の図の様な結果となってしまいました。本来バンドギャップの値は1.1VなのでA/D変換の結果は341近辺である必要があります。ですが実際に読み出した値はその3倍近い値となってしまいました。
/*************************************************************************/ /* バンドギャップの値は読み出せるか? */ /* designed by hamayan since 2009/04/25 */ /*************************************************************************/ #define BAND_GAP_CH 14 #define ANALOG_CH_0 0 #define ANALOG_CH_1 1 #define ANALOG_CH_2 2 #define ANALOG_CH_3 3 void setup() //初期化 { pinMode( ANALOG_CH_1 + 14, OUTPUT ); //出力に設定 pinMode( ANALOG_CH_2 + 14, OUTPUT ); //出力に設定 pinMode( ANALOG_CH_3 + 14, OUTPUT ); //出力に設定 digitalWrite( ANALOG_CH_1 + 14, HIGH ); // digitalWrite( ANALOG_CH_2 + 14, LOW ); // digitalWrite( ANALOG_CH_3 + 14, HIGH ); // Serial.begin( 38400 ); //ボーレートは38400bpsとする } void loop() //ループとはなっているが、実際にはここを抜けてからまた戻っている { volatile unsigned short an[4]; volatile unsigned short gap; an[0] = analogRead( ANALOG_CH_0 ); an[1] = analogRead( ANALOG_CH_1 ); an[2] = analogRead( ANALOG_CH_2 ); an[3] = analogRead( ANALOG_CH_3 ); gap = analogRead( BAND_GAP_CH ); Serial.print( "AN0=" ); Serial.print( an[0], DEC ); Serial.print( " AN1=" ); Serial.print( an[1], DEC ); Serial.print( " AN2=" ); Serial.print( an[2], DEC ); Serial.print( " AN3=" ); Serial.print( an[3], DEC ); Serial.print( " GAP=" ); Serial.println( gap, DEC ); delay(1000);//1秒待つ }
ATmega168のA/D変換器は複数の入力チャンネルの変換を行う事ができますが、複数の入力毎に専用の変換器がある訳でなく、内部でアナログマルチプレクサ(アナログスイッチ)によって入力元を切り替えながら一つの変換器で変換を行っています。また変換中に入力レベルが変動する事を防ぐ為に変換器の直前にはホールドコンデンサが有ります。
複数の入力を切り替えながら使用した場合、スイッチの切り替え時に急に入力レベルが変動したり、場合によっては一瞬ですが、ホールドコンデンサから入力元に電気が逆流する可能性もあります。
こうした変動に対して入力元では出力インピーダンスを低くしてその変動の影響を最小限にしたりするのですが、どうやらそれがバンドギャップでは上手く行かなかったのでは?と想像できます。
つまりバンドギャップの値がANALOG_CH_3の値に影響を受けていると言う事です。
そこで暫定的な対策として一回ダミーの読み出しを行い、さらにちょっとだけ変換開始を遅らせて見ることにしました。
gap = analogRead( BAND_GAP_CH );
を以下の様にしただけです。
gap = analogRead( BAND_GAP_CH ); //ダミーの読み出し delay( 2 ); //遅延 gap = analogRead( BAND_GAP_CH );
一回目のダミーの読み出しでスイッチを開き、レベルが安定した頃を見計らって二回目の変換結果を利用しています。
その結果が二枚目の図なのですが、かなり改善されている事が判ります。
そこで気になってArduinoのanalogReadライブラリを見てみました。wiring_analog.cに有ります。
int analogRead(uint8_t pin) { uint8_t low, high, ch = analogInPinToBit(pin); // set the analog reference (high two bits of ADMUX) and select the // channel (low 4 bits). this also sets ADLAR (left-adjust result) // to 0 (the default). ADMUX = (analog_reference << 6) | (pin & 0x0f); // without a delay, we seem to read from the wrong channel //delay(1); // start the conversion sbi(ADCSRA, ADSC); // ADSC is cleared when the conversion finishes while (bit_is_set(ADCSRA, ADSC)); // we have to read ADCL first; doing so locks both ADCL // and ADCH until ADCH is read. reading ADCL second would // cause the results of each conversion to be discarded, // as ADCL and ADCH would be locked when it completed. low = ADCL; high = ADCH; // combine the two bytes return (high << 8) | low; }
delay(1)がコメントアウトされています。同様の問題を意識してはいた様ですね。
※アナログ入力で原因不明の怪しげな現象に出くわしたら、ちょっとこの事も思い出してくださいね。
※山根さんは日本のAVR界の第一人者(日本にあまりAVRが普及していない頃、その普及の為に頑張っていた。)なので、以下の本はお勧めです。AVRで判らない事があった時に結構役に立ちます。
AVRマイコン・リファレンス・ブック―AVRのCPUアーキテクチャ、豊富な内蔵周辺機能を詳細解説 (マイコン活用シリーズ)
- 作者: 山根 彰
- 出版社/メーカー: CQ出版
- 発売日: 2006/03
- メディア: 単行本
アーデュイーノ互換マイコン・ボードを作る (プリント基板付き電子工作解説書シリーズ)
- 作者: 小坂 貴美男
- 出版社/メーカー: CQ出版
- 発売日: 2009/04
- メディア: 単行本