トップ 新規 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

雑談4

雑談場所4

雑談をする場所も必要でしょー(それがメインになるのも考えすぎだが)
古い話題は雑談雑談1雑談2雑談3でお願いします。

 ATmega48の書込み - 18 (2008年06月05日 19時33分33秒)

COMポート制御のISP AVRライタででFlashに書き込み、ソースを修正してもう一度書き込もうとするとコマンドプロンプトに「Device connetion failed」と表示されて書き込みが出来ません。一度書き込むと、デバイスを認識しなくなってしまいます。こういった事象があったかご存知の方いましたら教えて下さい。

  • 私も経験しました。時々発生し、OSの再起動で復帰します。原因が良くわからなかったので、このライタでCOM-SPIブリッジを作成しました。COM-SPIブリッジでは、このエラーは起きません。スイッチ操作も不要なので、快適です。 - senshu (2008年06月06日 06時45分39秒)

 WINAVRで外部変数が汚される不具合? - がた老 (2008年05月28日 15時10分28秒)

始めて投稿するがた老と申します。みなさんの情報を頼りに昨年の秋よりAVRにはまっております。この場を借りて御礼申し上げます。

さて雑談にあげる話でもないのですが、このところAVRstudio経由でWINAVRを利用し上記の不具合に悩まされています。

過去ログにも話題になっていないし、こちらのミスだろうと思っていた(回避可能)のですが、最近頻発するのでみなさんの状況を知りたくて報告することにしました。

状況は、外部変数(volatile uint8_t xxxxなど)として定義した変数が動作中に何者かに汚されプログラムが不正な動きになるというものです。回避方法はさまざまで、#includeするライブラリでの外部変数宣言をメインに持ち込むと直ったり、バッファーの大きさを変えると直ったりします。要するに場所を替えればいいわけです。

OSもモニタの何もないワンチップコンピューター。メモリを汚すのは自分以外になく、最初は何か自分の間違い(配列を超えてデータを移した、不正なポインタでデータを書き込んでいる)だろうと思っていたのですが、機種を換えても(Tiny26,861、Tiny2313、Mega168)、全く違うプログラムでも時折発生し、大騒ぎになります。

内部変数で、起きたことは一度もありません。また、ポインタでメモリをアクセスするようなプロセスのないプログラムでも発生します。このへんがコンパイラーを疑う理由なのですが、みなさんの状況が少しでもわかれば幸いです。

なお、WINAVRはこれまで20070525を使い最近20080430に換えました。どちらでも発生しています。AVRstudioは4.13です。

  • 変数に対する属性の与え方がまずいのではないでしょうか? - km (2008年05月29日 09時39分35秒)
  • コメントありがとうございます。ただ、属性の問題なら場所を換えると上手く行くと言うことを説明できません。 - がた老 (2008年05月29日 12時09分50秒)
  • 参考に:外部変数をレジスタ指定とし、配列を使用したときに外部変数のレジスタを配列の格納時に食いつぶすことがあります。私はどうしても修正することができませんでした。何が悪いのか不明です。 - nuts (2008年05月29日 16時09分47秒)
  • リンカっぽいですよね。static宣言が無くて、名前がぶつかっても変数だとCOMMONとして扱われて名前を解決してしまったりしますがどうでしょうか?.mapを吐き出すようにするか、avr-nm -f sysv *.elf辺りでシンボルをチェックしてみてはどうでしょう? - km (2008年05月29日 17時36分06秒)
  • スタックが溢れて静的変数を壊してる可能性も考えられますね。 - miku (2008年05月29日 21時08分17秒)
  • みなさま コメントありがとうございました。 今回も何とか回避しました。 1ステップごとテストステートメントを挿入し、データを汚している犯人を追跡し、Tiny2313の標準UARTの受信のところで変えられていることがわかりました。.lssを見ましたが、最適化オプションでもコードが大幅に変わりこれ以上の追跡はあきらめました。解決したのは結局場所で、UARTの受信バッファ(これは内部変数ですが)を80から36に減らしたらピタリと直りました。理由はわかりませんが、みなさんもご苦労されていることがわかり安心しました。こんなものなんですね。今までコンパイラを信じていたものですから。 - がた老 (2008年05月30日 19時34分09秒)
  • 根拠はありませんが、スタックが深くなって、受信バッファと重なった、ということは考えられませんか?よくわからないBUGの主要なもののひとつです。 - senshu (2008年05月31日 01時45分12秒)
  • 言われてみればTiny2313のSRAMは128バイトしかありませんね。受信バッファに80バイトもとれば、他の変数を加えると100バイトを越す可能性は十分あります。割込みを使えばスタックは軽く20バイトは使いますから、この可能性が強いですね。言われてみて気づきました。ありがとうございました。不具合などというタイトルは少し大げさすぎました。しかし、WINAVRのマップファイルは全く理解不能です。もう少しまともなメモリマップはないのでしょうか。 - がた老 (2008年06月01日 01時07分58秒)
  • あれはリンクマップファイルなので、メモリマップとしては見難いかもしれないです。コマンドプロンプトでnm(avr-nm)を使用すると、オブジェクトのシンボルを解析できます。それで.elfファイルを解析するといいとおもいます。.textセクションがプログラム領域で、AVRではflashに当てられます。.bssと.dataセクションがRAM上の変数になります。0x800100がRAMのスタートです。-f sysv オプションをつけるとフォーマットが見やすくなります。あと-nオプションでアドレス順に並ぶのでいかがでしょうか?シンボルクラスとしてt T d D G などのアルファベットが並びますが、大文字がグローバルで小文字がローカルのオブジェクトです。それとavr-libcのFAQに「RAMメモリと変数領域のオーバーラップを検出する方法は?」というところがあります。そこにスタック要求量の追い方(かなり面倒ですが)も書いてありますよ。 - km (2008年06月01日 15時56分04秒)
  • いやありがたい。欲しかった情報です。今まで作るのが面白くてこの方面の勉強をさぼってきました。大型機の仕事を定年になって、趣味で始めました。「箱庭」や「盆栽」のように楽しいですね。早速、WINAVRのフォルダにあったavr-nmを試してみました。今、2313でLEDマトリックスを使って電光掲示板を作っているのですが、このコマンドではSRAMサイズがおかしかったころ114バイト、タイマ割込みのスタックがpushが5ヶで12バイト余り、ピッタリ被りますね。外部変数が最後にとられるので一番被害にあいやすいこともわかりました。ありがとうございました。なお、2313では、.bssのオフセットは0x800060でした。 - がた老 (2008年06月01日 22時04分01秒)

 コンパイルワーニング - nuts (2008年05月20日 10時03分10秒)

