前回GPSロガー製作日記6で紹介したGPSレシーバ(まだロガーじゃないですよ!)の失敗談などを書きます。
今回のテーマは
1.tiny2313のSRAMの少なさはマジヤバイ
2.低ドロップレギュレータの出力は発振に注意
です。
1.ATtiny2313のSRAMの少なさ
ATtiny2313のプログラムメモリたるFLASH領域はデータシートのとおり2KBです。これはかなりの小ささで、プログラムのコンパイル時にはこれを超えないかどうか常にハラハラです。しかし、それを上回ってスタック・ヒープたるSRAMの大きさはさらにひどいです。いわゆるPCで言う「主記憶」の一部なわけですが、これが
128B
です。冗談じゃありません。KももちろんMも抜けてませんよ。正真正銘1byteのchar型なら128個のみのSRAMです。
実はこれに気づかないまま、位置情報の表示と、速度情報の表示を行おうとしていたのですが、どうにも意味のわからないバグが起きる。プログラムの下流のほうで式をいじると、明らかにそことは関係のない上流の処理がスキップされたりする。
かなり激しく悩んで、K氏に打ち明けたのですが、tiny2313について説明している間に、データシートのSRAMの小ささに気づき、「メモリオーバー」なる現象に見舞われていることがわかりました。
主記憶なんて、やれ「2GB」だ、やれ「4GB積んだけど、どうせ3GBしか認識しないぜ」だ、みたいな話しかしません。PC上でプログラムを長いこと組んでいますが、メモリがわずかに32MBしかなかった時代ですら、Linuxではスタック用のメモリが不足するなんて経験したことなかったのです。
char buf[ 64];
などと書こうものなら、メモリの半分を消費してしまうことについては認識不足でした。
ということでtinyなどの小規模マイコンを使うときは変数の使いすぎによるメモリオーバーに特に注意が必要です。
マイコンのメモリ構造について
勉強不足から間違ったことを書いている可能性がありますが

AVRでは低位のメモリ(メモリ番地の若い場所)から高位メモリ方向の順に
汎用レジスタ
IOレジスタ
内臓SRAM
の順で並んだメモリ空間を持っています。
そして、スタックポインタ(SP/SPL)は
「ス タ ッ ク が高位メ モ リ から低位メ モ リ へ伸長するよう に実行される」
Hiroさんの翻訳版tiny2313データシートより
とありますので、デフォルトではSPは0xDFから、スタックに積みあがるごとに低位メモリに伸びていくはずです。
つまりSRAM上でメモリオーバーを起こすと、IOレジスタや汎用レジスタが破壊されかねないということのようです。
2.低ドロップレギュレータは発振に注意
症状:
判定法:
解決法:
原因:
3端子レギュレータは不安定な高電圧電源から安定した低電圧電源を作り出す部品です。
ですが、正しい使い方をしないと、安定な電源を供給できるどころか、もとの電源にはない発振をおこしてしまいます。

電源側のC1は0.1uFと小さくてよいのですが、
出力側のC2は100uFの電解コンデンサが必要のようです。
出力側の負荷が大きく大電流を流す場合は、C2はさらに低ESRでないと低ドロップタイプのレギュレータである48xxは発振してしまうようです。
部室のオシロスコープで発振していることが判明しましたが、手持ちにはアナログの電圧計しかありません。ですが、アナログ電圧計でもC2が不足しているときは平均電圧が下がる傾向にあるらしいので検知することができると思います。
ちなみに
「4805や48033など低ドロップレギュレータを使っているときにマイコンが誤作動をした」→
「レギュレータの出力が発振していないか、まず疑ってかかる」
という思考回路は、マイコン野郎の中ではかなり常識のようです。
今回のテーマは
1.tiny2313のSRAMの少なさはマジヤバイ
2.低ドロップレギュレータの出力は発振に注意
です。
1.ATtiny2313のSRAMの少なさ
ATtiny2313のプログラムメモリたるFLASH領域はデータシートのとおり2KBです。これはかなりの小ささで、プログラムのコンパイル時にはこれを超えないかどうか常にハラハラです。しかし、それを上回ってスタック・ヒープたるSRAMの大きさはさらにひどいです。いわゆるPCで言う「主記憶」の一部なわけですが、これが
128B
です。冗談じゃありません。KももちろんMも抜けてませんよ。正真正銘1byteのchar型なら128個のみのSRAMです。
実はこれに気づかないまま、位置情報の表示と、速度情報の表示を行おうとしていたのですが、どうにも意味のわからないバグが起きる。プログラムの下流のほうで式をいじると、明らかにそことは関係のない上流の処理がスキップされたりする。
かなり激しく悩んで、K氏に打ち明けたのですが、tiny2313について説明している間に、データシートのSRAMの小ささに気づき、「メモリオーバー」なる現象に見舞われていることがわかりました。
主記憶なんて、やれ「2GB」だ、やれ「4GB積んだけど、どうせ3GBしか認識しないぜ」だ、みたいな話しかしません。PC上でプログラムを長いこと組んでいますが、メモリがわずかに32MBしかなかった時代ですら、Linuxではスタック用のメモリが不足するなんて経験したことなかったのです。
char buf[ 64];
などと書こうものなら、メモリの半分を消費してしまうことについては認識不足でした。
ということでtinyなどの小規模マイコンを使うときは変数の使いすぎによるメモリオーバーに特に注意が必要です。
マイコンのメモリ構造について
勉強不足から間違ったことを書いている可能性がありますが
AVRでは低位のメモリ(メモリ番地の若い場所)から高位メモリ方向の順に
汎用レジスタ
IOレジスタ
内臓SRAM
の順で並んだメモリ空間を持っています。
そして、スタックポインタ(SP/SPL)は
「ス タ ッ ク が高位メ モ リ から低位メ モ リ へ伸長するよう に実行される」
Hiroさんの翻訳版tiny2313データシートより
つまりSRAM上でメモリオーバーを起こすと、IOレジスタや汎用レジスタが破壊されかねないということのようです。
2.低ドロップレギュレータは発振に注意
症状:
- 電流を多く使う機器を入れるとマイコンが誤作動する。
判定法:
- レギュレータの出力が規定値より低い
- レギュレータの出力をオシロスコープで見ると線がぼやける
解決法:
- レギュレータの出力側にコンデンサC2を入れる。C2はできるだけ大きくESRの少ない(つまりは新しい)電解コンデンサを用い、レギュレータに物理的に近い場所に入れるのが良い。
- 解決しない場合、レギュレータを交換する。
原因:
3端子レギュレータがレギュレーションに必要なキャパシタンスが得られず、電力供給が追いつかないため。特に入力電圧が低く、出力電流が多いときに容易に起こる。
3端子レギュレータは不安定な高電圧電源から安定した低電圧電源を作り出す部品です。
ですが、正しい使い方をしないと、安定な電源を供給できるどころか、もとの電源にはない発振をおこしてしまいます。
電源側のC1は0.1uFと小さくてよいのですが、
出力側のC2は100uFの電解コンデンサが必要のようです。
出力側の負荷が大きく大電流を流す場合は、C2はさらに低ESRでないと低ドロップタイプのレギュレータである48xxは発振してしまうようです。
部室のオシロスコープで発振していることが判明しましたが、手持ちにはアナログの電圧計しかありません。ですが、アナログ電圧計でもC2が不足しているときは平均電圧が下がる傾向にあるらしいので検知することができると思います。
ちなみに
「4805や48033など低ドロップレギュレータを使っているときにマイコンが誤作動をした」→
「レギュレータの出力が発振していないか、まず疑ってかかる」
という思考回路は、マイコン野郎の中ではかなり常識のようです。
PR
トラックバック
トラックバックURL: