Hatena::Groupecrafts

Chuckの電子工作

趣味の電子工作を中心に書いています。音関係工作はg:emusic:id:Chuckどうぞ。


検索エンジンより飛んでこられたかたで、お探しのキーワードが見つからないかたは、↑の検索をご利用ください。

2009-02-27

I2C動いた動いた

I2Cがちょっと進展 - Chuckの電子工作 - Ecraftsグループから続き。

地面から縁側(PCINT0)に上げて回して裏で積まれたデータをパースして終わったら返ろうと思ったけれど、考えが浅くてそういう動作をするようにコードが書かれていませんでした(縁側からふたたび地面に降りられない場合があった)。対策が難しいので諦めて地面で回してI2Cで送られたデータをパースするように変更してうまく動くようになりました。

他にもI2Cで受け取ったデータの演算に時間がかかっているうちにはまりこんでしまうこともありました。I2Cスレーブのドライバがクロックストレッチの機能を持っていないためです。

ということで、完成ブツを置いてみました。WinAVR-20080512 でビルドしたものです。

ERROR: The request could not be satisfied

WinAVR-20081205 ではビルドできませんでした。リンク時に、

c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_14':
(.text+0x0): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_default' defined in .vectors section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o
c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_default':
(.vectors+0x0): relocation truncated to fit: R_AVR_13_PCREL against symbol `__init' defined in .init0 section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o
c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_default':
(.vectors+0x2): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_1' defined in .text section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o
c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_default':
(.vectors+0x4): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_2' defined in .text section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o
c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_default':
(.vectors+0x6): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_3' defined in .text section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o
c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_default':
(.vectors+0x8): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_4' defined in .text section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o
c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_default':
(.vectors+0xa): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_5' defined in .text section in osc.o
c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_default':
(.vectors+0xc): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_6' defined in .text section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o
c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_default':
(.vectors+0xe): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_7' defined in .text section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o
c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_default':
(.vectors+0x10): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_8' defined in .text section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o
c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o: In function `__vector_default':
(.vectors+0x12): additional relocation overflows omitted from the output
make: *** [osc2.elf] Error 1

とメッセージがずらりと出てエラーになってしまいました。

リンク時になにか指定を与えてあげる必要があるのかもしれません。とりあえずは波形テーブルの記述位置をずらそうかなと思います(セクションでやるべき?)。

ChuckChuck2009/03/17 22:13特に深く追求していませんでしたが、WinAVR-20090313 にあげたら問題なくビルドできるようになりました。AVR StudioでWinAVRを切り替えられるので便利しています。

トラックバック - http://ecrafts.g.hatena.ne.jp/Chuck/20090227

2009-02-26

I2Cがちょっと進展

AVR312を自前改造したものが、だんだんと原形をとどめなくなっていって、落ち着いて他の実装例を見ることにしました。

5種類ほど見たところで、AVRFreaksにあったAVR312改造版を(by Don Blake)利用してうまくいったような感じ。ソースコードを見比べるに有意な差が見つからないのですが… 落ち着いたらゆっくり自前版の間違いを探そう…

USIなI2Cスレーブのライブラリは割り込みで裏で回っていて、アプリの層は地面でデータの到来を見てパースしてそれに応じた処理を行うということでATtiny2313版が動きました。

本番のATtiny85版では、地面ではタイマ割込みで正弦波データの出力をしており、USIなI2Cのスタート割り込みを貰ったときに地面からPCINT0に飛び上がってそこでループして多重割り込みを受けつつデータの到来を見てパースするということをしています。ATtiny2313版よりも複雑な分、まだ動いていません。1日あたり30分~1時間の取り組みでは足りないようです。

なおArduinoはマスタとして活躍。

ChuckChuck2009/02/26 13:04もう全部地べたで回してsleepで調整するのでいいかも。

トラックバック - http://ecrafts.g.hatena.ne.jp/Chuck/20090226

2009-02-25

先週秋葉原いってきました

  • 千石
    • 半導体ジャンク袋 ¥250
    • なんか特価のP板 ¥50
    • 集合抵抗 10kΩ、20kΩ 特価¥50
    • 47uFタンタル ¥30
    • 1MA可変抵抗器 ¥90
  • マルツ
  • 秋月

0Ω抵抗とフラックス除去剤がささやかな贅沢(笑)。

トラックバック - http://ecrafts.g.hatena.ne.jp/Chuck/20090225

2009-02-23

I2Cがうまくいかない2

I2Cがうまくいかない - Chuckの電子工作 - Ecraftsグループ からの続き。

ATtiny85でやってたUSIなI2CスレーブのプロジェクトからI2Cの通信部分だけをATtiny2313に持ってきて試してみました。マスタにはArduinoWire関数を使ったものを使用。

AVR312をWinAVRに修整したしたもので、デバイスの定義名とか割り込みまわりとかベクタ名とか直して、動かしてみたら、SCLが変;

5μsec(100kHz通信時のクロックのパルス幅)よりもはるかに狭い棘状のパルスが出ていたり、

というのはあいかわらずだったので、AVR312中で、SCLのポートが出力になっているのを止めたところ波形の棘状パルスはなくなりました。

とりあえずAVR312のサンプルと同じ、

  • 1byte受信して送信し返す

というのはうまくいきましたエコーバックは通信の基本?

もう少しスレーブをいじって、

  • 1byte受信して、特定のデータだったら数バイト送信し返す

というのもうまくいきました、マスタとスレーブでやり取りするバイト数は合わせておいて。

しかしながら

  • 1byte受信して、特定のデータだったらさらなる数バイト(固定長)を受信する。全部受信したら送信し返す

というのがうまくいきません。

マスタ側動作は、

Wire.beginTransmission(TEST);
Wire.send(0xAA);
Wire.send(0x01);
Wire.send(0x02);
Wire.send(0x03);
Wire.send(0x04);
Wire.endTransmission();

Wire.requestFrom(TEST, 5);

みたいな感じで書いているんですが、オシロでバスを見ると、

[SLA+W] [0xAA] [SLA+R] SDAがLOW・SCLクロックなしで通信途絶

という感じ。0xAAのときクロックパルス数は8発でACK/NACKが授受されているのか不明。0x01/0x02/0x03/0x04の送信はどうした、マスタ。[SLA+R]が発行されてもスレーブはデータバッファが空なのでスタートコンディション待ちにリセットされています。互いにREAD待ち待ち状態でデッドロック。

ちなみに1バイト Wire.sendのたびごとに beginTransmission, endTransmission で閉じたらうまくいきました。データをバッファにつめて Wire.send(tbuf, 5) みたいに送っても、ACK/NACKを見ないで1バイト目のあと[SLA+R]を発行するマスタ。

なんでそんなところで[SLA+R]が発行されるのかしら。Wireライブラリのコードを読まなきゃだめかなぁ。


と、書いているうちに 通信途絶についてはスレーブがSDA(のポート)を握ったままになっているのかもという気がしてきました、おそらくは0xAA の ACK/NACK用パルスが来ない時点で。また診てみようと思います。

追記

0xAAのところでACK/NACKを見ていないんじゃないかの件、マスタがSCLの立ち上がりエッジで取るなら問題ないのだと理解しました。『マイコンの1線2線3線インターフェース活用入門』にもそういう波形が出ていました。

トラックバック - http://ecrafts.g.hatena.ne.jp/Chuck/20090223

2009-02-20

I2Cがうまくいかない

ATtiny85でI2Cのスレーブを作っています。USIでTWIなSlave。I2Cで周波数を設定する正弦波発生装置。I2C部分はAVRのアプリノートAVR312をWinAVR用にフィッティングしてみました。アプリノートそのまんま適用。

マスタにはArduinoを。先日RTCをうまく叩けたのでその勢いに乗ろうかと(ていうかコード流用?)。

ところがうまくいきません。スレーブアドレスが違っていた、というイベントも踏みつつそこはクリアしましたが、どうにもこうにもニッチもサッチもプルアップ♪

仕方がないのでオシロを出してきて波形を確認したら、SCLがおかしい。5μsec(100kHz通信時のクロックのパルス幅)よりもはるかに狭い棘状のパルスが出ていたり、9発クロックがあるべきところが8発しかきていなかったり。これではスレーブ側もハマッてお黙りになってしまうのもわかるというか。Arduinoのライブラリが悪いのか!?いやいやあれだけみんなで寄ってたかって弄っているプラットフォームだからある程度枯れているとみていいでしょう。

ということは、どこかでスレーブの状態が滑って、SCLを引っ張っちゃったりしているのかも。

んではそろそろICEの出番かなぁ、と思いましたが、ざっとググってみたところではAVR312を使っている人があまりいないような…

とりあえず、WinAVRにフィッティングしたAVR312のコードが動くかどうか、ATtiny2313あたりにシンプルなプロジェクトを起こして試してみよう、そうしようと思いました。早くこいこい、週末休み。

トラックバック - http://ecrafts.g.hatena.ne.jp/Chuck/20090220

2009-02-16

先日のハンダ付け排煙装置

俗・ハンダ付け排煙装置 - Chuckの電子工作 - Ecraftsグループ ののち、手ごろな入れ物を見つけて今はこんな感じになっています。

f:id:Chuck:20090216044550j:image

フタもあったほうが良さそうです。家にたくさんあるアクリル端材で作ってみることにします。

トラックバック - http://ecrafts.g.hatena.ne.jp/Chuck/20090216

2009-02-09

Dimmer検討

CdSで明るさを検知して、それに応じてPWMを動かして液晶表示器のバックライトの明るさを変化させる

その検討をArduinoでやりました。以前組み立てたWEBラジオが夜中はLCDバックライトが眩しいので…

だいたい感じがつかめました。もうちょっと変化のテーブルを見直したところで検討を終え、別の検討のためにArduinoを空けたいと思います。

今回の検討結果は手持ちのAVRを漁って、あればATtiny13*1、無ければ使う予定がないATtiny26にポーティングしてWEBラジオに組み込もうと思います。

*1:ITプラザのAVRマイコン詰め合わせの余りがあったかも

トラックバック - http://ecrafts.g.hatena.ne.jp/Chuck/20090209