Warning: expression dangerous with linker stubsコンパイル時に上記ワーニングが発せられているのですが、具体的な意味と原因・対応策がまったく理解できないのです。とりあえずプログラムは問題なく動いているようなのですが、なんとなく不安があるのですが。このワーニングは無視して問題がないのでしょうか。経験者のご助言を!!

  • ウォーニング? - 匿名 (2008年05月24日 00時49分59秒)
  • gccha - がた老 (2008年05月28日 22時23分42秒)
  • 前にポストしたものですが、気がついたので。gccは知りませんが、一般的には、externや関数プロトタイプを宣言しておいて、実体がincludeされていないとリンクが成立せず、stub(切り株)のようにアドレスが解消(正しいアドレスが入っていない)されていない状態のことだと思います。その関数や変数を使わない限り問題にはなりません。 - がた老 (2008年05月28日 22時28分42秒)
  • コメントありがとうございます。どうも、SWITCH文を使うと発生するみたいなんせすよねぇ??特に変な宣言はしていないと思うのですが。 - nuts (2008年05月29日 16時12分30秒)

 ブートローダと応用プログラムで共通に使う関数は - available (2008年05月11日 11時35分53秒)

ブートローダ領域に配置するプログラムを作っているのですが、ブートローダプログラムの容量が当初の適当直感よりもだいぶ大きく(4K程度)なりそうです。応用プログラムも7K程度あるので、試作で苦労して作ったmega88(QFP32)だと無理なかんじです。ブートローダ側と応用プログラム側で共通の関数が何個かあるので、それらを応用領域において、それぞれから共有する方法とかって試された方いらっしゃいますか。

 LD命令の挙動で質問です - RS (2008年05月01日 16時00分57秒)

RAMPZレジスタの無いATmega32をターゲットとしてのシミュレーションで気になったのですが 以下のコードでr24に入るべき値は何ですか? ldi r31, 0 ldi r30, 30 ld r24, z+

30が入ると予想していたのですが実際は31でした。 インクリメントする前のZレジスタの値を使用するなら30だと思いますし、 インクリメントした後のZレジスタの値が使用されてしまったのなら0だと思います。 X,Yレジスタでも同様の結果ですが実チップでもこうなるのでしょうか?

環境はAVR Studio4 ver4.13sp2でAVR Simulator(V2に非ず)を使用しました。

  • ATmega64の設定でAVRStudio4.14+AVRSimulator+WinAVR20080430で確認してみました。同じようにR24には31が入っていました。次にReal ATmega64+JTAGICEmkIIを使用して確認してみましたがやはりR24には31が入っていました。仕様ですかね? - kkk (2008年05月02日 12時28分55秒)
  • 実チップでの確認ありがとうございます。CPUコアの内部構成を想像すると起こっても不思議の無い現象なんですが、すっきりしない仕様ですよね。 - RS (2008年05月03日 12時46分57秒)

 また質問です。MOVWについて - nuts (2008年04月25日 13時54分31秒)

avrstudio4.14のシミュレータでMOVWがサポートされていないとの警告が出るのですが、何か対策はないものでしょうか。よろしくお願いします。

  • gccですか?CPUは何を指定されていますでしょうか? - kkk (2008年04月25日 21時42分58秒)
  • kkkさん:いつもすみません。条件は”XMEMについて”と同じでAVRSTUDIOとgccをそれぞれ40.4,20080411にUPしただけなのですが。以前のこの雑談の中にも少しMOVWのことが書いてありますが関係はあるのでしょうか。一難去ってまた、一難ですよ。だんだん疲れてまいりました。 - nuts (2008年04月26日 15時34分08秒)
  • ↑AVRSTUDIOは、ミス入力で正は、4.14です。AVR=ATMEGA8515です。 - nuts (2008年04月26日 15時36分11秒)
  • AVRStudio4.14+WinAVR20080411でATmega8515の設定にて確認しましたが警告は出ませんでした。MOVW命令も正常にシミュレートされているようです。 - kkk (2008年04月26日 17時39分39秒)
  • あれれ-ですね。一応メッセージは”AVR Simulator:Unsupported instruction'\ 'movw' at address ……'なのでが。AVRstudioのファイルが壊れているのでしょうか。再インストールして実行してみます。また結果を書き込みいたします。 - nuts (2008年04月26日 19時09分13秒)
  • 再インストールの後も、結果は同じで“MOVWがサポートされていない”のメッセージでした。正常なシミュレートができなく困りました。もう少し考えてみます。 - nuts (2008年04月26日 20時01分46秒)

 XMEMについて(2) - nuts (2008年04月21日 18時20分50秒)

色々すみません。テスト用を添付します。これですら??でした。

#include<avr/io.h>

int main(void)
{
	unsigned char *p;
	do { 
		MCUCR=(1<<SRE);
		SFIOR=(1<<XMM2) | (1<<XMM1) | (1<<XMM0);
		EMCUCR=(1<<SRL2) | (1<<SRL1) | (1<<SRL0);
		p=(unsigned char *)0x8000;
		*p=0x01;
		p=(unsigned char *)0x8001;
		*p=0x03;
		p=(unsigned char *)0x8002;
		*p=0x05;
		p=(unsigned char *)0x8003;
		*p=0x07;
		p=(unsigned char *)0x8004;
		*p=0x09;  
		p=(unsigned char *)0x8005;
		*p=0x0b;   
		p=(unsigned char *)0x8006;
		*p=0x0d;     
		p=(unsigned char *)0x8007;
		*p=0x0f;     
		p=(unsigned char *)0x8008;
		*p=0x11;     
		p=(unsigned char *)0x8000;
		*p=0x13;
	} while (1);

	return 0 ;

}
  • ↑ずれていたのでちょっと修正しました。それで原因ですがコンパイラの最適化によって省略されています。このような場合には unsigned char で記述しているところをすべて volatile unsigned char と変更してみてください。 - kkk (2008年04月21日 19時00分06秒)
  • おー、素晴らしい。ありがとうございます。上記対策とmakefileのoptimizationの調整で予想通りのコンパイルができました。本当にありがとうございます。 - nuts (2008年04月21日 21時47分56秒)
  • 独学なもので十分な理解がなく申し訳ありませんでした。今後ともよろしくお願いいたします。 - nuts (2008年04月21日 21時49分33秒)

 XMEMについて - nuts (2008年04月18日 10時55分26秒)

AVRstudio4.13/Winavr20080402/Atmega8515のCプログラムでXMEMの8000だけににアクセスできません。(8001以降は正常にアクセス).lssファイルを確認すると8000のプログラムだけが正常にコンパイルできていません。プログラムが悪いのか、BUGなのか、誰か情報をください。お願いいたします。

  • 再現できる最少のソースコードとコンパイラオプションを教えていただけませんか?また不具合の多いWinAVR20080402ではなくてWinAVR20080411ではどうなりますか? - kkk (2008年04月18日 13時53分55秒)
  • 今、20080411で確認しています。やはり20080402はバグが多いのでしょうか。 - nuts (2008年04月18日 20時22分20秒)
  • WinAVR20080402は同じファイル名で2度配布され、その後20080407を経て現在20080411となってます。短期間にこれだけ更新が続いたのは致命的な不具合が見つかっためです。 - kkk (2008年04月18日 22時09分44秒)
  • どうもうまくいきません。TESTでMCUCRのSREに1; EMCUCRのSRL2-0に1; SFIORのXMM0-1に1; p=(unsigned char *)0x8000; *p=0x01; で8000から801fまで繰り返しをlssで確認しても8001は、sts 0x8001 となりますが、8000はout 0x18となってしまいます。プログラムが悪いのでしょうか? そのほかの設定などありましたらご教示お願いします。(makefile,etc.)  - nuts (2008年04月21日 14時26分05秒)
  • その部分のソースを貼り付けてもらえませんか? - kkk (2008年04月21日 17時53分25秒)

 spam - spam (2008年04月17日 02時36分25秒)

海外からのSPAM投稿がひどいので古い投稿へのcommentを一時的にできなくしています

 2000バイトのデータ - アット (2008年03月25日 23時16分07秒)

2000バイトのデータを配列に入れて使いたいのですが、
以下のようなコードだとコンパイルはできるものの
動作が正しくないです。オシロで見ると PORTD から
出力されるデータが意図しない物になります。

int z[2000] = {0x8B,0x9C, 省略, 0xFF}; // 2000バイトのデータ
for(i=0; i<2000; i++)}
  PORTD = z[i];
}

2000バイトを500バイトにすると、正しく動くようです。
巨大な配列を使いたいので、何か良い方法はないでしょうか。

WinAVR-20071221-install.exe
デバイス:ATmega88
です。よろしくお願いします。
  • 修正方法
int z[2000] = {0x8B,0x9C, 省略, 0xFF}; // 2000バイトのデータ
  ↓
int z[2000] PROGMEM = {0x8B,0x9C, 省略, 0xFF}; // 2000バイトのデータ

PORTD = z[i];
  ↓
PORTD = pgm_read_word(&z[i]);

に、書き換えて、ROMにデータを置けばよいかと。 - ATmega774 (2008年03月26日 15時13分07秒)

  • ATmega774 さん、ありがとうございます! 思った通りにできました! 助かりました m(_ _)m - アット (2008年03月27日 00時31分06秒)

 XMEGA - samsara (2008年03月04日 22時20分06秒)

いつもたいへんお世話になっております。AVRStudio4+WinAVRを用いて、ATmega128のプログラムを組んでおりますが、上記開発ツールは、XMEGAシリーズのチップにも対応しているのでしょうか?XMEGAシリーズのファームウェアをC言語で開発するには、他のコンパイラ等を準備する必要があるのでしょうか?

  • AVR Studioは、4.14で完全サポートされるようです。winavrについては次のリリースでXMEGA対応するそうです。またAN:AVR1000にはIARのコンパイラを利用する方法が書かれています。 - 泥酔オヤジ (2008年03月06日 09時16分51秒)
  • 早速の回答ありがとうございます。WinAVRのXMEGA対応に関する情報はどこに記述があるのでしょうか?教えていただけますか? - samsara (2008年03月11日 18時21分10秒)
  • EWがAVR Freaksのフォーラムのどこかに書いていました(具体的なスレッドは失念しました。ごめんなさい)。 - 泥酔オヤジ (2008年03月12日 14時04分47秒)

 入門用AVR-ISPライターでの書き込みについての質問 - VTEX (2008年02月19日 19時49分51秒)

TAD氏の入門用AVR-ISPライターを作成し実際に書き込む段階まで来ました。しかし書き込む方法が良く分からず困っています。とりあえずC:\AVR>avrspx -pf3 C:\AVR\program\default\test.hexとやってみたのですがうまくいきません。ライター自体は電源を入れるとLEDが点滅するため、ちゃんとできていると思われるのですが…

  • すいません、間違えました。正しくはC:\AVR>avrspx -pf3 -ttiny2313 C:\AVR\program\default\test.hexでした - VTEX (2008年02月19日 19時58分57秒)
  • 説明不足すみません。入門用AVR-ISPライターのページに使い方のリンク先を追加しました。 - TAD (2008年02月19日 23時56分07秒)
  • 回答ありがとうございます。今日ページの通りに試してみたら問題なく書き込めました。 - VTEX (2008年02月20日 19時32分30秒)

 AVRminiProg_Full(support all AVR programming interfaces) - 名無しさん (2008年01月26日 22時40分48秒)

AVRminiProg -- compatible with USB-interfaced programmers from Atmel

AVRminiProg is an integration of my previous-developed AVR programming tools: AVRminiISP, AVRminiJTAG and AVRminiDragon, which emulate official USB-interfaced programmers from Atmel. U can use AVRminiProg in the right same way U use Atmel programmers. Software supports Atmel’s programmer will also support AVRminiProg, and official AVRStudio is recommended.

AVRminiProg_Full(support all AVR programming interfaces)ISP、JTAG、HVPP、HVSP

http://www.simonqian.com/en/AVRminiProg/index.html

 初めて投稿させていただきます。 - 北裏@日暮里 (2008年01月07日 23時37分04秒)

ワンチップマイコンに取りつかれ、AVRのBASCOMを使ったことがあります。MinDDSというHPを見つけ、作ろうと思っているのですが、PICでサイン波を作ったことがあるのですが、このアセンブラソースをどう眺めてもサンプリングデータの出力タイミングを変化させる肝心の部分が理解できません。どなたかご教授ねがえませんか?http://www.geocities.jp/qfhky841/このサイトのソースなのですが、Y,Zレジスタ近辺でデータを扱っているように思えるのですが。理解不能です。

  • 追記です。やっと理解できました。 - 北裏@日暮里 (2008年01月11日 22時19分59秒)

 avrspx(avrsp 0.43bベース)を公開しました - senshu (2008年01月05日 23時57分52秒)

kkkさんの avrspx(b10.10) は非常に優れたソフトですが、avrsp 0.39をベースにしているため、最近公開されたavrsp0.43bが持つ高速化機能を有効に利用できないという問題がありました。

しかし、完成度が高く便利なこのソフトを高速対応したいとの思いから、年末年始の休暇を使って、0.43bベースに書き換え作業を行いました。まだテストの段階ですが、私の使う範囲では問題なく動作するようになりました。

  • AVRマイコンのスペックテーブルを再点検
  • エラー検出の強化
  • 動作中の進捗表示(XX/XX kB, XX/XX Bのように表示)
  • コードの全体の整理

などを実施しました。USBaspを利用できるのは当然ですが、SPIブリッジと組み合わせでも最新のavrsp 0.43bと全く同様に動作します。

新たなバグの可能性も皆無ではありませんが、数日間、色々なテストをavrspx を使って行いましたが、今のところ問題は起きていません。

kkkさんから公開許可を得て、以下のURLで公開中です。

http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2Fdownload

利用してのご意見・ご感想をいただければ幸いです。

 USBASP以上に便利なAVRISP MKII互換のAVR書込み器を紹介 - andy (2007年11月16日 07時17分30秒)

AVRminiProg is an integration of my previous-developed AVR programming tools: AVRminiISP, AVRminiJTAG and AVRminiDragon, which emulate official USB-interfaced programmers from Atmel. U can use AVRminiProg in the right same way U use Atmel programmers. Software supports Atmel’s programmer will also support AVRminiProg, and official AVRStudio is recommended.

http://www.simonqian.com/en/AVRminiProg/

  • I made AVRminiProg. This is very splendid. - senshu (2007年11月25日 21時18分53秒)

 akibowさんのUARTプログラム - kawana (2007年11月12日 19時07分11秒)

akibowさんのUARTプログラムを勉強しているのですがCTS_ON,CTS_OFF,sizeofの所でエラ−が取れません、修正の仕方教えてください。--------------------------------受信フロ−制御サンプル: main.c uart.c uart.hAVR: atmega168WinAVR: 2006.xx.xxhttp://www11.ocn.ne.jp/~akibow/AVR/GSN/UART.html

 タイマー1の動作について - koke (2007年11月07日 01時39分54秒)

ATmega168+gccでタイマーの動作ではまっています。TCCR1B = 0x03でタイマースタート。TCCR1B = 0x00でタイマーストップ。その後もう一度(INT0割り込みで)TCCR1B = 0x03としてもタイマーが回りません。(4,5でも同様)ところがTCCR1B = 0x01や0x02とするとちゃんとタイマーが動きます。訳が分からなくなっていますが,何か原因は考えられますでしょうか。

  • TCCR1B=0x03;は64分周で標準動作か位相基準PWMですよね。原因究明ではありませんが、私の所ではMega168とWinAVR 20060421を使って 8bit位相基準PWMがINT0で再カウントできました。 - TAD (2007年11月11日 20時12分44秒)
  • ありがとうございます。標準動作です。 - koke (2007年11月12日 11時42分33秒)
  • 別に動かしていたタイマー0をstopさせると動きました。よく分かりませんがとりあえず目的は達成したのでよしとします。 - koke (2007年11月12日 11時44分49秒)

 キャスト演算子と三角関数計算について - neko (2007年09月14日 02時41分47秒)

mega48とwin-AVRのmath.hの三角関数を使って、角度→座標変換を行いたいと考えているのですが、コンパイル時に不明なエラーが出てしまい困っています。

原因を絞り込むために、以下のようなサンプルプログラムを作ってみました。コンパイル時にこのようなエラーが出ます。

gcc plug-in: Error: Object file not found on expected location D:\〜(略)〜test02.elf

このソースを、三角関数計算部分か、キャスト演算子での型変換部分の、どちらか一方を削除してからコンパイルすると問題なくコンパイル出来るので、多分、三角関数計算とキャスト演算子を同一のプログラムに組み込むことがエラーの原因のような気がします。

どなたかご存知の方がいらっしゃいましたらご教示お願い致します。

−−以下、サンプルソース−−

#include <math.h>
#include <avr/io.h>

int main()
{
	int8_t x;
	int8_t y;
	double xx;
	double yy;
	double r;

	r = 0.0;
	xx = 0.0;
	yy = 0.0;
	x = 0;
	y = 0;

	xx = 40.0 * cos(r);	//三角関数
	yy = 40.0 * sin(r);	//三角関数

	x = 76 + (int)xx;	//キャスト
	y = 56 - (int)yy;	//キャスト

	return 0;
}

(なお、avr studioは4.13 build 528、 win-avrは20070525を使いましたが、 古いバージョンでも同様でした。)

  • xはint8_t型ですが、castの使い方を間違えていませんか?

それと、エラーは、plug-in に関するもののようです。ちょっとこの関係が理解しにくい点です。コマンド行からavr-gcc を使って、直接コンパイルすると結果はどうなるでしょうか。 - senshu (2007年09月14日 19時46分26秒)

  • ごめんなさい。サンプルソースが中途半端な状態でUPしてました。変数定義とキャスト、ともにint型でもint8_t型でも、さらにint16_t型についても整合性とれた状態できちんと実験済みです。どれも同じエラーになりました。なぜキャストのプログラムでplug-in関係のエラーが出るのかも解らないし、エラーの意味もどう調べればよいのやら…という状態で困ってます。コマンド行からコンパイルすると何か取り込まれるモノが変わるのでしょうかね?コンパイルは統合環境からビルドしているだけで、コマンド行からコンパイルしたことはありません(最近AVR-STUDIOに触ったばかりで統合環境しか使ってないのでよく解ってません)。まずはコマンドラインからのコンパイル方法調べて試してみます。 - neko (2007年09月15日 02時20分55秒)
  • AVR studioから使うなら、最新のSPが9/14に出ています。これを適用してみるのも一案です。なお、avr-gcc を直接使ってみるのがもっとも簡単にGCCをテストする方法だとは思います。お試しください。それとmega48クラスのメモリでは実数演算と三角関数のライブラリを含めるのは難しいような気がします。フラッシュメモリの空きはあるのでしょうか。 - senshu (2007年09月15日 07時40分39秒)
  • ご指摘ありがとうございます。コマンドラインからavr-gccでコンパイルを実行してみましたが、キャストか三角関数計算のどちらかだけならエラー無し。両方組み込んだ場合はやはりエラーとなりました。メッセージによると、__fixsfsiという内部関数を二重定義しているということのようです。なお、フラッシュメモリの容量については、キャストだけ、もしくは三角関数だけでコンパイルした場合、それぞれ約0.8kb、2.8kbですので合わせても3.6kb程度でギリギリ入る容量かと思われます。最新版が出ているということなので、そちらも試してみようと思います。 - neko (2007年09月15日 15時29分11秒)
  • 以下のエラーであれば、「AVR C Runtime Library - バグ: bug #18169」だと思います。

私の使っているavr-gcc では起きないようです。一つ前のWinAVRで再度試してみてはいかがですか?

Compiling the following program with avr-gcc gives an error about
multiple definition of __fixsfsi


// program code starts here - put it in bug.c
#include <stdlib.h>
int main()
{
        double foo = atof("1.0");
        return (int) foo;
}
// program code ends here


$ avr-gcc bug.c
/usr/lib/gcc/avr/4.1.0/../../../../avr/lib/libc.a(fixsfsi.o): In function `__fixsfsi':
../../../libm/fplib/fixsfsi.S:57: multiple definition of `__fixsfsi'
/usr/lib/gcc/avr/4.1.0/libgcc.a(_sf_to_si.o):: first defined here
$ 
  • 情報ありがとうございます。ご提示いただきましたバグありのプログラムを取り込んでコンパイルしてみたところ、やはり当初のエラーメッセージと全く同じものが表示されました。既に判明しているバグと同じメッセージであるという点ではご指摘のruntime libraryのバグかもしれませんが、一方、三角関数では私の環境だけでエラーとなるのであれば、何か固有の環境が悪さしているのかもしれませんね。なお、20070525版にバージョンアップする前にも(1つ前のバージョンでも)同じエラーが出ていました。(それで20070525にバージョンアップしてみたのですが…) うーん。私の脳みそでは手詰まりかもしれませんが、引き続きあれこれ調査・実験してみようかと思います。 - neko (2007年09月16日 00時40分24秒)
  • 私の環境では上のソースでも問題なく処理できます。nekoさんと何が違うのかを考えてみましたが、私はこのサイトで公開されているgccのバグFIXを適用しています。これが問題解決に繋がっているのかは断言できませんが、適用してみてください。 - senshu (2007年09月16日 10時04分19秒)
  • パッチが公開されているんですか…。サイト内でbug-fixが公開されているというお話でしたが、探し方が悪いのか見つけられませんでした。”Win-AVRバグ情報”のページを見たり、色々なキーワードで検索かけてみたり、他のサイトも色々探ってみたのですが…。もしお手間でなければ、パッチの在りかを教えていただけないでしょうか? (やはりソースからビルドし直さないとならないでしょうかね?これまではPIC用のCCS-Cという市販Cコンパイラくらいしか使ってなかったので、ライブラリを自分でリビルドしたりした経験が無く、私には急に敷居が高くなってしまいますが、まぁそこら辺を自分で出来ない人は最初から市販のコンパイラ使うべきという話ですよね。これを機に頑張ってみたいと思います。) - neko (2007年09月16日 22時48分38秒)
  • パッチというよりも、差し替えの実行ファイル群です。このサイトの「WinAVRバグ情報」の「機能追加版 2006-04-22」のところにあります。簡単に見つけられると思いますが、いかがですか? - senshu (2007年09月17日 08時36分17秒)
  • 情報ありがとうございます。ご指摘いただきましたページに4つのファイル(avr-gcc-3.4.6-20060422.7z、avr-binutils-2.16.1-20060421.7z、avr-binutils-2.16.1-20060422-relax.7z、avr-libc-bin-1.4.4+.7z)がありましたので、一旦win-avrを20060421版に戻してみてから、上記4つの各解凍ファイルをwin-avrのインストール先に上書き〜再度コンパイルを行ってみました。が、エラーは相変わらず消えないようです。(4つ全部上書きしてコンパイルしても、各1ファイル分だけ上書きしてコンパイルしても、コンパイル通らずです) やり方が間違っているのか、原因が別なのかが目下判断出来てません。やり方が間違っているかもしれないので、もうちょっと粘って頑張ってみます。 - neko (2007年09月18日 21時43分56秒)
  • 取りあえず、avr-gcc に -Xlinker --allow-multiple-definition を追加してコンパイルしてみてください。動作するかどうかはわかりませんが、リンクは完了すると思います。 - senshu (2007年09月19日 10時19分10秒)
  • --allow-multiple-definitionを付けてコンパイルをすると通ることは通るのですが、これですと、どのような実行ファイルになっているかは不明ですね…。私の頭ではなんともしがたいので、今後正式対応されるのを待ちたいと思います。いつになるか分かりませんが… (色々検索してみると、http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1174146272などでも1年位前から取り上げられているみたいなので、当面見込み無いかも…) - neko (2007年09月20日 22時01分39秒)
  • 重複しているコードが同等のものなら、正しい動作が期待でします。こうした関数なら、デバッガで動作が追えますから、試してみてはいかがですか?根本的な解決には、自前でライブラリを保守する必要があるのかもしれませんが、それは先のオプションで期待する結果が得られないときで十分だと思います。 - senshu (2007年09月21日 06時50分00秒)
  • Nekoさんの見つけたhttp://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1174146272のReply #1にthe solution is to link with -lm(解決策は-lmをつけてリンクする)という書き込みがあります。これは試してみましたか?私の環境でも同様のエラーが発生しましたが、これで解決しました。WinAVR付属のMFileで作成したMakefileではこのオプションが標準でつくようになっていたので、こちらでコンパイルするといいかも知れません。AVRStudioからはProject ConfigのLibrariesという項目でlibm.aを選択し、Add Libraryで追加することでリンク時にこのオプションがつくようになります。 - Shogo (2007年09月24日 15時41分02秒)
  • ありがとうございます。AVRStudioでlibm.aを追加してコンパイルしたところ正常に通りました。まだシミュレーター等で細かい検証ができたわけでは有りませんが、ひとまずチップに書き込んで実行したところ、当初考えていたとおりの動作を行うことが確認出来ました。the solution is to link with -lmの一節は実はやはり気になったので自分でも試してみていたのですが、その時はやり方が悪かった(avr-gccコンパイラのオプションかと思って、コマンドラインからavr-gccでコンパイルするときのアーギュメントに-lmを指定してました…makefike中に指定するオプションなんですね。gccは最近AVR使うようになってから初めて触ったのでよく解ってませんでした。)ようで上手くいかず、今回のケースには当てはまらないのかと思ってました。 - neko (2007年09月26日 19時11分26秒)

 不具合・スパムなどについて- 管理人 (2007年08月18日 19時39分17秒)

しばらく放置状態が続いてしまい申し訳ありませんでした現在不具合について調べています

  • 一応対応を完了させたつもりですが、まだ不具合が出るようでしたらご連絡ください。 - 管理人 (2007年08月26日 13時28分17秒)
  • まだ、このWikiと無関係の海外からの書き込みがあるようです。 - 通りすがり (2007年08月28日 09時58分54秒)
  • スパムと思われるIPの範囲を拒否するようにしました。これで大丈夫だと思うのですが。 - 管理人 (2007年08月30日 18時53分54秒)
  • スパム対策に「a href」が含まれる文字列を保存できないようにしました。 - 管理人 (2007年09月12日 20時29分35秒)
  • いくつかのタグ用プラグインが無効になっていたのを直しました。 - 管理人 (2007年09月16日 10時13分57秒)
  • なるほど、それでタグが生で見えていたのですね。了解しました。 - senshu (2007年09月17日 08時40分21秒)
  • 相変わらずスパムが多いので、投稿時に認証番号を入力する、などの方法を取ろうかと思っています - 管理人 (2007年10月17日 22時11分51秒)
  • FreeStyleWikiのbbsプラグインの改造ができる方いましたら、ご協力お願いします - 管理人 (2007年10月17日 22時14分13秒)
  • WikiのBBSプラグインを改造し、簡単な認証機能をつけてみました。技術的には「猫認証」と呼ばれるものと同一です。今は画像が単に数字なので画像認識のできるロボットプログラム対策にはなりませんが、これをいずれ電子部品の記号で置き換える予定です。精度も8ビットしかないので破ろうと思えば簡単に破れますが、とりあえずこれでしばらく様子を見てみたいと思います。 - 管理人 (2007年10月21日 15時37分09秒)

 関数テーブル参照 - samsara (2007年04月03日 09時50分59秒)

関数テーブルによる関数ジャンプの方法は、従来は次のように記述しておりましたが、AVRマイコンではフラッシュ上の変数にアクセスする方法が特別のようであり、どうもわかりません。AVR-LibCのプログラムスペース文字列ユーティリティを使う事で出来そうなのですが、具体的にどのように記述して良いかわかりません。ご指導頂けますでしょうか?

/* 関数型宣言 */
typedef void (*FUNC)( void );
/* 関数テーブル(ROMに配置) */
static FUNC FuncTable[5] =
{
  func0,
  func1,
  func2,
  func3,
  func4
};
/* 関数CALLを行う関数 */
void test( int i )
{
  FUNC func;
  if( 0<=i && i<5 ){
    /* 関数テーブルから関数ポインタを取得 */
    func = DlcFuncTable[i];
    /* NULLでなければ、関数CALL */
    if( func != NULL ){
      func();
    }
  }
}

void func0( void )
{
}
void func1( void )
{
}
void func2( void )
{
}
void func3( void )
{
}
void func4( void )
{
}
  • こんな感じでしょうか・・・
・・・
#include <avr/pgmspace.h>
・・・
/* 関数テーブル(ROMに配置) */
static FUNC FuncTable[5] PROGMEM =
・・・
};

/* 関数CALLを行う関数 */
void test( int i )
{
・・・
    /* 関数テーブルから関数ポインタを取得 */
    func = (FUNC)pgm_read_word(&FuncTable[i]);
・・・
}

- kkk (2007年04月03日 23時36分34秒)

  • 早速の回答ありがとうございます。コンパイルできましたが、現在のところ実機が無いので動作確認は未だです。実機での動作確認しましたら、また結果を報告します。 - samsara (2007年04月04日 10時59分37秒)
  • 報告が遅くなりましたが、実機動作での確認を行いました。正常動作の確認できました。ありがとうございます。 - samsara (2007年08月24日 14時59分07秒)

 USBasp -> STK500v2 conpatible (direct from AVR-Studio useable) - 名無しさん (2007年03月25日 11時24分22秒)

Firmware compatible to USBasp Hardware http://www.ullihome.de/index.php/USBAVR-ISP

Download Firmware Source Stand 22.03.2007http://www.ullihome.de/index.php/USBAVR-ISP-Download/de

Hilfehttp://www.ullihome.de/index.php/USBAVR-ISP-Help/de

 AVR内蔵のEEPROMに - CZ500C (2007年03月23日 13時09分04秒)

ISP時にDATAを焼き込んでしまうことは出来るのでしょうか?また出来るとしてそのDATAはどのように作ればいいのでしょうか?

  • このwiki内の http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+%2D+EEPROM が参考になりませんか? - kkk (2007年03月23日 22時39分21秒)
  • ひととおり目は通しての質問です。このURLは運用方であって私の質問内容とは全く違います。 - CZ500C (2007年03月23日 22時45分20秒)
  • 一つたとえます。LCDを接続し表示用のDATAをあらかじめ作りEEPROMにプログラム時に書き込んでおくことが出来るのか?ということです。 - CZ500C (2007年03月23日 22時47分56秒)
  • 可能です。http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+%2D+EEPROM を理解すれば自ずと解決するでしょう。 - void (2007年03月23日 22時56分51秒)
  • もしかして書き込み方が分からない? EEPROMセクションを定義すると、拡張子が.eepのHEXファイルが出来るので、それを書き込んでやればよいだけです。 - void (2007年03月23日 23時02分19秒)
  • ありがとうございます。拡張子eepですね!使用ISPソフト側の仕様を確かめて焼いてみます。 - CZ500C (2007年03月23日 23時38分49秒)

 すzのAVR研究 - すz (2007年03月10日 00時00分12秒)

すzのAVR研究というblogを立ち上げました。よかったら見てみてください。http://suz-avr.sblo.jp/

 ATtiny2313のシリアルプログラミングについて - camopoo (2007年03月07日 02時58分41秒)

 はじめまして。 ATtiny2313シリアルプログラミングにて、下位ヒューズビットのRSTDISBLビット(ビット0)を誤って、'0'にプログラミングしてしまいました。この後、ライター側でデバイスへの接続ができなくなってしまいました。一旦、RSTDISBLビットに'0'を書き込むと、2度とプログラミングができなるのでしょうか? 何か復旧する手段がありますでしょうか? どなたか、わかる方がいましたらご教授お願いします。

  • 高電圧パラレルプログラマが必要です。それを購入するか、作るかしなければなりません。それはかえってお金がかかるので復活はあきらめたほうが無難です。 - とおりすがり (2007年03月07日 03時12分05秒)
  • とおりすがりさん、ご回答ありがとうございます。当方チップの入手をネット通販でしてるため、送料がチップに比して高額になるので、何とか復旧できないものかと考えていました。確かに、作るにしてもお金がかかりそうなので、新しいものを購入しようとおもいます。ありがとうございました。 - camopoo (2007年03月07日 05時25分06秒)
  • 別のTiny2313が必要ですがリセッターを作ってみました。http://homepage2.nifty.com/denshiken/AVW015.html - TAD (2007年03月08日 00時25分30秒)
  • TADさん、ありがとうございます。まだ、購入してないので時間が取れ次第試してみたいと思います。 - camopoo (2007年03月11日 15時36分16秒)
  • すみません、早とちりしました。ひとつ余分なTINYがないと無理のようですね。現在RSTDISBL”0”のチップしかないので、まずは新品を買って、復旧にトライしてみます。 - camopoo (2007年03月11日 15時41分16秒)

 avrgcc内でのアセンブラのトレースができない - 鹿ケ谷 (2007年03月06日 10時00分25秒)

始めまして。

avrgccでアセンブラを使う」の「割り込みルーチンをアセンブラで書いてみる」をそのままWinAVR 20070122とAVR Studio 4.12で実行してみたんですが、アセンブラのソースコードがAVR Studioでデバッグ時に表示されず、トレースできません。

お知恵を貸してください。

  • WinAVRのアセンブラのソースデバッグはサポートされてなかったように思います。が・・・Cソースmain()等が表示されているところで右クリックのメニューから「Goto Disassembly」を選択してDisassmbleリストを表示し、そこで目的の箇所にブレークポイントを設定すればそこからアセンブラレベルでトレースすることは可能です。注意点はWinAVR(gcc)のアドレスはバイト単位のアドレスなのに対してAVRStudioではワード単位のアドレスが表示されることです。例えばWinAVRでアドレス0x0100はAVRStudioの逆アセンブルリスト上では0x0080となります。 - kkk (2007年03月06日 18時00分35秒)
  • ご教示ありがとうございます。できないとは知りませんでした。逆アセンブラでデバッグだとちいさいものならいいですが、大きなプログラムになると大変そうですね。なお、WinAVR 20070122のアセンブラには割り込みベクターの処理がおかしい、I/Oレジスタアドレスのオフセット計算が間違ってるというバグがありました。 - 鹿ケ谷 (2007年03月09日 14時45分37秒)

 迷惑な書込み - kkk (2007年02月16日 06時02分15秒)

最近また以前のような海外からのスパム的な書込みが繰り返されています。古い「雑談」のところに書き込まれています。何か対策はないでしょうか?

  • コメントスパム除けには全角文字コードが1つも使われていなければ弾くとかがメジャーじゃないでしょうか。 - ぱど (2007年02月18日 00時06分12秒)
  • あと「tiananmen」「falun gong」「mao zedong」「chinese filters」などの - ぱど (2007年02月18日 00時12分54秒)
  • <上の続き>単語を入れておくと中国からググれなくなって中国系のコメントスパムが減るかも。 - ぱど (2007年02月18日 00時14分49秒)
  • おそらくBOTでしょうから入力項目を1つ増やせばOKと思います。例えば投稿者に固定キーワード(WELOVEAVRとか)を入力させて一致しなければ弾くのはどうでしょうか。キーワード自体は全角コードにして書いておけば日本語圏外からは判らないと思います。 - 六さん (2007年03月14日 15時46分45秒)
  • 古い「雑談」のところの{{comment}}を一部削除しておいたらその部分には今回書込みがありませんでしたので、今回「雑談」のページのみとりあえず{{comment}}を削除して見ました。次のサーバーメンテナンスの時に管理人さんが何か対策をしていただけるのかな? - kkk (2007年03月15日 16時54分42秒)