Hatena::Groupecrafts

Chuckの電子工作

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


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

2009-09-25

ATtiny2313によるI2Cスレーブ

| 08:20

ATtiny2313によるI2Cスレーブの実装例を探しています。以前kumanさんとがた老さんのところは見たことがあるものの、それ以外では今のところあまり見つかっていません。

最近見つけたのがこちら↓ 7セグメントLEDのI2Cスレーブです。

なにか制約でもあるのかドットなし2桁のスタティック点灯のようです。このスレーブを4つインスタンスして8桁を実現しています。

ATtiny2313でI2Cに2本取られた残り全部使えば7セグメントLED ドットあり 30桁 は行けると思うので、マイコン4つで8桁というのはちょっともったいないですね。

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

2009-09-15

I2Cスレーブをいくつか増やしました

| 08:11

ATtiny2313によるスイッチ/ロータリエンコーダ読み取りスレーブ
no title
ATtiny2313による16bit PWMスレーブ
no title
ATtiny2313による7セグメントのLED表示器スレーブ
no title
ATtiny2313によるLCD表示器スレーブ
no title
ATtiny85による正弦波生成スレーブ
no title

16bit PWM電圧設定スレーブ

作っている電子楽器周辺機器の部品として必要に迫られて、マイコンから電圧を設定できるようにしたくなりました。アナログシンセのオクターブ/ピッチチューニングの電圧を作りだそうとしています。

これまでの経験から8ビットでは明らかに足りない、しかしよくわからないので、16ビットタイマをあてがって、16bitの分解能のPWMとしてみました。

ときおりしも、pcm1723さん(d:id:pcm1723)のところでシグマデルタ変調PWMの実験と評価が成されていた(pcm1723さんの日記を「シグマデルタ変調」で検索)ので、これを利用させていただいて、ON/OFFで切り替えられるようにしつつアプライしました。

以上をATiny2313にI2Cのスレーブとしてまとめました。これまでの一連の ATtiny2313 I2Cスレーブで使っている usiTWIライブラリを使用しています。

f:id:Chuck:20090823103145j:image f:id:Chuck:20090823103142j:image

実際に機器に組み込む時にはアナログフィルタが問題となります。PWM周期が 20MHz/16bit ≒ 300Hz ということでカットオフ周波数をかなり低くしたLPFが必要です。


UIスレーブ

lumさんとチャットしていてアイディアが浮かんだUIスレーブを思い立ったが吉日で形にしました。

マスタからの問い合わせに応じてスイッチとロータリエンコーダの状態をレポートするI2Cスレーブです。余ったポートでLEDを光らせてキー状態として表示できるようにしたり、ブザーをつけたり。ブザーなんかはワンコマンドでクリック音を出せるようにしたり。

これもATiny2313で、usiTWIライブラリ使用です。

f:id:Chuck:20090914043552j:image

マスタをArduinoにして動作チェック。一応は動作したものの反応が鈍いです。とくにロータリエンコーダ。無限ループで回転を検知したらクリック音を鳴らしてシリアルでArduino IDEにレポートするスケッチを書きました。

回転の検知は、ロータリエンコーダの状態取得のコマンドを送ってI2C受信待ちをして受信データをバッファから取り出す、という動作ですがこれまでのスケッチを流用していたもので受信待ちが100msecのディレイにしていたということに今さっき気がつきました。これでは反応が悪いはずです。後日これを Wire.available() のポーリングに変更しなくてはなりません。

ChuckChuck2009/09/17 04:20スイッチ/ロータリエンコーダ読み取りスレーブ がうまいこと動かない状況です。

ChuckChuck2009/09/21 17:01それなりに対策してFS03版としてwikiにアップロード。

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

2009-08-23

AVR Studio 4.16 → 4.16 SP1

| 18:26

結果として問題は、焼けたと思っていたブートローダが焼けていなかった。書き込み時のVerifyは通ってOKを出すくせに、検めて読み直してみるとオールFF、書かれて無いじゃん状態。AVR Studioの書き込みツールで、フューズ設定を変えたりいろいろ試したがダメ。AVR JTAG ICE mk2 でだめ、STK500 でだめ。AVR Dragon を動かすかなぁと考えたところで AVR Studio の新版が出ているのを認めた。それまで使っていたのは 4.16 (build 628) (だったかな)。これに対して 4.16 SP1 (build 633) というのと 4.17 (build 666) というのが出ていた。最初SP1を当てたが、思い直して4.17にバージョンアップして、件のブートローダを書いてファイルに読み出してみたら今度はきちんと書けていた。

Arduino FMラジオ、そしてその後 - 電音の工場ブログ - E-Musicグループ

4.16 SP1 でのリリースノートに記述を発見した。以下のドキュメントの 9510番。

http://www.atmel.com/dyn/resources/prod_documents/ReleaseNotes_AVRStudio4.16SP1.txt

Welcome to AVR Studio 4.16 SP1 (04/2009)
Please see release history for information about earlier releases. 

Part support
The following new parts have been added to AVR Studio since 4.16:
 - ATxmega16D4, ATxmega32D4, ATxmega64D3, ATxmega128D3, ATxmega256D3

New Features
AVR ISP mkII command line SW support for XMEGA device family 

Bug Fixes
9473 Programming dialog - Empty Flash's .hex file read-back after programming and verification
9510 Programming dialog - Cannot program a bootloader
7966 Partdescriptionfile - ATmega329P signature wrong.
9291 Online help - Misguidance in AVR Studio Help-->AVR Studio User Guide-->Getting Started--  >Debugging external code projects
9545 Partdecriptionfile - Wrong package type in partdescription file of ATmega640
9505 STK600 programming support - ATmega640 needs STK600 support
9509 The include file for ATxmega128A1 contains errors. Several lines have been merged to one big line. 
9528 Wrong fuse description in ATtiny48/88. Low fuse byte should not contain CKSEL3 and CKSEL2.

 
Note
Windows 95 is no longer supported by AVR Studio. The most recent version that supported Windows 95 was AVR Studio 4.12 SP3.

senshusenshu2009/08/30 09:14このことだったのですね。選択肢は複数あるのがよい、というのは同感です。
大変勝手ですが、私の掲示板にも、ここのページを紹介しました。
ご容赦ください。(できればご覧ください)

ChuckChuck2009/08/31 07:42senshuさん、お知らせありがとうございます。早速お邪魔させていただきました。今後ともよろしくお願いいたします。

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

2009-03-11

Hey, Charlie!

さらに勢いづいて7セグメントのLED表示器スレーブを作ろうとしています。

ここのところのI2Cスレーブ活動まとめ - Chuckの電子工作 - Ecraftsグループ

9本線で9個の7セグメントLEDをドットも含めて表示させようというもので、技的にはいわゆるCharlieplexing(Charlieplexing - Reduced Pin-Count LED Display Multiplexing - Application Note - Maxim)によるLEDの制御をするつもりです。

何年か前にこの方法を知りましたが試してみたことはありませんでした。ここのところEDN誌のdesign ideasに、たてつづけにCharlieplexingを拡張させたものが載ったので急にやる木がすくすくと育ちました。

ところで google:Charlieplexing 7segment と検索をすると出てくる記事をいくつか読むと、LEDの電流制限抵抗を省いているものがあったりして*1。なかにはセグメントごとにトランジスタで電流供給してLED群を経てマイコンにシンクする回路で、LEDの電流制限抵抗もトランジスタのベース電流制限抵抗もない記事もあったりしました。

私としてはそういうのは怖いのでちゃんと抵抗を入れることにして実験してみました。

f:id:Chuck:20090311044337j:image 実験の様子

(希望があればいずれ回路図も掲載します)

3線で6個のLEDを制御します。なんとなくうまくいったっぽいので、いちおうマイコンも出してきて、プログラムこそ組まないものの、ICEでポートをいじってH出したりZにしたりLにしたりして意図通りの動きをすることが確認できました。今後は写真右側にある7セグ9桁にチャレンジします。

*1:どこかの雑誌記事でもあったな

arms22arms222009/03/12 01:01面白い回路ですねー僕も使っていない7segがあるので試してみようかな。

ChuckChuck2009/03/12 07:31やりましょう、やりましょう!
私は以前オークションでまとめ買いした3桁7セグLEDがあるので、それを3つ並べて9桁に挑戦します。「そこにLEDがあるから光らすんだ」

GanGan2009/03/13 19:48んっ?と一瞬回路が理解できなかったのですが、電流を流し込む線を流れ出す線に切り替えると特定の common が呼び出されるということなのですね。極性のあるLEDならではの制御方法なのですね。うまいなあ。

ChuckChuck2009/03/14 05:43N本の制御線でN*(N-1)個のLEDを制御できます。
8x8ドットマトリクスLEDでも実験してみたいです。こちらも単色なら9本でいけます。2色のドットマトリックスLEDはどうしようかな。

takedatakeda2009/03/17 22:19普通に、これ、回路図間違っちゃってるよ、ああー、とか思っちゃうよね。

ChuckChuck2009/03/18 06:59結線のルールを理解するまでは私も思っていました。「配線合ってる?」と。

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

2009-03-08

ここのところのI2Cスレーブ活動まとめ

まだ仕様が固まりきらず、実証実験の域を出ませんが、以下に掲載してみました。

○ATtiny85による正弦波生成スレーブ

http://www6.atwiki.jp/fx_geek/pages/24.html

ATtiny2313によるLCD表示器スレーブ

http://www6.atwiki.jp/fx_geek/pages/57.html

さらに勢いづいて7セグメントのLED表示器スレーブを作ろうとしています。9ピンで9桁の7セグを点灯させようという考えですが、さて、まずは万能基板の切り出しから。

puw2puw22009/05/30 12:50ATtiny2313のスレーブでたどり着きました。先人を参考にしたATtiny2313の自作のマスターです。
LCDはまだ使う予定は無いので未接続です。BコマンドのデータをPORTDに出力するだけの動作です。スレーブのソフトの書き方は初めてでしたので戸惑いました。何か参考にされたものがありますでしょうか?

ChuckChuck2009/05/30 16:13こんにちは。
I2CスレーブをUSIに載せるのにはATMELのAVRのアプリケーションノート AVR312 が参考になりました。これをWinAVRに移植した Don Blake氏のコードをそのまま利用してしまうのも楽だと思います(AVR Freaksにあります)。日本人の方のリソースであれば、すzさんのコードが綺麗でした。これもAVR312が大元にあるのだと思います。

puw2puw22009/05/30 18:52アプリケーションノート AVR312をダウンロードしました。AVR Freaksはログインしてみましたがよく解りませんでした。AVR312で調べて見ます。

ChuckChuck2009/05/30 19:13ようやく再発見しました。以下のスレッドです。
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=48395&start=all&postdays=0&postorder=asc

puw2puw22009/05/31 18:10参考サイト見てみました。外国でもいろいろ試してる人がいて参考になりました。
これからはウエブ翻訳でいろいろ探してみます。

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

2009-03-06

I2C-LCDスレーブ通信仕様練り中

I2Cスレーブが動いてLCD表示ドライバが動いたので合体した物を作っています。

LCDへの文字の表示、座標の指定、クリア、カスタムキャラクタ対応、バー表示機能 などの機能をどのようにI2C越しに指定するか、その通信仕様を考えているところです。

第1案ではコマンドを打って機能を確定させてから諸パラメータを送るものでした。コマンドを打って文字表示、コマンドとパラメータを打って座標指定、などなど。

しかしこれではいちいち文字を打つのにコマンドを打たなくてはいけない。文字の表示は軽く素通しにしておきたいところです。

LCDのキャラクタ表を見ると一部にスキマがあります*1ので、スキマキャラクタの特定文字がきたらコマンドシーケンスに移行するようにしたらいいかな、と今思いつきました。通常シーケンスでは来たデータをそのままlcdDataWriteしてしまおうかと。

ということで第1案のコードを捨てて第2案を練り始めました。

特定文字でシーケンス移行することを忘れて、0x00~0xFFインクリメントでテストデータ書きをしちゃうと困ったことになりますね。下端0x00と上端0xFFはキャラクタが割り当てられているので途中の文字でなんかするしかありません。0x1B でいいかなぁ。

*1:JISX0211でいうところのC0集合の半分とC1集合のコードの領域

morecatmorecat2009/03/07 15:08ここはひとつ、昔のVT-100のシーケンスに合わせてほしいです。

ChuckChuck2009/03/07 17:08ふふふ、そのような案が来るのは想定の範囲内です。
しかしもうコード領域がありません。ATtiny2313なのでI2CスレーブとLCDのドライバでかなりカツカツ。ESC [ Pl ; Pc H だけしか入りそうにありません。

morecatmorecat2009/03/07 23:03なんと想定内とは。ほりえもんですか?
でも、2Kでは無理そうですね。失礼しました。

ChuckChuck2009/03/08 06:17自分でも最初に思いついたのがVT-100だったのです。エクマ048を読んでしまいました。略号が多くてめげました。
ATtiny2313は手ごろなターゲットデバイスだと思います。諦めて仕様・機能を絞り込む訓練もできます。

morecatmorecat2009/03/08 09:22画面クリア、バックスペースとカーソルの移動だけあれば十分な気がします。画面反転(文字反転)もあるとファンシーな画面が作れそうですが、液晶では難しいかも。
# UNIXだと/etc/termcapに端末仕様の一覧がありませんか?
## VT-100は仮想端末の仕様と思っている人が最近多くて、本物を使っていた人としてはショックを受けました。

ChuckChuck2009/03/09 08:00さすがにVT-100の実機を使ってはいない私です。
それぐらいに絞れば入りそうですね。ただそれ以外のコマンドもあって整合が取れないので現状オリジナルにしてしまってあります。
文字の反転はキャラクタLCDの機能として無いのです。ぜひ欲しいところです。

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

2009-03-03

ということでLCDが動きました

ATtiny2313からキャラクタLCDをドライブする件。

コメントに書いたように、Procyon AVRlibでは、I/Oポートを入力にするときにpull-upも有効にしていて、これが悪く働いていたようです。これを修整し各種時間待ちを見直して、初期化に失敗することなく立ち上がるようになりました(内蔵RCオシレータ 1MHz動作)。4MHz、8MHzでも動くようにもうちょっと手を入れるかも。

今後はI2Cからどういうコマンド体系で表示させるかを決めて実装しようと思います。

タイムアウト

あちこちウェブサイトを見ていたらこちらの資料に行き当たりました。

404 Not Found

I2C I/Fの温度センサですが、これの、

■LM73とLM75の違い

 まずLM75BはLM75CのI2CBus(SDA,SCL)のノイズ耐性を改善し、更にタイム・アウト機能を追加した製品です。

注)バス・フォールト・タイムアウト機能とは

 SMBDAT(SDA) シリアルバスがTIMEOUT (最小15/75ms 、最大45/325ms)を超えた時間Low に保持されると、シリアルバスをIDLE(電源投入時と同一状態) にリセットし、SMBDAT(SDA) はハイ・インピーダンスとなり、新しいスタート条件を待ちます。

なるほど、参考にしようと思いました。

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

2009-03-02

こんどはLCDが動かない

こんなのばっかり。

I2Cがなんとか動いたので味をしめてI2CからLCD表示するスレーブを作ろうと思いました。おりしも秋月で扱うLCDのサイズ・バリエーションが増えたことだし、いろいろなサイズに対応しよう、と。ゆくゆくはI2Cバス上にこのLCDを置いてセマフォかなんかを設けてマルチマスタでも扱える(上の行はマスタ0、下はマスタ1とか)ようにしようとかPWMで表示の明るさを変えたりできるようにしようとか妄想竹も延びています。

これまでLCDのドライバは書き捨てることが多かったのですが、以前ARM(ADuC7026)にモディファイして使ったProcyonのAVRlibのほうを利用して、コントローラにはATtiny2313(内蔵RCで8MHz動作)を、ポートはPORTDで、とか考えて都合が良いように4bitインターフェース時にポートの下のニブルで使えるように変更してみました。Procyon AVRlibそのままにはLCDの初期化シーケンスがコーディングされていないので、0x30を打って4.1msec待つとか100μsec待つとかのおまじないを入れました(ただしかなり長めの時間を出すテキトーなタイマ)。基本動作はBusy Flagを見る設定で。

ブレッドボードに組み立てて実験。

だがしかし…

ときどきLCDの初期化に失敗します。成功するときちんと動き続けているのですが…

今のところ原因がつかめていません。電源投入後の待ちが足りないのかなぁ。時間を作る部分は自前で作りこむか…


どうしてこういう枯れているところでハマルのだろう…

ChuckChuck2009/03/02 08:56以前作って動いているADuC7026版と比較中。今回のAVR版ではI/Oポートを入力にしたときに同時にプルアップにしている。LCDモジュール側でプルアップしているから要らないんじゃないかな…

2009-02-27

I2C動いた動いた

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

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

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

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

no title

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