2号機開発がなかなか進まない
このところ電子工作以外のことに時間をとられたこともあるが、LPCMプレーヤーの2号機の開発は殆ど進展していない。気分が乗るときは夢中になるのだが、波がある。Olimexの休みの話を聞いて出鼻をくじかれたのと、EAGLEのパーツ作りが思うように行かず、ちょっとスランプ状態に入ったようだ。
それでも、手を動かしていないと落ち着かない性分になってしまったので、2号機の実装に必要な機能のテストを少しづつやっている。
ソフトパワースイッチの落とし穴(7/23/09)
擬似コーディングでソフトパワースイッチの骨格はできた。しかし、このときに使うsleepのパワーダウンモード(セーブモードよりもっと節電)を実際に動かしたことはまだ一度もない。がた老AVR研究所では、初期の頃の電池からDCアダプターを電源に使うようになって、節電に余り気を使わないようになっていた。これまで使っていたsleepはすべてアイドルモードである。正式に組み込む前にこのパワーダウンモードが動くか確かめておいたほうが良い。
最近のAVRプロセッサーで名前の末尾がPで終わるチップは、Pがピコワットの頭文字であるように、これまで以上の省電力をうたっている。データシートを見てみるとMega168Pのパワーダウンモード時の消費電流は何と0.1μAである。ボタン電池あたりの自己放電電流の1/10である。これなら大威張りでソフトパワースイッチに出来るというものだ。
ソフトパワースイッチを組み込む対象のLPCMプレーヤーはブレッドボード上に一式残っているが、いきなり入れて混乱するのを避け、実装は直近のミニLCDのテストプログラムで行うことにした。
データシートには丁寧な解説があるし、そんなに難しい処理があるわけでもない。最初は気楽に考えて実装に入った。しかし、考えていたことを実際に動くようにすることはやっぱりそう簡単ではなかった。しかも大きな考え落ちを見つけて気分が重い。
周辺のタイマーも全て止まっているパワーダウンモードからCPUが目覚めるのは外部割込みだけである。外部割込みは周波数カウンターや、初期のTinyなどで何度も経験済みだ。これまでのプログラムからコードをとりだし、レジスターをMega168用に取り替える。鼻歌交じりでブレッドボードにタクトスイッチをつける。ものの1時間もかからない。簡単に動くと思った。しかし、これが動かないのである。
仕方がない。モニターにUARTメッセージを出すステートメントを入れて(いわゆるprintf)デバッグに入る。おやあ、スイッチを押しても割り込みルーチンに処理が来ていないぞ。割込みそのものが起きていない。データシートをもう一度見直す。やれやれ「データシートは穴が開くほど見よ」である。データシートに明記してあった。パワーダウンモードは確かに外部割込みでsleepから目覚めるが、目覚めるのは「外部割込みのレベル割込み」だけなのだ。こちらはスイッチの「立下り」を一生懸命待っていた。
あわてて割込み条件を「Lowレベル」にする。と、今度は、スイッチが押されている間中割り込みが入り、長押しの時間を測るどころではない。うーむ、困った。まさしく考えたようにコンピューターは動かない。書いたようにしか動かない。
これで良いのかどうかわからないが、割り込みが来れば、割り込み条件をただちにレベル割り込みから立下り割り込みに換え(このあとの制御に使うため)、割り込みリクエストをクリアし、次のパワーダウンsleepに入る前にもう一度レベル割込みに戻すコードを付け加える。よーし、2秒長押しで電源が入った。今度は電源断のルーチンだ。でもその前にどれくらいの消費電流になっているか調べてみよう。テスターを取り出す。
まず実行時で6mA程度。電源をOFF/ONしパワーダウンモードにする。何い、パワーダウンしても3mA以上流れているぞ、LEDか?いやそんなものつけていない。LCDか。しまった。CPUはパワーダウンしてもLCDの電源は入ったままだ。これはいかん。こいつの電源もCPUで制御しないとソフトパワースイッチにならない。これは大きな考え落ちだ。
それはとにかく、LCDをブレッドボードからはずす。何と、電流が変わらない。この電流はLCDではない。プルアップ抵抗?まさか。はずしてみる。変化なし。とすると、あとはPCとつないでいるISPケーブルしかない。このテストプログラムは、ISPを利用したUARTをモニターにしている。ええー、こんなところに電流が流れるの?PCの端末プログラムは動かしていない。
電流の主はやっぱりISPケーブルだった。こいつをはずすと、150μAに激減した。LCDをはずすと0.4μA。やれやれやっとスペック(0.1μA)に近い消費電流に落ちた。あとはプルダウン抵抗を通してCPUやLCDに流れ込む電流だろう。ミニLCDの消費電流の150μAは優秀だけど、これを流しっぱなしにするわけにはいかない。
LCDの電源をパワーダウンモードと同時に切る必要が出てきた。いくらCPUがμA以下でも、周辺機器に150μAも流れれば何にもならない。FETか何かで切る必要がある。しかし、今度の2号機はもうスペースがない。やっぱりスライドスイッチを使うのか。
次の日、電源断のロジックも入れてソフトパワースイッチのテストプログラムは完動した。2号機にソフトパワースイッチを実装するかは微妙になってきた。周辺機器の電源制御は結構厄介で、下手な制御をすると、予期しないところに電流が流れて誤動作したり、ひどいときにはCPUそのものをこわしてしまったりする(どちらも経験済みだ)。スライドスイッチはケースの上蓋や、余裕のある半田面のケース側につけようと思えばつけられる。
それに「でんし研」のTADさんからのコメントで、プリント基板発注のOlimexが8月一杯夏休みで注文を受け付けてくれないということがわかった。これは計画を大幅に作り直す必要がでてきた。流れはスライドスイッチを入れた手配線版を実装する方向に傾きつつある。
いつのまにか動いたミニLCD(7/24/09)
2号機のLCDの換装のテストをした。ブレッドボードにあるLPCMプレーヤーから秋月の「超小型」LCDとDC-DCコンバータをはずし、さらに小さいストロベリーリナックスのミニLCDをセットする。ハードはいたって簡単。インタフェースはI2Cなので、これまでのパラレルのデータ4本、制御線3本、それに電源、グランド合わせて9本のケーブルに対して、信号線2本、電源も含めて4本をつなぐだけである。ずいぶんすっきりした。
ソフトのほうは先に公開したミニLCDのライブラリを入れて、メインのLCD関数をミニLCDのものに換える。たいした手間ではない。テストに入る。全く反応なし。まあ、こういうのには慣れている。コードをもう一度見直す。どこも間違っていない。それでも動かない。段々頭に血が昇ってくる。いかん、いかん。落ち着いて最初から見直そう。
基本的なところからチェック。電源は入っている。暴走はしていない。スイッチは反応して音楽は通常に演奏する。それではと、こういうときのためのUARTを復活させる。ありゃ、やっぱり初期化でエラーが出ている。ロジアナを持ち出す。いやちゃんとI2Cは動いている。
こうなったらデバッグステートメントてんこもりだ。I2CのsendコマンドにUARTの出力をぶちこむ。盛大に送信データとリターンコードがPCに流れる。おやあ、正常終了だぞ。あ、画面が出ている。何も他に変えていない。UARTでI2Cコマンドのタイミングが遅くなったので動いたのか。デバグステートメントをはずしてみる。何と何と、正常に表示するではないか。原因がわからずに動いてしまった。気分が悪い。
日を空けて原因究明にとりかかる。このライブラリは公開しているので責任がある。いつのまにか動くということは、また、いつのまにか動かなくなるということを意味する。放っておくわけにはいかない。自慢にもならないが、こういうときの粘着質には人には負けない自信がある。気分を落ち着けて、動くまでのひとつひとつの工程を思い出し、手順を戻してテストしていった。
その結果、LCDのリセットピンを浮かしたまま、リセットをしないモードで動かすと、LCDが動かなくなることを確かめた。リセットをしないのなら、このピンは確実にHigh(Vcc直結)にしておく必要があるが、最初の頃は確かに何も接続していなかった。
UARTを入れたりするデバッグの最中、リセットピンもついでに配線してリセットありでコンパイルした記憶がある。このときはUARTの初期化を間違えて端末にメッセージが出なかったため、すぐコンパイルし直したが、LCDの方は確認していなかった。
恐らくこのときに動いたのだろう。リセットをするか、リセットピンをinactive(High)にしてどちらも動作することを確かめ問題は解決した。いやいや慌てることはデバッグの一番の敵である。
ミニLCDの印象である。文字は小さいが視認性は悪くない。1行目のアイコン表示のところに何も表示されないので、少し間が抜けているが、アンテナや電池などのアイコンはどうも今回のプレーヤーには役に立ちそうにない。採用は見送ることにする。
scan_files( )の機能を落とす(7/27/09)
機嫌よく、ブレッドボードの2号機用のLPCMプレーヤーを鳴らしてテストするうち、1枚のSDカードで暴走しシステムリセットがかかるようになった。TinyFatFSでは問題がなかったカードである。今度のFatFSのバージョンアップによる不具合であることは明らかだ。
しかし、このカードで動かなくなる原因には心当たりがある。ディレクトリがあるカードである。現在のLPCMプレーヤーはルートディレクトリ上のWAVファイルしか演奏対象にせず、ディレクトリ以下のファイルは無視しているが、レジューム機能のときにSDカードを特定するため、ファイルサイズとファイル数をChaNさんのFatFSの内部関数scan_files( )を使ってサブディレクトリ下のファイルまで全部数え上げている。
scan_files( )の仕様が変わったのだろうか。ディレクトリのアトリビュートにロングファイルネームのオプションが入ったのが気になる。ソースコードを調べる。全く変わっていない。UARTを入れてシステムリセットがかかる原因を調べていく。
予想通り、scan_filesで暴走していることが確かめられた。UARTをさらに奥深く入れて検証する。おやあ、このディレクトリはさらに下にまだディレクトリを持っているぞ。あああ、わかった。スタック領域がSRAMを潰しているのが原因にちがいない。このscan_files( )は自分で自分を呼ぶ、再帰構造になっており、これは大量のスタックデータを消費する。
TinyFatFSからFatFSに上げてSRAMが残り少なくなっていた(90%)のが気になっていたが、やっぱり駄目だったか。試しに、このディレクトリの構造を一段少なくすると暴走しなくなった。これが原因であることは間違いない。
ルートディレクトリのファイルしか見ていないのに、scan_files( )で全部のファイルを調べる必要はない。過剰品質である。しかし、見事な美しい作りなのでオリジナルを生かしたままにしておいたのが仇になった。泣く泣く、scan_files( )に手を入れて、ルートディレクトリだけのファイルを数えることにする。これでどんなに複雑なディレクトリ構造のカードでも暴走はしないはずである。
2号機に向けてのソフト開発はこれで一段落したようだ。今回はソフトパワースイッチは実装を見送ることにする。残るは、手配線に着手するか、EAGLEをさらに攻めるかである。
上記トラブルは、ディレクトリのないSDカードでは発生しません。もしディレクトリがあるSDカードで、ディレクトリの階層が深い(3段以上)ときは、メインファイル(SDPCM328V3.c)の193行目にある、scan_files(char* path)の以下のステートメント4行をコメントアウトしてください。これでscan_filesはルート上のファイル、ディレクトリしか数えませんが実用上は全く問題ありません。
if (finfo.fattrib & AM_DIR) {
acc_dirs++;
// *(path+i) = '/'; strcpy(path+i+1, &finfo.fname[0]);
// res = scan_files(path);
// *(path+i) = '\0';
// if (res != FR_OK) break;
} else { .........
(以上)
| 固定リンク
| コメント (0)
| トラックバック (0)
最近のコメント