ATtiny10環境をそろえる(GCC)

前回はライターでしたが、ソフト面で必要とするコンパイラを準備します。といっても、ATMELから Atmel AVR Toolchain 3.4.1 for Windows というのが出ているので、これをインストールすれば終わりなんですね………。

それじゃ面白くないでしょ!!

Toolchainのページにコンパイル時に使用したソースコードが置いてある事が分かり、自分で作って見る事にしました(基本、GCCにパッチをあてたものなので公開してるんですよね)。可能であれば64bit版を作成したいところですし…。と気軽に考えていたのが間違いでした。コンパイラをコンパイルした事がなかったので、コンパイラのコンパイルに多くの難所が存在する事を知りませんでした。なので、できあいの物をインストーラでインストールする事をおすすめします。しかし、ToolchainはWinAVR時代には機能毎にbinとutilsに分かれていて使いやすかったのですが、今は両方いっしょくたにしてbinに入っているようです。基本機能をcygwinですましている私にとって、余分なものにパスを通すのは気が引けますが。

ここからは avr-gcc と関連するツールについての作成奮闘の追憶です。

AVRは8bit品しか興味がないので、avr32はパスします。avr側のソースコードは、binutils, gcc, avr-libc それと パッチ集、コンパイル(ビルド)用のシェルスクリプトがおいてあります。これをReadmeの通りに実行すればよさそうだけど、シェルスクリプトを読み解く事ができず、どんな方法でコンパイルして何処にインストールされるのか、そもそもコンパイル環境は何なのか読み解く事ができませんでした。とにかくやってみるかと思い、ATMELのサイトからDLしたファイルを使って、シェルスクリプトは使わずに各モジュールのReadmeとconfigureのhelpを参考にいつも通りcygwin上でmingw(i686-w64-mingw32)でコンパイルしてみました。しかし、いきなりコンパイルエラー発生です。ソースコード中の何かに問題がありそうな内容でした。cygwin上のmingwを使ったのがまずかったのかと思い、無難にLinux(Ubuntu)で挑戦してみましたが、やはりエラーをはき出します。msys上でのmingwでも試してみましたが同じ結果。これにはまいりました。

ここまでくると、そもそも置かれていたソースコードを使うのでよかったのか? と疑問が沸いてきました。そこで、パッチはそのまま使うとして、それぞれのベースコードを各サイトから取得してきて、パッチをあててmsysでコンパイルしてみる事にしました。しかし、途中でエラーが出てコンパイル完了せずです。しかたがないので、エラー部分を手動で修正して何とかbinutilsはコンパイル出来ました。次はGCCです。これもベースコードを取得してきてパッチをあててコンパイルしてみました。コンパイルは比較的すんなりと行きそうな雰囲気だったのですが…ここで最大級の問題に直面してしまいました。なんと、msysが "Couldn't commit memory for cygwin heap" というエラーを表示して止まってしまうのです。ググってもググっても最終的な解決策が書いてある所はなく、Window用の avr-gcc のコンパイルを諦めようかと何度も思ってしまいました。因みに、この時点でLinux上ではbinutilsとGCCをコンパイルできています。

このmsys(mingw)を使っているにも関わらず、"cygwin"のヒープが問題と言っている事象は本当に意味不明です。msysの初期バージョンがcygwinで作られていたという話しを何処かで読んだ気もしたので、Web上にあったcygwinの対策(レジストリ値の書き換え)等を行ってみましたが、問題は解決しませんでした。ほとほと参っている時に、すzさんのblogに気になる事が書いてあった気がしてその部分を探し出して見たところ、すzさんも同様の現象におちいり、この部分にかんしては流されて(ギブアップされて?)ました。

Linuxではコンパイル出来ている事、msysを使うとヒープが…と言ってくる事から、やはり原因はmsysにありそうという事で、msys関連を徹底的にググっているうちに "Couldn't commit memory for cygwin heap" 問題に対応したという文章に出会いました。notabs.orgというサイトです。MinGWをコンパイルされているサイトかな? win-build-env-005.7zで対応されてますが、肝心のmsys-1.0.dllはmsys-for-xgcc-build-001.7zというのに入っているのと同じです。気になる部分はいろいろとありますが、試す価値ありと思い、msysのウィンドウを閉じて、今使用しているmsys-1.0.dllをリネームしておき、このmsys-1.0.dllをコピーして再度msysウィンドウを起ち上げました。これといって何も起こらなかったので、コンパイルを再開してみたら、何か良い感じです。結構時間がかかりましたが、GCCのコンパイルが完了してしまいました。どういった改良がされているのか全く分かりませんが、コンパイルするのはgccの方なのでできあがった物には影響は無いだろうと判断し、コンパイル続行です。

今度はavr-libcのコンパイルでしたが、これまた…パッチが足りません。もうこの状況になれてしまった自分がなんだかな~と思いながら対策しようとしたのですが、結構難しいです。何気に今あるパッチのファイル名でググってみると、なんと crossavr-libc なるプロジェクト(?)があり、gitでパッチを取得できるではありませんか。それもATMELには無かったパッチまであります!! 試しに他のパッチもググってみると crossavr-binutils, crossavr-gcc なるものが存在するではありませんか!!! これらをゲットして既存のファイル部分は差分が無かったので、無いファイルを追加して……このパッチにも若干問題があったので修正して全部コンパイルし直してみるとうまく生成できました。試しにWindowsのコンソール(CMD.exe)にmake.exeを実行するにあたって、msysのbinだけにパスを通してATtiny2313用に以前作成していたプロジェクトをコンパイルしたところ、msys環境下以外だとDLLファイルが足りないと言われてしまったのでbinフォルダ内にMinGWのDLLを入れた所、無事コンパイル出来き、更に実機に書き込んでみたところ、無事動きました。MinGWのDLLも何とかしたかったのですが、何回かチャレンジしてダメだったので、これでよしとしました。気が向いたら再チャレンジするかも…。それと、64bit版でのコンパイルも気が向いたら…。

追加・修正を加えたパッチは【物置】に置きました。
また、コンパイルの手順を下記します(テキストをパッチファイルと一緒に入れてもいます)。

$ unzip ./avr-patches.zip

$ wget ftp://ftp.gmplib.org/pub/gmp/gmp-5.1.1.tar.bz2
$ tar jxf ./gmp-5.1.1.tar.bz2
$ cd ./gmp-5.1.1
$ mkdir ./build
$ cd ./build/
$ ../configure --prefix=/usr/local/winavr/tool --disable-shared --enable-static
$ make
$ make check
$ make install

$ cd ../
$ rm -rf ./build/
$ cd ../

$ wget http://www.mpfr.org/mpfr-current/mpfr-3.1.2.tar.gz
$ tar zxf ./mpfr-3.1.2.tar.gz
$ cd ./mpfr-3.1.2
$ mkdir ./build
$ cd ./build/
$ ../configure --prefix=/usr/local/winavr/tool --disable-shared --enable-static --with-gmp=/usr/local/winavr/tool
$ make
$ make check
$ make install

$ cd ../
$ rm -rf ./build/
$ cd ../

$ wget http://www.multiprecision.org/mpc/download/mpc-1.0.1.tar.gz
$ tar zxf ./mpc-1.0.1.tar.gz
$ cd ./mpc-1.0.1
$ mkdir ./build
$ cd ./build/
$ ../configure --prefix=/usr/local/winavr/tool --disable-shared --enable-static --with-gmp=/usr/local/winavr/tool --with-mpfr=/usr/local/winavr/tool
$ make
$ make check
$ make install

$ cd ../
$ rm -rf ./build/
$ cd ../

$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2
$ tar jxf ./binutils-2.22.tar.bz2
$ cd ./binutils-2.22
$ for file in $(find ../avr-patches/binutils/ -type f -name "*.patch" | sort); do patch -p0 -i $file; done
$ mkdir ./build
$ cd ./build
$ ../configure --enable-languages=c --with-mpc=/usr/local/winavr/tool --with-mpfr=/usr/local/winavr/tool --with-gmp=/usr/local/winavr/tool --prefix=/usr/local/winavr/3.4.1 --target=avr
$ make
$ make install

$ cd ../
$ rm -rf ./build/
$ cd ../


$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.6.2/gcc-4.6.2.tar.bz2
$ tar jxf ./gcc-4.6.2.tar.bz2
$ cp -r ./gmp-5.1.1 ./gcc-4.6.2/gmp
$ cp -r ./mpfr-3.1.2 ./gcc-4.6.2/mpfr
$ cp -r ./mpc-1.0.1 ./gcc-4.6.2/mpc
$ cd ./gcc-4.6.2
$ for file in $(find ../avr-patches/gcc/ -type f -name "*.patch" | sort); do patch -p0 -i $file; done
$ mkdir ./build
$ cd ./build
$ ../configure --prefix=/usr/local/winavr/3.4.1 --target=avr --program-prefix=avr- --enable-languages=c --with-dwarf2 --enable-doc --disable-shared --disable-libada --disable-libssp --disable-nls --enable-fixed-point --with-gmp=/usr/local/winavr/tool --with-mpc=/usr/local/winavr/tool --with-mpfr=/usr/local/winavr/tool
$ make
$ make install

$ cd ../
$ rm -rf ./build/
$ cd ../

$ wget http://download.savannah.gnu.org/releases/avr-libc/avr-libc-1.8.0.tar.bz2
$ tar jxf ./avr-libc-1.8.0.tar.bz2
$ cd ./avr-libc-1.8.0/
$ for file in $(find ../avr-patches/avr-libc/ -type f -name "*.patch" | sort); do patch -p0 -i $file; done
$ unset CC
$ ./bootstrap
$ PREFIX=/usr/local/winavr/3.4.1
$ export PREFIX
$ PATH=$PATH:$PREFIX/bin
$ export PATH
$ mkdir ./build
$ cd ./build/
$ ../configure --prefix=/usr/local/winavr/3.4.1 --build=`../config.guess` --host=avr
$ make
$ make install

$ cd ../
$ rm -rf ./build/
$ cd ../

スポンサーサイト

ATtiny10環境をそろえる(USBasp)

今更ですが、ATtiny10を使ってみようかな? と思い、買ってきました。これにともない、ライターも必要となったので(今までのはTDIに対応していません)、ATtiny10に書き込み出来る物の中から、安くてお手軽そうな USBasp + avrdude で組もうと思い、aitendoのAVR-USBasp-Bを買ってきました。

AVR-USBasp-Bのファームウェアは少し古いらしく、TDIでの書き込みに対応していないらしいので、USBaspのサイトから最新(?)のファームウェア(usbasp.2011-05-28.tar.gz 内の usbasp.atmega8.2011-05-28.hex)をDLして来ました。

ファームウェアの書き込みにはAVRライター2号機を使用しました。USBaspはJP3とJP4をショートして書き込みモードにします。書き込みに使用している端子はUSBaspが10ピン、AVRライター2号機が6ピンなので、ブレッドボード用に作ってあったジャンパを使用して繋げ、ChaNさんのavrsp.exe で書き込みました。Readme.txtにヒューズの設定が書いてありました(HFUSE=0xc9 LFUSE=0xef)が、元からこの値だったので書き換えはしていません。

RIMG0469.jpg

その後、USBaspをPCに繋ぎ直してドライバをインストールします。ドライバはどうやらlibusb0を使用しているみたいだったので、zadig.exeを使用してインストールしました。

次に、avrdudeをDLしてこようとUSBaspのサイトからリンクしてあるavrdudeらしきサイトへ飛ぶと、tar.gz形式の圧縮ファイルが置いてありました。解凍して中を見るても実行ファイルらしき物がありません。何かコンパイルしろと言わんばかりのファイルが並んでます。そんな挑発に乗って、ググりもせずにコンパイルしてみました。それも無謀にも64bit版として。最も新しいのは avrdude-5.11svn-20111019.tar.gz でしたが、中途半端な名前が付いていたので、avrdude-5.11.tar.gz を使用する事にしました。

configureをした時にbisonとflexをチェックしていたので、どうやら必要らしいです。なので、cygwinにインストールしておきました。それと、libusb0用のヘッダーとリンクライブラリ、あと、libusb1.0の方も調べてました。自分の環境には両方入ってますが、どっちが必要なのか不明です。

$ ter zxvf ./avrdude-5.11.tar.gz
$ cd ./avrdude-5.11/
$ mkdir ./build
$ cd ./build/
$ ../configure --build=i686-pc-cygwin --host=x86_64-w64-mingw32
$ make

$ x86_64-w64-mingw32-objdump.exe -p ./avrdude.exe | grep dll
DLL Name: libftdi.dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
DLL Name: msvcrt.dll
5df90 78 __dllonexit
DLL Name: libusb-1.0.dll
DLL Name: libusb0.dll

結構いろいろと必要だったみたいです。自分の環境には入っていたので良いのですが…。取りあえず、exe と同じフォルダにlibftdi.dll, libusb-1.0.dll, libusb0.dllをコピっておきます。

ことある毎に使っているテストボード(ATtiny2313専用)で本当に動くのかテストしてみることにしました。

RIMG0468.jpg

$ ./avrdude.exe -c usbasp -p t2313
avrdude.exe: Warning: cannot open USB device: Function not implemented
avrdude.exe: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc

avrdude.exe done. Thank you.

んっ? USBaspを認識してくれてないみたいですね…。怪しいのは libusb-1.0.dll がリンクされていた事。zadig.exe で WinUSBのドライバに切り替えてみて再度挑戦です。

$ ./avrdude.exe -c usbasp -p t2313

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude.exe: Device signature = 0x1e910a

avrdude.exe done. Thank you.

今度はUSBaspを認識して、ATtiny2313から情報を取得してくれたみたいです。しっかし、avrdudeはターゲットを自動認識してくれないんですかね? avrspに慣れている自分にとって、チョッとビックリしました。ま~、これで一先ずUSBaspを使える環境が出来ましたのでよしとしましょう。



作成したavrdude-5.11を物置へ追加しておきました。

遅延SW

かなり訳ありで遅延SWを作る事になった。これはSWを押下してから一定時間たって本来のSWを押下する物。前提として本物のSWは pull-up されている状態でSW押下で GND に接触させる事で Hi/Loを作り出すタイプのSWである事と、つまめる所がある事。後者は…まっ、線出し出来ればOKです。オープンコレクタのトランジスタ(デジトラ)を使っているので、相手の電圧はほぼ関係無しといったところでしょうか。

複数用途を考え、SW押下から数十ms経過後にトランジスタONのパターンと、SW押下時点でトランジスタON→500ms→トランジスタOFF→数十ms→トランジスタON→500ms→トランジスタOFFの2パターンを入れました。あと「数十ms」と書いている所を約10ms間隔で前後できるような仕様です。

作成をさっと済ませたいのと、小さい方が便利なので、今回はAVRを使用しました。ATtiny13Aが手元にあったのでこれ幸いと使用しました。8pinの8bitマイコン。ARM Cortex-M3が載っているFM3とは雲泥の差ですが、チョッとした仕様ならこっちの方が作成は楽です。

当初は手書きだったのだが、blogにアップするということで回路図を清書してみました。

auto_sw_schematic_v100

ブレッドボード上でプログラムのカット&トライを繰り返し、納得のいく動作まで作り込みました。プログラムはこれ以上加える事がないと思うのでこの段階で書き込んだICをそのまま使用して書き込み端子分の基板実装領域を節約する考えです。最悪、書き込みが必要な場合はICソケットを使っているので引っこ抜いてまた書き込めば済むこと。

RIMG0355

RIMG0359

RIMG0357

RIMG0358

RIMG0360

遅延時間は2秒を初期値として±10ms単位で調整可能。調整した時間を直接見る方法なないが、オシロをあてて計測すれば良いだろうといった具合の仕様にしました。

部品を買いに行く時間もなかったので、全てあり合わせで間に合うように作りました。ICもしくはSWの端子を摘むのに苦労しそうだったので、以前購入していたストロベリー・リナックスのマイクロテストクリップを使用する事にしました。この部品が一番高級品(1個660円)です。

作成したソフトを置いておきます。

auto_sw_src_v100.zip

avr-gccのバグではなかったみたいです。

AVRWikiで相談したところ、kkkさんからFuseの設定がおかしいと指摘を頂きました。再度確認してみたら、確かに変な値に設定しています。

[NGケース]
Low: 11001111
High:11-11001
Ext: -----111

この設定ではクリスタル(セラミック振動子)の発振に使う電圧が低電圧の設定になってます。この場合、雑音の影響を受けやすい状態になるみたいです(マニュアルに記載されています)。

以下の様に通常の電圧(全振幅発振器)の設定にすると変な現象(予期しないところに飛んでいた)は一切出なくなりました。幾つかのコードパターンで確認したのでたぶんコレが原因だと思います。

[OKケース]
Low:11000111
High:11-11001
Ext:-----100

Extを変更したのはBOD(低電圧検出)を有効にした為です。

これで当初の回路設計で行ける見込みが付いてきました。
一安心です。

avr-gccのバグらしき現象にぶち当たりました。

現象は、USARTの受信データ読み込み関数を関数を呼び出す所と異なるファイルに定義していると連続受信時にリセットがかかったかの様な状態になる事です。

MCU状態レジスタ(MCUSR)の値を出力してリセット要因を見てみましたが、リセットされた形跡がありません。なのでJMP命令等で突然飛ばされている感じです。割り込みは禁止にしっぱなしなので割り込み関連ではないと思われます。

今のところ、USART受信関数の位置を変更するだけで現象が発生しなくなっているが、本当の原因が何なのか分っていないのでいつまたこの現象に遭遇するか心配です。

現象発生前後で大きくプログラムの構成を変えたので原因解明に1週間以上を費やしてしまいました…。原因を追い詰めたファイルを置いておきます。


開発環境:WinAVR-20090313
使用マイコン:ATmega644P
使用リソース:USART 0ch(非同期、19200baud)

現象発生ソースコード: winavr_usart_bug_generate.zip
現象発生しないソースコード: winavr_usart_bug_not_generate.zip


追記 2009.06.10
バグではなかったみたいです。
詳細はこちら
黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
01 | 2017/02 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 - - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

RaspberryPi ぺるけ Linux TRminiWatterPart4 トランジスタ式ミニワッター MPD イーサネットコンバータ OpenOCD DAC FON2405E buildroot FM3ペリフェラル BeagleBoneBlack library FM3評価ボード ODROID-U2 mingw OpenGL TL-WR700N Edison bitbake KiCad VMware シングル FM4 ミニワッター 6N6P 計測 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter