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

雑談

雑談場所

お名前
件名
本文

 TTiny85へstudio7で書き込みたいが・・。 - ひろじい (2017年08月16日 12時38分00秒)

全くの素人です。
今回誤ってTTiny85使用の機器を破損し、TTiny85を交換しファイル書き込みしたいのですが、超簡単ライターの自作は可能でしょうか?
Webサイト等ご紹介いただければ幸いです。
自力で探すも「AVRSP-COM」を発見しましたが、studio7使用できるのか不明です。
ライターソフト「avrspx」見つかりません、Win10では使用できないかもと推測しています。

お名前: コメント:

 ATMEGAとstudio4でarduino serial.println機能を実現したい。 - kawana (2016年04月29日 12時00分57秒)

UARTsampleをTESTしたが、UART TXが上手く起動せず、UARTに出力出来ない。(C言語)

Programの開始で、メッセ−ジ文を1行、出力したい。
(メッセ−ジ文出力が繰り返され多数行に成ってしまう。programの
組み方が悪いと思う??、修正を思いつか無い)

お名前: コメント:

 avrライタについて - うちだ (2013年11月12日 12時34分31秒)

始めまして AVR初心者です。
デジットのAVEWRTをAtmel Studio6.1組み込んで書き込み操作する方法はないでしょうか。現在は一旦別のホルダーにセーブした後、AVRWRTを起動して書き込みをしています。
回答をお願いします。

お名前: コメント:

 配列の大きさについて - 根っこ (2013年09月25日 14時25分29秒)

はじめまして。

現在ATmega644Pを使用しており、double型の配列(要素数400)を4つ定義して各配列にデータを読み書きしようとしています。
しかしコンパイルは通ったのですが、実際には読み書きができていないという状況です。
何か、このような多くのデータを処理する方法はないでしょうか。(できればSRAMの増設は避けたいです)

稚拙な内容で申し訳ありませんが、ご回答お願いします。

  • すみません。自己解決できました。 - 根っこ (2013年10月01日 17時15分48秒)
お名前: コメント:

 マクロ関数の優先順位 -東(2013年01月31日 14時35分23秒)

マクロ関数内では括弧内のマクロが優先されたりはしないのでしょうか。下記のようなプログラムを想定しています。
#define TXD "PORTD,PD2"
#define sbi(PORT,BIT) PORT|=_BV(BIT)
sbi(TXD);
sbi()以外にもcbi()やibi()等々でも利用したいので、マクロ関数を新しく作るのはできるだけ避けた良い方法はありませんでしょうか。

お名前: コメント:

 AVR Studio 5 でのデバッグについて困っています。 - 小峰 (2012年01月01日 21時15分38秒)

はじめまして。
AVR Studio 5 でのデバッグについて困っています。
最新バージョンのStudio5をインストールしています。プログラムを記述しビルドまではエラーなく動きますが、デバッグしようとするとターゲットが接続されていないからデバッガ-が起動できない旨のエラーが出ます。
いろいろ調べてみましたが、Project PropatyのDebugger タブに表示されるデバッガーの欄は空白でリストにも何も表示されません。Studio5がデバッガ-やシミュレータを認識していないようです。
インストールしなおしを何度かやってみても同じです。
また、ヘルプマネージャーもインストール先フォルダにどこのホルダを指定しても(ローカルやALL USERのフォルダ)エラーが出てしまうのでヘルプを見て対処することもできません。
Studio4.19ではデバッグできるのですが・・・。

ところでStudio5のインストール先のホルダにスペースや日本語が入っているとうまく作動しないとかあるのでしょうか。

よろしくお願いします。

  • AVRstudio ツール → FirewareUpgrade にてライターを認識させれば 、Project Propatyに認識させたライターが出てくると思います。 - sho (2012年02月09日 07時44分11秒)
  • ATMEGAとstudio4でarduino Serial.println機能を実現したい。 - kawana (2016年04月29日 11時42分51秒)
お名前: コメント:

 初めてのチップ - NiwakaPICer (2011年07月20日 16時34分32秒)

PICからAVRに乗り換えようと思っているのですが、入門に適したチップは何を買えばいいでしょうか?

  • Tiny2313(\100)とmega328(\250)秋月にて。 - kuman (2011年07月24日 15時24分39秒)

 sandboxは復活できないのでしょうか。 - kuman (2011年06月20日 04時21分11秒)

AVRwikiを復活していただいてありがとうございます。
ところで、sandboxは復活できないのでしょうか。
有用な情報がかなりあったと思うのですが。

  • 復活ご苦労様でした。 しかし、かなり不安定なようですね。避難所(ミラーサイト)が必要に思うのですが、如何でしょう? - qwerty (2011年06月27日 22時06分20秒)

 でんし研氏のTiny45リセッタを、Tiny84用に改造したいのですが - comop (2010年12月14日 06時16分33秒)

Tiny84Vが比較的安く手に入ったので、Fastbootと言うブートローダーを入れて使おうと
しています。TIny85では、PB5をI/Oにして、書き込み出来たので、RSTDUSBL=1にしたい
のですが、Tiny84のリセッタが無いので、苦慮してます。(ミスって一個止まりました)

回路図を見ると、接続端子数等はTiny85と変わらないので、デコードして、アセンブラに
書かれていた、フューズ、シグニチャを変更して、Tiny13でやらせてみたのですがダメで
した。ヒントが貰えないでしょうか?

  • 返信遅れました。方式は同じだと思います。来週、時間があれば実験してみます。 - TAD (2010年12月31日 10時46分11秒)
  • ありがとうございます、期待してます。 - comop (2011年01月05日 18時11分19秒)
  • PA0,PA1,PA2ポートをGNDに接続する必要がありました。リセッターの記事を更新。http://homepage2.nifty.com/denshiken/AVR004.html - TAD (2011年01月06日 23時48分49秒)
  • ありがとうございます、助かりました。すぐ作ってみます。 - comop (2011年01月07日 03時00分59秒)
  • 無事完成して、駄目だったTiny84が復活しました。感謝します! - comop (2011年01月09日 03時29分12秒)


 外部割り込み内(PCINT1_vect)での変数の扱い 訂正^^; - たなかい (2010年12月07日 22時49分05秒)

うまく割り込み処理のなかでの変数の代入がうまくいきません。
なぜか変数xだけはちゃんと10になっています。

下記がソースコードの一部です。
main内では大域変数x,p,sizeを扱う処理をしています。
pattern1[],patten2[]も大域配列です

uint8_t *p=pattern1;
uint8_t size=PTN1_SIZE;
uint8_t x=0;

ISR(PCINT1_vect){
	x=10;
	p=pattern2;
	size=PTN2_SIZE;
} 
  • volatile - たたた (2010年12月08日 12時38分14秒)
  • ありがとうございます - たなかい (2010年12月12日 17時22分54秒)



 ライタとの接続についての質問です - やまだ (2010年10月25日 20時11分09秒)

すみません。初心者です。ATTINY13A-PUへ書き込むためAVR-ISP mk?を接続したいの
ですがどのような治具を作ったらよいですか。基本的な質問ですみません。
図でご回答いただけるとありがたいのですが。


 AVR Toolchainについて - yana (2010年10月02日 00時53分58秒)

お世話になります。
AVR マイコン初心者の物です。
早速ですが、AVR ToolchainてAVR StudioからWinAVRのように使用できるものなのでしょうか?
ご使用の方がいらっしゃれば感想等もお聞かせ願えれば幸です。

  • まだそれほど使い込んでいませんが、WinAVRと同様に普通に使えています。 - kkk (2010年10月02日 18時49分09秒)
  • 返事遅れて申し訳ございません。新規プロジェクトでWinAVRの選択で使用できるようですね?

ありがとうございます。 - yana (2010年10月04日 09時48分08秒)


 空いているメモリを有効活用した〜い - 静 (2010年08月20日 09時32分41秒)

atmega128を使用して思った事は、拡張I/Oレジスタの部分($009E-$00ff)
が予約されているようで、使えないのはもったいないです
そこで,
LDI R16,$AA
LDS $00A0,R16
STS R17,$00A0
AVRStudioでアセンブルしデバッカでR17を確認してみるとちゃんと$AAが書きこまれています。
しかし実際にmega128に書きこみ上記同じようなプログラムで$009E-$00ffの部分を確認して
みるとデータが不定になるようです。
どなたか使える方法を知りませんか?

  • AVRStudioではハードウェアそのもの全てをシミュレートしてる訳ではありません。実チップでの動作が正解です。 - 名無しさん (2010年08月20日 20時33分15秒)

  • ありがとうございます。実チップでテストしてみました、
LDI R16,$55  
STS  $00A0,R16  
LDI  R16,$AA   
STS  $00A1,R16

とすると($00A0)のデータが消え、($00A1)のAAのデータは保持されるようですね、
何故そうなるか解りませんが、諦めるほうが得策かもですね。 - 静 (2010年09月06日 10時43分00秒)


 Getting Started Notesの記事の誤りについて - がた老 (2010年04月28日 15時20分27秒)

AVRWikiの上記記事はAVRを始めた頃、大変お世話になりました。
最近、改訂が入ったようですが、私の経験した記事の誤りがまだ訂正されて
いないようなので、場所が違うかもしれませんがご報告しておきます(すみ
ません。修正の仕方が良くわからないもので)。

・「UART」のUART関連レジスターUCSRC(megaのみ)で、「通常のUART通信を
する場合には設定の必要はないレジスタです。説明省略〜」と、ありますが、
UCSZ1-0の2つのビットは、デフォルトは5ビットフレームで、普通の8ビット
調歩同期にするには、UCSZ2,1,0を011にする必要があります。つまり無視でき
ません。(UCSZ2はUCSRBにある)

・「EEPROM上の変数」の関数一覧で、
void eeprom_write_block (const void *buf, void *addr,size_t n); は、
引数の位置が逆です。第一引数がSRAM上アドレス、第二引数がEEPROM上のアド
レスとなります。
  • ATmega128を使っていますが初期値のままで動いています。他のmegaのデータシートも2種類ほど見てみましたがUCSZ0-1の初期値は11になっています。念のため記事の該当部分に注意書きを入れておきました。 - 松球 (2010年06月25日 12時26分19秒)
  • 「EEPROM上の変数」の所は直しておきました。 - 松球 (2010年06月25日 12時33分27秒)


 大ニュース - リン (2010年04月05日 19時42分40秒)

こんにちは、始める電子回路の リンと申します。
こちらの情報には大変お世話になっています。

昨日知りましたがhiro's downLoadさんのAVRの日本語データシートはすべて有料
になったようです。AVR使用には影響大ですね。

印刷すると分厚くなるような翻訳は大変だったろうなと思っていました。特に
データシートのような数字1つまで正確さが要求されるもので、間違いに当たっ
たこともなかったし。

アマチュアには大きすぎる料金ですが、これまで大変お世話になりました。この場
で感謝を。

  • ”データシート訳”で金とったらATMELに怒られるんじゃ・・・ - qwerty (2010年04月07日 21時37分21秒)
  • ATMELジャパンの見解はどーなんだろ… - 1815 (2010年04月08日 16時17分13秒)
  • 厳しいですよねえ・・代用になる資料は AVRマイコンリファレンス・ブック しか無いかな - sugan (2010年06月14日 20時32分06秒)
  • ATMELジャパンが買い取って無料で公開してくれたら丸く収まるのに… - 松球 (2010年06月25日 12時36分34秒)
  • avr.jpで再公開しているみたいです。 - 匿名 (2010年09月01日 17時58分18秒)

 Tyny2313でのプログラミングについて - JUN (2010年03月10日 12時29分22秒)

初めまして。
つい最近AVRでのプログラミングを始めまして、わからないことがあったのでここで質問させていただきます。

現在、私はGPSからシリアル通信で得た位置情報をもとにステッピングモータを制御するというプログラムを作っています。

今のプログラムではシリアル通信をするためにヒューズビットでシステムクロックの8分周をOFFにしているのですが、

こうするとモータのほうが動かなくなってしまい、逆に8分周にするとシリアル通信ができなくなってしまいました。

何とか、1つのマイコンでGPSとの通信とモータの制御を同時に行う方法はないものでしょうか?

一応、以下がソースとなります。

#include <avr/io.h>
#include <stdlib.h>
#include <avr/eeprom.h>

#define length 4

char longitude[length];	// 経度データ格納配列
char latitude[length];	// 緯度データ格納配列
unsigned char address = 0;	// EEPROMアドレス

// PORT設定
void PORT_init(void)
{
	DDRB = 0b11111111;	/* ポートB全出力 */
	PORTB = 0b00000000;	/* PORTB */
}

// USART設定
void USART_init(void)
{
	UCSRB = (1<<RXEN)|(1<<TXEN); /* 送受信許可 */
	UCSRC = 0b00000110;	// パリなし
				// ストップビット 1ビット
				// データビット 8ビット
	UBRRH = 0;
         UBRRL = 51;		/* 8MHzにて9600bps設定 */
}

// 1文字送信
void rs_putc (char c)
{
	loop_until_bit_is_set(UCSRA, UDRE); // UDREビットが1になるまで待つ
	UDR = c;
}

// 1文字受信
char rs_getc(void)
{
   loop_until_bit_is_set(UCSRA, RXC); // RXCビットが1になるまで待つ
   return UDR;
}

// テキスト受信
void rs_gets (void)
{
	short byte = 0, i = 0, j = 0;
	char c;

	while(1){
		c = rs_getc();		// 1バイト取得
		if ( c == 0xE0 ) {	// ヘッダが見つかればデータ取得開始
			byte++;
			while( byte <= 10 ) {	// 経緯度データ取得
				c = rs_getc ();
				if( byte >= 3 && byte <= 6 )	// 経度取得
					longitude[i++] = c;
				else if( byte >= 7 ) 		// 緯度取得
					latitude[j++] = c;

				byte++;
			}
			break;
		}
	}
}

// EEPROM書き込み
void EEPROM_write(unsigned char ucAddress, char ucData)
{
	while(EECR & (1<<EEPE));		/* 以前のEEPROMプログラミング完了まで待機 */
	EECR = (0<<EEPM1)|(0<<EEPM0);	/* 対応プログラミング種別設定 */
	EEAR = ucAddress;			/* EEPROMアドレス設定 */
	EEDR = ucData;			/* EEPROM書き込み値を設定 */
	EECR |= (1<<EEMPE);		/* EEPROM主プログラム許可 */
	EECR |= (1<<EEPE);			/* EEPROMプログラミング開始 */
}

// EEPROM読み込み
char EEPROM_read(unsigned char ucAddress)
{
	while(EECR & (1<<EEPE));	/* 以前のEEPROMプログラミング完了まで待機 */
	EEAR = ucAddress;		/* EEPROMアドレス設定 */
	EECR |= (1<<EERE);		/* EEPROM読み出し開始 */
	return EEDR;		/* EEPROM読み出し値を取得,復帰 */
}

// 飛行ログをEEPROMに保存
void EEPROM_save(void)
{
	short i = 0;
	char c;

	for( i = 0; i < 8; i++ ){
		if( i < 4 )	EEPROM_write(address,longitude[i]);	// EEPROM書き込み
		else EEPROM_write(address,latitude[i-4]);		// EEPROM書き込み
		c = EEPROM_read(address);	// EEPROM読み込み
		rs_putc(c);
		address++;
		if( address >= 128 )	address = 0;
	}

}

// パルス発信時間
void wait(uint16_t k)
{
	volatile uint16_t i, l;

	for( i = 1; i < k; i++ )	l = i;
}

// モータ制御(仮)
void motor(int time)
{
	uint16_t k = 80;
	int i;
	/* 右モータ・・・PB3:φ1,PB2:φ2,PB1:φ1-,PB0:φ2-
    左モータ・・・PB7:φ1,PB6:φ2,PB5:φ1-,PB4:φ2- */

	for( i = 0; i < time; i++ ){
		PORTB=9; wait(k); PORTB=3; wait(k); PORTB=6; wait(k);	PORTB=12; wait(k); // 右前
		//PORTB=9; wait(k); PORTB=12; wait(k); PORTB=6; wait(k);	PORTB=3; wait(k); // 右後ろ
		//PORTB=144; wait(k); PORTB=192; wait(k); PORTB=96; wait(k);	PORTB=48; wait(k); // 左前
		//PORTB=144; wait(k); PORTB=48; wait(k); PORTB=96; wait(k);	PORTB=192; wait(k); // 左後ろ
		//PORTB=153; wait(k); PORTB=195; wait(k); PORTB=102; wait(k);	PORTB=60; wait(k); //左前 右前
		//PORTB=153; wait(k); PORTB=204; wait(k); PORTB=102; wait(k);	PORTB=51; wait(k); // 左前 右後ろ
		//PORTB=153; wait(k); PORTB=51; wait(k); PORTB=102; wait(k);	PORTB=204; wait(k); //左後ろ 右前
		//PORTB=153; wait(k); PORTB=60; wait(k); PORTB=102; wait(k);	PORTB=195; wait(k); //左後ろ 右後ろ
	}

}

int main(void)
{
	PORT_init();		// PORT設定
	USART_init();		// USART設定

	while(1){
		rs_gets();		// 経緯度受信
		EEPROM_save();	// 受信できたらEEPROMに保存
		//rs_puts(longitude);	// 経度送信
		//rs_puts(latitude);	// 緯度送信
		motor(2000);		// モータ制御(仮)
	}
}

出来れば、早めにアドバイスを頂けるとありがたいです。
それでは、よろしくお願いいたします。

  • 1MHzでは9600bpsにできないので、CLKPR=(1<<CLKPS1); UBRRL=12;// 2MHzで9600bpsでは

どうでしょうか。 - TAD (2010年03月11日 00時19分04秒)

  • 回答ありがとうございます。教えていただいた方法を試してみましたが、上手くいかなかった

ようです。
しかしwait関数の引数を増やしてみたところ、通信とモータ制御を同時に行うことができました。
自己解決という形になってしまいましたが、アドバイスありがとうございました。 - JUN (2010年03月11日 00時50分02秒)


 セルフプログラミングの利用にかんして - たいすけ (2010年03月06日 13時51分34秒)

複数のAVRを有線通信できるように接続し、一つのAVRにプログラムを書き込めば、そのプログラムが
すべての接続されたAVRに波及するということを実現したいと思っています。
しかし、セルフプログラミングやメモリへのアクセス等が曖昧でやや途方に暮れています。
少しでもなにかアドバイスやコメントのある方がいればお願いします。
まだ、質問が曖昧なので、もう少し勉強します。



 V-USBをATmega88p、168p、328pで動かす方法 - osum (2010年01月11日 03時23分00秒)

はじめまして、マイコン初心者です。

秋月でmega328pが安く売り出された今日この頃、USBジョイパッドとかが簡単に作れるV-USBを
328pで動かしたい人も多いと思います。むしろ僕が動かしたい。

exampleのhid-mouseを動かすことに成功したのでとりあえずレポートしておきます。
(素直にターゲットを328pにしただけでは動かなかったので)

開発環境
OS : Windows XP professional
AVR Studio : ver 4.17
WinAVR : 20090313
V-USB : vusb-20090822

hid-mouseを動かすレシピ:

1. http://www.obdev.at/products/vusb/index.html からV-USB本体をダウンロードしておく。

2.AVR StudioでWinAVR用のプロジェクトを作る。ターゲットはATMega328p。ここではプロジェクト名をtest_mouseとする。

3.プロジェクト用のフォルダtest_mouseが出来ていると思うので、ダウンロードしたV-USBに入っているusbdrvフォルダをtest_mouse\に丸ごとコピー。また、V-USBに入っているexamples\hid-mouse\firmware\以下のファイルも丸ごとコピー。

2.Project->Configuration OptionsのGeneralタグのところでfrequencyを12000000Hz(使ってるクロック数、12MHz、16MHz、20MHzなどV-USBで対応しているクロック数にする。当然回路のほうもそれと同じ周波数の水晶を使う)。

3.Project->Configuration OptionsのInclude Directoriesにtest_mouse\とtest_mouse\usbdrv\を追加する

4.View->AVR GCCで表示される(普通は元々表示されてる)ところで、Souce files右クリック->Add Existing Source file(s)で、test_mouse\とtest_mouse\usbdrv\にある追加できるファイルをすべて追加する。

5.同様にHeader filesにもtest_mouse\とtest_mouse\usbdrv\にある追加できるファイルをすべて追加する。

6.とりあえず一回コンパイルする。

7.一回コンパイルするとAVR GCCウィンドウのExternal Dependanceにファイルが追加されるので、その中のiom328p.hを開く。

8.iom328p.hの中に次の行があるので

#define INT0_vect _VECTOR(1) /* External Interrupt Request 0 */

この行の下に

#define SIG_INTERRUPT0 _VECTOR(1)

と言う行を追加する。

9.もう一回コンパイルする。

10.ATmega328pに書き込んで出来上がり、回路はV-USBに入っているmega8用の回路図を使えばOK。

要するに割り込みの名前が変わってしまってただけですね。

  • usbconfig.hの最後で#define USB_INTR_VECTOR INT0_vectを指定した方が良いのではないでしょうか。どちらでも結果は変わりませんが、こうすれば他のPCに持って行っても正しく動きます。iom328p.hを書き換えるとWinAVRのアップデートとかで上書きされそうでちょっと怖いです。 - 名無しさん (2010年03月13日 18時04分18秒)


 ATTiny-13AのA/D変換が動かない - butt (2010年01月03日 01時32分22秒)

あけましておめでとうございます。

AVR-StudioとWinAVRで、勉強しているのですが、AD変換がどうしても動作しません。

データーシートの内容はもちろん、web上に公開されているサンプルプログラムをIO回りだけ
最適化して書き込んでみましたが動作しません。

かれこれ一週間ぐらい悩んでいます。

以下ソースです。
 

#include <avr/io.h>

volatile unsigned char ad_data;

void wait(volatile int msec){
    while(msec--);
}

int main(void)
{
  DIDR0=0x20; //PB0(ADC0)のデジタル入力を禁止//
  DDRB=0x18;  //PB0,PB5,PB6,を入力に設定//
  PORTB=0x26; //PB0を除いて入力をプルアップ//
  ad_data=0;  //グローバル変数の初期化//

while(1) 
{ 

  ADCSRA=0b10010110;  //A/Dを許可し、変換完了フラグをリセット、//
                      //動作クロックは1/64に設定//
                      //(9.6M駆動なので150kHzで動作させる)//

  ADMUX=0b00100000;   //基準電圧=VCC(5V)結果出力を左揃えに設定、
                      //チャンネルはPB5を選択//
	
  ADCSRA|=_BV(6);     //ADSC(A/D変換開始レジスタ)に1をセットし変換開始//
	
  loop_until_bit_is_set(ADCSRA,ADIF);
                      //変換完了フラグが1になるまで待機//

  ad_data=ADCH;       //ad_dataにデータの上位8ビットを格納// 
                      //(2〜10bit目までのデータ)// 

  PORTB=0x08;         //LED1点灯//
  wait(ad_data*1000);

  PORTB=0x10;         //LED2点灯//
  wait(ad_data*1000); 
  }
 return 0;
}

 
使っているマイコンはATtiny13-A,I/Oは、1番ピンから順に入力、出力、出力、GND、入力、入力、入力、VCCとなっています。パスコンは入れてあり、PIN5をのぞくすべての入力は10kΩの抵抗でプルアップしてあります。

アナログ入力は電源電圧5vを100kΩで分圧したものです。

ライターは、純正USBライタのmk2です。

シュミレーションでは変換完了フラグが立つまで待つというところまでは正常に動いていますが、なぜか結果出力レジスタ(ADCD)に値がセットされません。

実際の動作は、ad_dataに255がセットされたときと同じ間隔で点滅しています。

ためしにad_dataを初期化してみましたが、やっぱり255がセットされているようです。
肝心の半固定抵抗からの分圧入力に対してはさっぱり反応していません。

たびたびで申し訳ありませんが、どうかよろしくお願いいたします。

  • 本当に申し訳ないです。よーく考えるとPB0はコンパレーターの入力でした。そりゃぁアナログ入力受け付けないわけだ・・・。解決しました。 - butt (2010年01月03日 13時47分18秒)

 AVR Studio 動作エラー - T2010 (2010年01月01日 17時12分11秒)

あけましておめでとうございます。

AVR studio が動作しなくなって困っています。
どなたかお知恵をお貸しください。

アンインストールして、いろんなバージョンを入れてみたのですが
全てNGです。 プラグインファイル(XML)がうまく初期化されないのだと思うのですが、原因がつかめません。

messageとして、以下の内容が起動時に出て Buildメニューにもアセンブラすら出ません。 デバイスもグレーアウトされていて新規プロジェクトの作成も出来ません。

Error creating plugin :
Error creating compiler

いつからおかしくなったのかは不明です。(このPCは2ndマシンとして使っているので。 もう一台は大丈夫)

先月、このPCでメモリーエラーが発生したため現在不良のメモリーを抜き取って、256+256+512MBにしました。 そのときついでに1.5Tのハードディスクを増設しドライブレータを H=>D に変えました。考えられる変化点はそのぐらいです。  あと、(VisualStudio2008)を入れた。

環境
pen4 / WinXP SP3 / mem1GB / HDD c=256MB d=1.5TB
試したAVRstudioは V4.16/4.18/4.14 全てだめでインストール先のドライブやディレクトリを変えてもだめです。 AVGFree9.0を使っているのでこれをアンインストールしてもだめでした。AVRStudio/WinAVRのインストール自体は全く問題なく終了します。


AVR Studio以外の PC一般の動作は問題ないように見えます。

何か手がかりになることをご存じであればアドバイスお願いします。 Windowsクリーンインストールだけは避けたいです。




  • 環境変数でテンポラリのパスに日本語が入ってるとかじゃ無いでしょうか? - KABA (2010年01月04日 04時23分53秒)
  • アドバイスありがとうございます。環境変数には日本語は入っていませんでした。 - T2010 (2010年01月04日 23時33分07秒)
  • 日本語=全角文字 です - T2010 (2010年01月04日 23時33分51秒)

 リンク切れしてます - butt (2009年12月31日 10時30分08秒)

AVR-LibCのページ中の、AVR-LibC 1.4.x の日本語訳(らしきもの)
以下にある、1.4.xの日本語訳へのリンクが切れてます。

オリジナルのほうは切れてません。

日本語訳がすごくありがたくて、ちょくちょく利用させていただいていたんですが、たまにはオリジナルのほうを辞書片手によんでみることにします。



 AvrStudio4.18において - KABA (2009年11月18日 09時17分42秒)

AvrDragonのターゲットの32KB縛りがなくなりましたね。
JtagICEmkIIがいらなくなる^^;

  • 気付かなかった・・・いいことですね - KY (2009年11月20日 06時23分49秒)

 なぜか動きません - butt (2009年11月09日 20時30分44秒)

はじめまして。

AVR studioとWinAVRを使って初めてマイコンをC言語で勉強しているのですが、以下
のプログラムを書いてもなぜか動きません。

一応いろいろと試してみたのですが、シュミレーションしてみてもPORTB=0x00の
ところでとまっていまいます。

どうしてもわからないので教えてください。

以下プログラムです

#include<avr/io.h>
int wait(long); //プロトタイプ宣言//

int main(void)
{
	DDRB=0x19;
	PORTB=0x00;

	while(1)
	{
		PORTB=0x06;
		wait(20000);
		PORTB=0x00;
		wait(20000);
	}

	return 0;
}

int wait(long msec)
{
	while(msec--) ;
	return msec;
}

使っているマイコンはATtiny13-A,I/Oは、1番ピンから順に入力、出力、出力、
GND、出力、入力、入力、VCCとなっています。
パスコンは入れてあり、すべての入力は10kΩの抵抗でプルアップしてあります。
ライターは、純正USBライタのmk2です。

どうかよろしくお願いいたします。

  • エラーやワーニングは出ていません。よろしくお願いいたします。 - butt (2009年11月09日 20時33分28秒)
  • コンパイル時の最適化によってwait処理が省略されてしまっていますね。「long msec」を「voratile long msec」として試してみてください。 - KABA (2009年11月10日 09時23分14秒)
  • KABA様、ありがとうございます。ちゃんと動くようになりました。h8でGCCdeveloperを使っていたときは、最適化されずに動いていたので、完全に頭にありませんでした。本当に助かりました。 - butt (2009年11月10日 10時21分42秒)


 プログラム上でAVR ISP mkIIが認識されない - Hosso (2009年10月26日 03時05分54秒)

はじめまして。Windows XP Homeのパソコンで、AVR Studio4.17をインストールし、USBドライバもインストールして、AVR ISP mkIIを使おうとしたのですが、AVR Studio上からライタが認識されません。windows上のデバイスマネージャでは「正常に動作しています」と出て、ライタの接続ランプも緑の点灯をしています。ですが、AVR Studioから「Connect」を選択しても、「Connect failed」と出て接続できません。どのような原因・対策が考えられるでしょうか?
ちなみに、全く同じ手順でWindows Vista HomeのパソコンにAVR studio4.17とドライバをインストールし、同一のライタを接続したところ、正常に認識され、書き込むことができました。


 USARTのSPIとMSPIMについて - rrk (2009年10月11日 20時30分26秒)

ATmega88を用いてSDカードからのデータ読み出しにチャレンジしています。
データの送受信にUSART機能を使おうと思っています。

表題の件ですが、データシートを読んでいるとMSPIMとSPIが使い分けられており、私が読んだ限りでは

・MSPIは内部クロックのみの動作
・使用するピンが異なる

というような違いがある?ようでした。

そこでお聞きしたいのですが
・そのほかに違いがあるのか
・SDカードとのデータ送受信にはどちらが適しているのか
の2点についてご教授ください。
もちろんどちらか一方のみでも構いませんのでよろしくお願い致します。

  • 主だった違いは、MSB/LSB-firstが選べるのと、USART同様に送受信にバッファを持っている事です。このバッファを積極的に活用する事で、MSPIM使用時に他の割り込み処理が入った場合にMSPIMの処理が停滞する期間が短くすみ、効率的である場合があります。ATmega88ではないですが、私が実際に使用したコードと説明があります。http://www.geocities.jp/chako_ratta/micon/audio_sd_card_transport.html - jujurou (2010年10月27日 09時08分29秒)

 タイマー割り込みについて - すみす (2009年10月04日 15時38分49秒)

ATmega64を用いてタイマー割り込みで待ち時間を作りLEDを点滅させるプログラムを作成しようとしました。
下記の「void wait_ms(uint16_t t)」関数でタイマー割り込みの中でカウントされるcntが指定した値を超えると抜け出すようなプログラムです。今回は500msに指定しました。

しかし、理由はわかりませんが500msで抜ける時もあれば256msくらいで抜け出す時もあるのです。変数の記述間違いかと思いましたがとくに見つかりませんでした。

avrstudioのデバック機能で試しても同じような感じで指定した時間の通りになりません。

ちなみに256以下に指定すると正常に操作します。

以下がプログラムです。

よろしくお願いします。

/*********************************************************/
#include<avr/io.h>
#include<avr/interrupt.h>

uint16_t	ms_cnt;

void io_init(void){

	DDRB = 0x07;
	PORTB = 0x00;
	DDRC = 0x0f;
	PORTC = 0x40;
	DDRD = 0x3f;
	PORTD = 0xc0;
}

void timer_init(void){
	
	TCCR0A = 0x02;
	TCCR0B = 0x02;
	OCR0A  = 250;

	TIFR0  = 0x07;
	TIMSK0 = 0x02;
}

void wait_ms(uint16_t t){

	ms_cnt = 0;
	TCNT0 = 0;
	while(t > ms_cnt);
}

ISR(TIMER0_COMP_vect){

	ms_cnt++;
}

int main(void){

	io_init();
	timer_init();
	sei();

	while(1){
		PORTG |= 0x01;
		wait_ms(500);
		PORTG &= 0x01;
		wait_ms(500);
	}
	return 0;
}
  • t > ms_cnt の評価をする為には割り込みを禁止しなければなりません。16ビットのカウント値取得は2サイクル以上の動作である為,下位バイト取得(0x0ffの0xffを取得)→割り込みによりカウントが0x100にインクリメント→上位バイト取得(0x0100nの0x01を取得) という動作になり,評価すべきカウント値が「0x1ff」に見えてループを脱出してしまいます。そのタイミングが256msなのです。 - KABA (2009年10月20日 11時19分28秒)
  • 少し工夫をしてみようと思います。ありがとうございました。 - 名無しさん (2009年11月04日 19時03分15秒)

 AVRISPmk?がGNDを接続すると点滅 - やまのこ (2009年10月03日 01時15分12秒)

USB-AVRISPmk?-ピンヘッダ-ISPケーブル-ブレッドボードで接続しています。何回もピンの確認はしているので間違っていないはずですが、GNDを接続するとオレンジに点滅し、外すと緑になります。ここでつまずいている人はほとんどいないようなんですが。回答よろしくおねがいします。

  • ターゲットの電源は入れましたか? - yama (2009年10月03日 12時36分57秒)
  • はい、ピンの指定された場所にブラスマイナス二本ずつ繋いでいます。使っているのはATmega88P - やまのこ (2009年10月03日 17時00分43秒)
  • 接続不良なのだったのかもしれませんが、同じ配線でできました。ありがとうございました。 - やまのこ (2009年10月06日 21時06分34秒)

 AVRライタ AVRISPmk? が赤いランプが点灯しっぱなし - たらい (2009年09月10日 00時26分06秒)

AVRISPmk?を使っているのですが正常に接続されてる場合、緑色になるはずなのですが、赤色のランプがずっと点灯したままです。
橙色にもなりません。
接続は何回も確かめたのですが、うまくいきません。
接続は
USB-AVRISPmk?-ピンヘッダ-ISPケーブル-ブレッドボード
という風にしています。
どこか気をつける点、間違いやすい点などあればお願いします。

  • すいません解決しました。 - たらい (2009年09月10日 00時50分49秒)

 各ピン入力を読み取るには - GTR (2009年08月30日 19時14分52秒)

教えてください  ポート設定を行い 入力設定にし

各ピンを 順に同じ検出方法で読み取るには
どのように プログラムを組めばよいのでしょう
入力は5ピン それを順番に高速で読み取りループにできれば
常にセンサー5個が読み取れてると思うのですが
ピン0〜5までを 高速で順番でスキャンできればと思うのですが
入力を読み取るだけは出来たのですが(1つのセンサー)
いかに 順番に切り替えて読み取るか 切り替える
方法がわかりません

プログラム 初心者です。 教えていただけませんか

  • 句読点が一つもない複文 - qwerk (2009年09月10日 20時07分21秒)
  • WinAVRならbit_is_setまたはbit_is_clearとか使ってみたら? - tatata (2009年09月26日 15時29分29秒)


 ATmega644PVの消費電流が減る原因は? - JQ6IJF (2009年08月17日 01時15分41秒)

 最近ATmega644PVを使ってスリープ状態にして省電力性を確認してたのですが、
スリープ後と前とで消費電流量が違う事に気が付きました。

スリープに入る前は2mAでしたが、入った後は1.4mAとなりました。この後に色々
内部機能を使ってみてもCPUが何もしていない状態に戻ると1.4mAと落ち着いてい
ます。起動直後のみ2mAです。

どなたか原因について御存じありませんでしょうか?宜しくお願いします。


 mega328PをAVRドラゴンでベリファイがうまくいかない - トレッキー (2009年08月10日 09時32分07秒)

mega328Pを最近使いはじめました。AVRドラゴンにてPPモードでヒューズ
およびフラッシュをベリファイすると合いません。
どうも読み込みがおかしいようです。
ISPモードではOKです。他にmega88Pはどちらも問題なくOKです。
どなたかお分かりになる方、ご教授お願いいたします。


 TWI.hとTWI.c - kokorokagami (2009年08月08日 15時22分00秒)

http://himitsu.jpn.ph/avrwiki/wiki.cgi?page=Getting+Started+Notes+-+TWI+(I2C)

上記のURLにあるAVRwikiでのTWIのCファイルHファイルを利用してTWI通信を行おうと
しているのですがどうにもうまくいきません

ソースの添付方法がわかりませんでしたので見難いと思いますがご教授お願いいたします

送信

#include <avr/io.h>
#include <util/twi.h> 
#include "twi_1.c"
int main(void){
	DDRC = 0xff;
	twi_init();
	for(;;)	{
		sla_set(0xf0|TW_WRITE);
		TWI_write(0x08);
		TWI_STOP;
	}
}

受信

#include <avr/io.h>
#include <util/twi.h> 
#include "twi_1.c"
int main(void)
{
	DDRC = 0xff;
	twi_init();
	uint8_t r;
	for(;;)	{
		sla_set(0xf0|TW_READ);
		r=TWI_read(0);
		TWI_STOP;
		if(r==0x08)
			PORTB = 0x01;
		else
			PORTB = 0x00;
	}
}


 WinAVRでコンパイルできません - 名無しさん (2009年08月04日 15時54分38秒)

WinAVRでC言語でソース書いてるんですが、ビルドすると

 Build started 4.8.2009 at 15:44:47
●make: Makefile: No such file or directory
●make: *** No rule to make target `Makefile'.  Stop.
 Build failed with 2 errors and 0 warnings...

と出てコンパイルできません。
Makefile関係なのは判るのですが、
Makefileをどうすればいいのか判らなくて困っております。

AVR StudioはVer4.13
WinAVRは20080610
PCはXPpro sp3です。

よろしくお願いします。

  • プロジェクトのディレクトリへのパスに日本語(2バイト文字)が含まれていると

出るような。CやDドライブのルートにプロジェクトフォルダを置いてビルドして
みてください - qwert (2009年08月05日 23時00分19秒)

 ダウン復旧 - qwert (2009年08月01日 09時49分58秒)

>管理者,編集者 各位

復旧ご苦労様でした。AVRの学習にあたり、当wikiがとても良い教材になっております。

 avr-gccのバグかな? - jujurou (2009年06月06日 13時57分22秒)

ATmega644PでUSARTを使用していたところ以下の現象が出ています。どなたか
別ファイルに分けた状態での対処方法をお教えください。

[現象]
以下のコードのuart_recv()関数部分を別ファイルにするとUARTの受信後リセット
されたような状態になる。毎回ではないですが、5,6回受信すると1回はこの状態に
なるといった頻度です。ファイルを分けず1つのファイル中に全て記載すると発生しない。

最初に'A'を送信しているのは現象を分りやすくするためです。また、MCUSRの値を
UARTに出力するように修正して試してみたところ、現象はそのままで、出力される
値が0x00であった事から、リセットはされていないと思われます。


[環境]
WinAVR-20090313
外部水晶振動子: 20MHz(セラロック)
供給電圧: 5V

[コード]

#include    <avr/io.h>

void    uart_init(void);
uint8_t uart_recv(void);


/****************************************************************************/
/****************************************************************************/
void    main(void)
{
    uint8_t uart_data;

    uart_init();

    UDR0 = 'A';

    while (1) {
        uart_data = uart_recv();
        if (uart_data == 'o') {
            break;
        }
    }


    /* 終了しない   */
    while (1) {
        ;
    }

    return;
}


/****************************************************************************/
/****************************************************************************/
void    uart_init(void)
{
    volatile uint8_t    read_data; 

    UBRR0   = 64;           /* 20MHz 19200bps   */
    UCSR0C  = 0b00000110;
    UCSR0B  = 0b00011000;

    read_data = UDR0;       /* dummy read       */

    return;
}

/****************************************************************************/
/****************************************************************************/
uint8_t uart_recv(void)
{
    uint8_t data;

    if ((UCSR0A & _BV(RXC0)) != 0) {
        data = UDR0;
    } else {
        data = 0x00U;
    }

    return data;
}


  • チップの不具合のようです。別ファイルにすると関数の順番(callアドレス)が変わり、

たまたま動く。UART0をUART1に変更するかクロックを8MHzにすると直ります。 - TAD (2009年06月07日 20時16分29秒)

  • チップの不具合だとは…。この不具合情報が何処にあるかお教えいただけないで

しょうか? - jujurou (2009年06月07日 22時54分57秒)

まとめましたが公式な情報はまだ無いようです。 - TAD (2009年06月08日 00時34分36秒)

  • 情報公開ありがとうございます。40ピン全て使う予定で組んでいたので非常に痛い

不具合です。 - jujurou (2009年06月08日 08時33分26秒)

  • 解析までは行っていませんが、USART0ではデータ取得せずにデータを受信し続けても

データオーバーラン発生フラグが1にならなかったです。 - jujurou (2009年06月08日 21時51分19秒)

  • 追試してみました。USART0をMSPIモードで動作させた時、RXD0をH(L)固定にすると

正常だが、H←→Lの変化がある信号を入れると異常動作になります。
よって、RXD0の受信信号の取り回しが悪さをしている可能性が高いです。(MSPI=10MHz時) - jujurou (2009年06月08日 23時47分42秒)

  • ATmega644Pを持ってないので確認できませんが、

jujurouさんのblogにある
zipファイルの中のmain.lssを見てみました。
正常な方はuart_recv()がインライン展開されているのに対し、不具合のある方はcall
で呼ばれていますね。stackがうまく機能していないのでしょうか? - kkk (2009年06月09日 06時14分16秒)

  • 参考のためFuseの設定値を教えていただけませんか。 - kkk (2009年06月09日 07時06分40秒)

  • Fuseの設定は Low: 11001111, High:11-11001, Ext: -----111 です。 - jujurou (2009年06月09日 09時27分38秒)

  • 更に追試してみました。

http://www.geocities.jp/chako_ratta/blog_data/avr/usart0_test_20090609.zipこの
プログラムでも現象が発生します。PB0にLED(+抵抗)を繋いで、PCから232Cレベル変換ICを
通してRXD0へ信号を送信しているのみです。
プログラム上ではLEDが一定時間点灯した後、消灯しっぱなしのはずですが、PCから
何かしらのデータを送信するとLED点灯を再開、一定時間経過で消灯となります。
XTAL1とRXD0が隣接し、かつブレッドボードで実験している事に関連があるのかな?と
ハードを疑ってみたりして…。 - jujurou (2009年06月09日 13時28分05秒)

  • ソフトではUARTを一切使用していないのに上記動作になるとは変ですね。

海外等で上記のような不具合報告を探したけれど見つけられませんでした
(軽くしか探してませんが)。- kkk (2009年06月10日 02時07分33秒)

  • Fuse設定がちょっと変です。20MHz外部セラミック振動子を使用するなら

Low: 11001111ではだめですね(8MHz〜16MHzの外部クリスタル低電力発振器の設定になってます)。
BODを使用しない場合はLow:11110110か11000111あたりはどうでしょう。
BODを使用する場合はLow:11100110,Ext:-----100(BOD4.3V)、
またはLow:11100110,Ext:-----101(BOD2.7V)あたりでしょうか
(20MHz外部セラミック振動子用) - kkk (2009年06月10日 07時11分40秒)

  • Fuseの設定を変えたところ、正常に動作しました。kkkさんありがとう御座います。

何でこんな設定にしてしまったのだろ…。
最終的にFuseの設定値はLow:11000111, Ext:-----100にしました。
起動時間はシビアではないので発振安定待ちは長めに設定しています。 - jujurou (2009年06月10日 20時24分23秒)

  • 今回は保証外の20MHzでしか試せていませんが、クロックを低電力発振器の

設定をする場合は、隣接するPD0(RXD0)の信号すら雑音(ノイズ)として拾って
しまうのかもしれません。 - jujurou (2009年06月10日 20時29分32秒)

  • mega644Pでの類似の不具合を経験しています。 ここをご覧ください。

http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?cmd=read&page=AVR%2Fnews23&word=Mega644P#o7b8c770 - senshu (2009年06月11日 10時11分54秒)

  • 私の方でもフルスィングにしたら直りました。間違った情報で済みません

でした。 - TAD (2009年06月12日 02時22分52秒)


 AVR初心者です。 なので、本を探しています。 - YMD (2009年05月06日 17時36分38秒)

多少、PICをかじっていた時期がありましたが、C言語がよく分からなくて、今回AVRに移行してからも、C言語がよく分からないのです
「AVRマイコン活用ブック―わかるマイコン電子工作」
を読んでも、細かいことが乗っていませんでした。
何かよい本があれば教えてください。
御願いします。
あと、AVRStudio-WINAVRを使っています。

  • ごめんなさい。追加です。 - YMD (2009年05月07日 20時57分59秒)

  • いいwebサイトもあれば教えてください。宜しく御願いします。 - YMD (2009年05月07日 20時58分49秒)

  • 私はC言語に関しては、「プログラミング言語C ANSI規格準拠」と

「新版 明解C言語 入門編」とその他多くの本を参照しています。 - JQ6IJF (2009年05月09日 23時54分07秒)

  • ありがとうございます。プログラミング言語C ANSI規格準拠の本と、webサイトを

駆使して、なんとなくですが、分かってきました。 - YMD (2009年05月17日 14時51分22秒)

  • ANSI準拠で書くのはいいですが、ちょっと細かいことをやろうとするとgccなので

gcc拡張も知る必要があったりします。 - km (2009年05月18日 11時34分51秒)


 シミュレーターのバグ - jOker (2009年04月22日 12時04分45秒)

報告までに。
AVR Studio4.16においてATtiny45使用中、カウンター1のタイマーが回りませんでした。
どうやらデバッグプラットフォームが「Simulatar」では対応しておらず「Simulatar2」での対応となっている模様。
同一プログラムで確認しました。
以前のkokeさんとは違いますが、何か違和感があればシミュレータを変えてみるのもいいかもしれません。

実機がないので現在シュミレーションのみの試行錯誤・・・早く実機がほしいです



 AVR マイコン 初めて使います - JA2YYN (2009年04月03日 21時24分55秒)

C言語 まるっきりの初心者です。
製作したい物がありまして。制御プログラムを作りたいのですがAVRマイコンで製作する
には どの様にしたら良いか判らず困っております。 
下のソースはH8/3664Fで制御できるソースを教えていただいた物ですが 本との基本
の基本だと後は手を加えろと言われたのですが このソース AVRマイコンソースに
書き換えるには どこをどの様に書き換えれば良いのでしょう。

include  <3664.h>

_BYTE  RPAabCountWrk[4];
_BYTE  RPAabCount[4];

char  acTxBuff[10],acRxBuff[10];

//----------------------------------------------------------------------------------------
//  タイマV割り込み処理
//    Return:  void
//----------------------------------------------------------------------------------------
void  int_timerv( void )
{
  int  nCnt;

  //  R/Cレシーバ信号入力処理
  for( nCnt = 0; nCnt < 4; nCnt++ ){
    if( IO.PDRB.BYTE & (0x10<<nCnt) )  RPAabCountWrk[nCnt]++;
    else if( RPAabCountWrk[nCnt] != 0 ){
      RPAabCount[nCnt] = RPAabCountWrk[nCnt];
      RPAabCountWrk[nCnt] = 0x00;
    }
  }
  TV.TCSRV.BIT.OVF = 0;
}


main()
{
  SCI3_INIT( br57600, acTxBuff, 10, acRxBuff, 10 );

  EI;

  TV.TCRV0.BYTE = 0x01;        //  φ/8(OVFで0.128msec)コンペアマッチ無し、クリア無し、
  TV.TCRV1.BYTE = 0xE3;        //  外部エッジ無し
  TV.TCNTV = 0x00;          //  タイマVクリア
  TV.TCRV0.BYTE = 0x21;        //  割り込み開始

  while( 1 ){
    SCI3_PRINTF( "%02x %02x %02x %02x\n",
                   RPAabCount[0], RPAabCount[1], RPAabCount[2], RPAabCount[3] );
  }

これには forループで廻すより4回同じコードを書いたほうが動作が速いと
SIPHA COREでは、さらにアレンジして、TIMERWと組み合わせて、TIMERW側の処理で
カウンタを取り出し、クリアをする

0.128msecでOVF割り込みさせている関係上、割り込み回数が多いので、なるべく軽い処理に
したほうが有利

そして、これが大事なのですが、エラーチェックです。例えば、「3回連続で同じ方向のデータが
入ったら正とする」みたいな処理があると、より良い

と書いてありましたが どの様に手を加えれば良いか判らず困ってます。どの様に直せばよいの
でしょう。さらにAVRソースに書き換えるにはどこを書き換えれば良いか

これはRC受信機からの PWM信号を検出するプログラムソースです。 この後 そのデータ
値を 演算 ミキシングまた RCPWM信号に戻すプログラム製作しなくてはなりません。 
苦戦中です。 判る方 詳しく教えていただけませんか。

  • この種の移植は、意外に難しいです。初心者の方ならAVRマイコンに移植するよりも、H8マイコンで作るのが無難だと思います。 - senshu (2009年04月07日 21時44分30秒)
  • SCI3_PRINTFなんて関数は標準で用意されていませんので、自分で用意する必要がありますが、初心者には厳しすぎると思います。もしかするとベストテクノロジーから発売されているTmega128マイコンボードのサンプルプログラムが役に立つかもしれません。 - JQ6IJF (2009年05月09日 23時45分54秒)
  • 追記です。上記の方がおっしゃるように、早く完成させたいならべステクのH8/3867Fマイコンボードを使った方が良いと思います。 - JQ6IJF (2009年05月09日 23時47分43秒)
  • あるソースコードを別の機種に移植する作業は、簡単なように見えて実は相当に難易度の高い仕事になります。特に組み込み系はハードと直結していますので、同じCで書かれていても別物と思った方が良いでしょう。Cno - がた老 (2009年05月11日 11時52分22秒)
  • 途中で切れたので続きです。Cの初心者ということなら、先のコメントの通りハードを用意された方が間違いないと思います。 - がた老 (2009年05月11日 11時58分04秒)
  • H8 3664ですか。懐かしいです。ボクも、H8⇒PIC⇒AVRと来ました。 PIC⇒AVRは多少分かりやすいのですが、H8⇒は、難しいかと思います。 たぶん、H8-3664とか、3694とかでやるのがいいと思います。 - YMD (2009年05月17日 14時56分10秒)


 アセンブラマクロのアドレス - モゴラ (2009年03月03日 18時15分20秒)

汎用レジスタ、I/Oレジスタのアドレスは
マクロで数値化?アドレス化?するとき
R15以下とR16以上を区別する方法はどの様にすればいいですか。


 上位64KBytes空間に置いた定数テーブル へのアクセス - アット (2009年02月10日 19時08分40秒)


お世話になります。
約 90KB と膨大なデータを dataA, dataB, dataC の3種類の
配列に入れて、アクセスしたいのですが
dataA, dataB はうまくアクセスできるものの
dataC にアクセスできません。dataC の途中までは
うまくアクセスできるのですが、途中から化けたデータになって
しまいます。
 
google で調べた所、
・RAMPZ を 1 にする
・pgm_read_word_far を使う
などの解決策が書かれていたのですが、私の方で理解できていないのか
正しく使う事ができず、解決できていません。
 
デバイス: ATmega128
コンパイラ:avr-gcc-4.1.2.exe
です。
どなたか、アドバイスをよろしくお願いします。
 
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
 
const prog_int16_t dataA[15488] = {
0xE6D8,0x2142,0xB5D3, (省略) 0x82A7,0x4263
};
 
const prog_int16_t dataB[15488] = {
0xFFFF,0xEEEE,0xDDDD, (省略) 0x1111,0x0000
};
 
const prog_int16_t dataC[15488] = {
0x0000,0x1111,0x2222, (省略) 0xEEEE,0xFFFF
};
 
void main(void){
	(省略)
	for(i=0;i<5000;i++){
		address = i*2;
		k = pgm_read_word(&dataA[address]); // 正しくアクセスできる
		PORTC = (k>>8)&0xFF;
		PORTD = k & 0xFF;
		k = pgm_read_word(&dataB[address]); // 正しくアクセスできる
		PORTC = (k>>8)&0xFF;
		PORTD = k & 0xFF;
		k = pgm_read_word(&dataC[address]); // 途中からデータが変!
		PORTC = (k>>8)&0xFF;
		PORTD = k & 0xFF;
	}
}

  • 上記のソースでコンパイルしてみるとdataAとdataBは64KBytes以内ですがdataCは64Kの境界をまたいで配置されていますね。64Kを超えるデータをアクセスするにはprm_read_word_far(&dataC[address])という記述になります。それでもだめな場合はavr-gccを現行のバージョンで確認してみてください(WinAVR20081205/avr-gcc-4.3.2)。- kkk (2009年02月10日 23時37分09秒)
  • RAMPZレジスタはpgm_read_word_far()を使用することで自動的に設定されますので、Cのプログラムでは特に設定する必要はありません。 - kkk (2009年02月10日 23時49分21秒)
  • 最新の avr-gcc にする事で解決できました。また配列の要素数の割り当てにも少し問題があったようです。kkkさん、ありがとうございました! - アット (2009年02月12日 19時21分18秒)



 bad_interrupt - nuts (2009年01月05日 14時56分15秒)

あけましておめでとうございます。今年もAVR-freakの皆さんよろしくお願いいたします。
本題ですが、lssファイルで確認すると、<_vectors>の項目でrjmp...<bad_interrupt>を発見。プログラムは問題なく動作するのですが、なんかしっくりきません。(ちょっと不安なので)
これは何が要因なのでしょうか。プログラム上問題が発生する可能性があるのでしょうか。お知恵拝借お願いいたします。

  • 特に気にすることはないと思います。<_bad_interrupt>はプログラムで定義されていない割り込みが発生した時に実行されます(0番地へジャンプ)。正常な状態であれば実行されることはありません。ISR()マクロなどで割り込みハンドラを記述すると<vector>にはそのハンドラへのrjmp命令が生成されますが、記述されていない割り込みハンドラの場合は<_bad_interrupt>へのrjmpが生成されるようになっています。 - kkk (2009年01月06日 03時17分49秒)
  • kkkさん。返事遅くなり申し訳ありませんでした。 - nuts (2009年01月09日 17時24分18秒)
  • コメント拝見し、安心しました。これからも、この素人にご指導よろしくお願いします。 - nuts (2009年01月09日 17時25分35秒)


 質問 - hashimo (2009年01月05日 02時43分42秒)

こんにちは。AVRの割り込みでどうしても解決できずに困っています。知恵をお借りしたいです。

ATmega168を利用して1秒間のロータリーエンコーダーのパルス数を測定して出力するプログラムです。

メインの中で局所変数count_rightの値をグローバル変数global_count_rightに代入しているのですが、割り込み部分ではその値が反映されず必ず0になってしまいます。

?と?の部分でLEDに出力することにより、?では正しい値を得られていますが、?で必ず0になってしまうことが確認しています。


プログラム↓

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

int global_count_right;
	

ISR(TIMER1_COMPA_vect){
	PORTB=global_count_right;								//?
while( !(UCSR0A & 0b00100000 ))		//フラグが立つまで待つ
		;
		UDR0=global_count_right;			//値を送信!

}


int main(void){

int count_right=0;
unsigned char 	x_right,
				x0_right;

DDRC=0b00000000;	//PC0〜PC1をロータリーエンコーダ入力に使用
PORTC=0b00001111;	//PC0〜PC1をプルアップ
DDRB=0b11111111;	//PB0〜PB7をLED出力に使用

TCCR1A=0b00000000;
TCCR1B=0b00001101;// 下3桁が 010…8分周 11…64分周 101…1024分周
OCR1A=1000;//1024分周なので1msでOCR1Aが+1される。1000×1ms=1秒
TIMSK1=0b00000010;

sei();

x0_right=PINC & 0b00000011;	//右タイヤの値

//-------------------------------------------------------
while(1){
	x_right = PINC & 0b00000011;//						
	if(x_right != x0_right){		//				
		if(x_right==0b00000010)  {	//						
			if(x0_right==0b00000000)count_right++;
			else if(x0_right==0b00000011)count_right--;
			else asm("NOP");
		}else if(x_right==0b00000011){
			if(x0_right==0b00000010)count_right++;
			else if(x0_right==0b00000001)count_right--;
			else asm("NOP");
		}else if(x_right==0b00000001)   {					//タイヤの回転検出
			if(x0_right==0b00000011)count_right++;
			else if(x0_right==0b00000000)count_right--;
			else asm("NOP");
		}else if(x_right==0b00000000){
			if(x0_right==0b00000001)count_right++;
			else if(x0_right==0b00000010)count_right--;
			else asm("NOP");
		}			
	x0_right=x_right;
	global_count_right=count_right;		//グローバル変数に代入
	PORTB=global_count_right;			//?
	}else asm("NOP");				
 }
}


どこに問題があるのかさっぱり分かりません・・・よろしくお願いします。

  • int global_count_right; を volatile int global_count_right; としたらいかが? - Force (2009年01月05日 03時13分53秒)
  • ありがとうございます!解決しました!volatileを加えるだけで直るとは・・・最適化を抑制するというのが良く分かりませんが、HPを見て勉強してみます。ありがとうございました! - hashimo (2009年01月05日 03時26分12秒)
  • ついでに,static も併せて調べてください。 因みに変数はメモリに置く変数とCPU内のレジスタを使う変数の2種類がありまして,通常の考えでは,変数はメモリに置くのですが変数の読み書きを高速で行う場合はレジスタ変数を使います。コンパイラは自動的に高速に動くように変数とかコードを最適化するようになっております。今回の場合global_count_rightはレジスタに置かれたようです。割り込みを使わない場合はレジスタに置かれていてもよいのですが,割り込みを使うときは割り込み処理に入るときレジスタの値をスタック(データ保存エリア)に退避して処理し,割り込み処理が終わるとスタックからレジスタの値を復帰して元の処理に戻ります。そうすると,割り込みルーチンのレジスタ変数global_count_rightとメインルーチンのglobal_count_rightはグローバル変数なんだけどメインルーチンと割り込みルーチンで異なる値を取るわけです。変数に対してvolatile修飾をするとコンパイラは変数をレジスタに置く最適化をしないのでメモリに配置されます。メインルーチン・割り込みルーチンともこのメモリ上のglobal_count_right変数の読み書きをしますので値が異なることがなくなります。 - Force (2009年01月05日 04時00分25秒)
  • 保存される場所が異なるために、割り込みの中の変数がうまく更新されなかったのですね・・・今まではプログラムだけで、実際にマイコンの中でどのように動作するのかを考えていませんでした;;  丁寧な解説ありがとうございます。本当に助かりました! - hashimo (2009年01月07日 02時33分38秒)



 秋月USBシリアル変換モジュールAVRライタ - Kimio Kosaka (2009年01月02日 00時29分21秒)

秋月電子のUSBシリアル変換モジュール(AE-UM232R)だけで作るAVRライタの解説記事がありそうで無かったので FTDI BitBang AVR-Writer http://www.geocities.jp/arduino_diecimila/avr-writer/index.html にまとめて見ました。
写真はスタンド・アローン・ライタとICSPライタです。




 AVR-USBについて - F3F (2009年01月01日 16時16分58秒)

明けましておめでとうございます。
はじめて投稿さしていただきます。
AVRの初心者なのですがAVRとパソコンをUSB通信させたいと思ってAVR−USBライブラリを使おうと思ったのですが、ライブラリをダウンロードしたもののどのソースを使ったらよいのかソースを読んでみたものの判断ができませんでした。使い方をご存じの方がいらっしゃったらアドバイスお願い致します。どうかよろしくおねがいします。

  • この文章からは意味がよく読みとれないのですが、他の場所にあるような「簡単なデータをPCとAVR間で、PCのUSBポートを使って通信してみたい」というだけなら、USBとRS232C変換器を経由して通信することができます。FTDIのFT232RLなどを使えば確実ですが、高速度の通信でなければTiny2313を使ったHIDaspx変換器でも可能です。私のページを参考にしてください。http://www.geocities.jp/kuman2600/o11_uart.html ご質問があれば掲示板へどうぞ。 - kuman (2009年01月02日 16時23分50秒)
  • kumanさんのページ拝見さしてもらいました。HIDaspxをつかって通信する方法があることは初めて知りました。自分の使っているパソコンはUSBポートしかないのでFT232を使って通信を実現しようと考えたのですがAVR−USBがあることを知って質問するにいたりました。今後、USB機器の開発もしてみたいのでAVR−USBについて参考になる情報がありましたら教えてください。よろしくおねがいします。 - F3F (2009年01月02日 20時07分41秒)


 pwm出力に挑戦しているのですが - Yuuu (2008年12月27日 13時42分41秒)

初めまして
最近AVRを使い初めて、書籍を参考にしながらいろいろと試しています。
現在はpwm出力を試して見たいと思い、LEDを接続して明るさ調整のプログラムを作成してみたのですが、出力が常に0Vになってしまい、動作しません

詳細としては
・Attiny2313使用(内部クロック)
・LEDの点灯、消灯は思ったように動作していた
・LEDはBポートの0〜3に接続

プログラムは

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h> 

void delay_ms(t) { while (t--) _delay_ms(1); }

int main(void)
{
	int8_t x,x0,y;

	DDRB = 0b00001111;
	PORTA = 0b00000011;
	
	TCCR0A = 0b00000011;
	TCCR0B = 0b00000011;
	OCR0A = y = 128;
	
	x0 = PINA & 0b00000011;
	while(1){
		x = PINA & 0b00000011;
		if(x != x0){
			if(x == 0b00000010){
				y = y +	32;
				OCR0A = y;
			}
			if(x == 0b00000001){
				y = y -	32;
				OCR0A = y;
			}
			x0 = x;
		}
		delay_ms(10);
	}	

	return(0);
}	

です。
タイマの記述になにか問題があるのでしょうか?よろしくお願いします

  • TCCR0AのCOM0A1/COM0A0の設定が必要です。 - kkk (2008年12月29日 00時01分01秒)
  • TCCR0A = 0b11000011 - Yuuu (2008年12月29日 22時16分01秒)
  • ↑のようにするとできました - Yuuu (2008年12月29日 22時16分15秒)
  • ありがとうございました - Yuuu (2008年12月29日 22時16分26秒)


 Timer 0 - kkk (2008年11月25日 21時38分27秒)

getting sterted note のTimer0のページがおかしくなっているのですがなおしていただけないでしょうか

  • 別のkkkさんですか・・・最近毎日そのペーが書き換えられているのですよ。管理人さん何か方法はないでしょうか。 - kkk (2008年11月25日 22時12分17秒)
  • 私も昨日、戻しておきましたが、あまりにも手間がかかりすぎます。貴重なページなので、しばらくは凍結もやむなしでしょうか。 - senshu (2008年11月27日 23時59分17秒)
  • すいません。kkkという名前は使われていたのですね。それとTimer0のページの件ありがとうございます - kiki (2008年11月28日 10時55分46秒)


 巨大な配列 - npg (2008年11月07日 13時32分18秒)

3×1000の配列を使ってみたのですが、デバッグしてみると意図したとおりにウェイトがかかりません。何か解決策はないでしょうか。

#define F_CPU 20E6

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

int8_t data1[3][1000] PROGMEM=
20,60,20},省略,{19,60,21プラグインは存在しません。;

int8_t data2[3][1000] PROGMEM=
0,0,0},省略,{6,9,5プラグインは存在しません。;

void wait(int);
int main(void)
{

int i;
int a=0;
int b;
int n;

while(1){
for(b=0;b<1000;b++){

for(n=0;n<pgm_read_byte(&data1[a][b]);n++)
{
_delay_us(10);
}
for(n=0;n<pgm_read_byte(&data2[a][b]);n++)
{
_delay_us(1);
}

a++;

以下は同じ処理を二回繰り返してa=0にしてかっこを閉じています。

エラーは
warning: excess elements in array initializer
が大量に出ます。
どなたかアドバイスをお願いします。

  • そのwarningは宣言(3×100)よりもデータが多いと出るようです。データ数が3000を超えていませんか? - そら。 (2008年11月08日 19時56分28秒)
  • あ、訂正です。誤) 3×100 → 正) 3×1000 失礼しました。 - そら。 (2008年11月08日 19時57分43秒)
  • よくよく配列のことを調べ直してみると、3と1000がデータから見ると逆であることがわかりました!本当はint8_t data1[1000][3]でプログラムしなければならなかったのですね。ありがとうございました。 - npg (2008年11月10日 13時46分18秒)


 avr-gccのコンパイルがうまくいかない - npg (2008年10月10日 16時20分24秒)

AVR Studio 4.14 (build 589)+winavr20080610を使って、ビルドしようとしたら、

make: *** No rule to make target `main1.elf', needed by `elf'. Stop.
Build failed with 1 errors and 0 warnings...

と出て止まってしまいます。どなたかアドバイスをお願いします。

  • 下の07月05日の投稿を確認してみてください。 - TAD (2008年10月12日 01時04分24秒)
  • 確認してみましたが、makefileは生成されていますがmain.elfは作成されていません。この.elfファイルとはいったい何なのでしょうか? - npg (2008年10月16日 13時32分39秒)
  • elfは実行ファイルで、一旦実行ファイルを作りそこからHEXファイルに変換します。AVR Studioからプロジェクトを作るとMakefileもelfファイルも自動的に作成されます。新たにProjectを作っても同じエラーになるでしょうか。 - TAD (2008年10月18日 00時26分02秒)
  • パスをc:\tempにして新しい名前でプロジェクトを作ってみたらなおりました。途方にくれていたので助かりました。ありがとうございました。 - npg (2008年10月20日 13時30分57秒)


 Tiny2313でのBEEP音が不安定 - ytt (2008年10月08日 00時34分32秒)

御世話になっています。
Tiny2313のPB0〜PB5までにLCD(DATAとE,RS)を結線しPB6に圧電素子を接続しています。
TIMER1の割り込み(10KHz)でPB6を割り込み毎に反転しているのですが音が一定になりません。ピーーブツピーーブツみたいな感じです。
メインルーチンではLCDを連続表示しているのですが、連続表示を止めるとBEEPは一定になります。
割り込み内でPB6を判定し変化させても、PINB=0b01000000;としてみても結果は同じでした。例にPA0に圧電素子を接続すると、メインルーチンでLCDを連続表示している状態でも、音は一定になりました。
割り込みはTIMER1のみで他は有りません又、LCDの表示関数や他のルーチンで割り込み禁止になるような命令は有りませんでした。
割り込み内でビット操作をする上で気を付けなければいけない事、原因の調査方法等、お教え願えれば幸いです。環境はwinavrとavrstudioです。
初心者故、説明不足な点等ありましたらあわせて御指摘ください。
よろしくお願いいたします。

  • PORTB^=_BV(6); // XORでPB6を反転、でもダメでしょうか。 - TAD (2008年10月10日 02時53分54秒)
  • ありがとうございます。 - ytt (2008年10月10日 11時43分41秒)
  • XORでも駄目でした。すいません。 - ytt (2008年10月10日 11時47分17秒)
  • 解決しました!メインルーチン内でLCD表示関数がPORTBに&と|する際割り込みが入ると、割り込みでPB6を変えても割り込みから戻って書き換えられてしまうのが原因かと思いました。LCD表示関数でPORT操作の手前から終わりまでを割り込み禁止にしたら良い音がなりました。ありがとうございます。 - ytt (2008年10月10日 13時01分54秒)
  • メイン側PORTBの&=や|=が1ビットだけならcbiやsbiに最適化されるので割込み禁止は要らないのですが、複数ビットだと割込み禁止は必要ですね。自己解決おめでとうございます。 - TAD (2008年10月12日 01時03分18秒)
  • ありがとうございました。今後ともよろしくお願いいたします。 - ytt (2008年10月14日 21時43分53秒)


 USBaspライタの作成したが、USB機器として認識されない。 - RS232C (2008年09月07日 17時58分11秒)

不明なデバイスとなってしまいWindowsXP&2000から認識されません。
いろいろ試しましたがどうしても認識されません,どなたがアドバイスいただけないでしょうか。

環境について
・DELL-Vostro1000 WindowsXP_SP3
・DELL SC430 Windows2000_SP4
・回路は以下を参考に作成しました。本の中ではクリスタルとコンデンサ22pFを2つで発振するように設計されていますが、クリスタルが無かったのでEXO3の12MHzを使っています。
あと、本ではATmega8で作成されていましたが、手に入らなかった為、ATmega88で作成しています。
武藤佳恭著「超低コスト インターネット・ガジェット設計」(オーム社)
・ファームウエアはAVRwikiにおいてあった、usbaspx113_m88.hex
を使用。verifyまで成功したので書き込みは大丈夫なはず。
Fuzeは以下のように書き込みました。
avrsp -fh11011101
avrsp -fl11010111
avrsp -fx11111001

聞きたい事
・セラロック12MHzではUSB機器は作れないのか?水晶必須でしょうか?
・EXO3は水晶と同等の精度があるのか。
・EXO3の使いかた。ちゃんと発振しているか心配。
 ATmegaの9pin(XTAL1)→EXO3のF
 ATmegaの10pin(XTAL2)→EXO3のDをつなげばOK?
 それとも
 9pin(XTAL1)→Fだけでよいのか
(EXO3の電源は4pin,8pinにUSBの5Vを供給してます)

以上すみませんがどなたか教えていただけますでしょうか。

  • 別のところで質問されているのと同じ方と思いますが、あらためて回答します。本は読んでいないので回路はわかりませんが私のページの回路と比べてみてください。http://www.geocities.jp/kuman2600/n6programmer.html のUSBaspライタ。mega48で作っています。セラロックは使ったことはありましたが極めて不安定でした。おすすめできません。EX03は水晶発振器ですから使えます。ST端子を電源+に繋いで(こちらが正しい)、F端子からmega88のXtal1に繋ぎます。問題はヒューズビットで、この場合は外部クロックとなりますから-FL11010000となると思います。データシートで確認してください。ヒューズは間違うと復帰が困難になるときがあります。余裕があれば私のページもみてください。なお、外部クロックに設定すればXtal2は単なるI/Oとなります。 - kuman (2008年09月08日 03時03分44秒)
  • 回答ありがとうございます。ヒューズビットを書き換えてみましたがうまくいきませんでした。別の原因がありそうなので、普通の水晶発振子で再度トライしてみます。本の中の回路はUSBからレギュレータで3.3Vにしているもので、雑談4にあった認識されないPCもあるといる情報もあるので、本の回路はやめて、雑談4にあったシンプルな5Vの回路にしたいと思います。 - RS232C (2008年09月08日 23時39分21秒)
  • 5V回路にして作成したらあっさり動きました。mega8とmega88の両方に書き込んでいた内容はHEX、Fuse、共にあっていたので、元の動かなかった基盤を見直してみたところAVRに電源が到達していませんでした。 動かなくて当然でした。恥ずかしい。orz - RS232C (2008年09月14日 16時12分31秒)


 2.ATTINY2313のISPパラレルの書き込みについて - 入門者 (2008年09月02日 18時53分52秒)

LPTライタでISP書き込みを行う場合RESETはどうしてたらよいですか?
?19→SCK?18→MISO ?17→MOSI?10→GND
ここでRESETはどこに接続すればよいのかわかりません。宜しくお願いします。
?RESET→?

  • 質問の?19→SCKは19がAVRピンNo.みたいですね。とすれば?1→RESET になるでしょう。RESETはAVRピンNo1です。 - リン (2008年09月02日 23時57分19秒)


 数値の16ビット化 - リン (2008年09月02日 12時15分35秒)

最近AVRを始めたリンと申します。
アセンブラで
16ビットになる数値 500(10進数)のような数値を
タイマ1のカウンタのような16ビットにいれるのは
500を16進数に変換して(1F4)
 tcnt1H上位=01
 tcnt1L下位=F4
と分割入力がデータシート例にありますが、
500のような即値をそのまま16ビット変数に入れるよい方法、命令群、マクロはAVRではないでしょうか

  • わかりました(自己解決)PIC同様 LOW(500),HIGH(500)が使えました - リン (2008年09月02日 23時39分59秒)


 ATTINY2313のISPパラレルの書き込みについて - 入門者 (2008年08月28日 10時54分19秒)

雑誌で見た100円ライタ(プリンタポートに抵抗4本?使用したもの)を製作してATTINY2313にISPプログラミングをしたいのですが可能でしょうか?90S2313は可能のようですが、日本語データシートの障害のページにパラレルはダメ的なことが書いてあり、シリアルISPは可能的なことが書かれてました。初心者であるので内容も良く把握できていませんので宜しくお願い致します。なお、書き込みソフトはBASCOM AVRのデモ版を使用したいと考えています。

  • パラレルにしばしば誤解があります。このライタはパラレルポートを使いますが、書き込みはシリアル(ISP)です。私も最初lはこれで書きました。ケーブルをできるだけ短くするのがコツです。BASCOMで使えるかどうかは知りません。ChaNさんのページをご覧ください。 - kuman (2008年08月28日 17時11分38秒)
  • AVR試用記の管理人、kumanさんからのじきじきの回答ありがとうございます。kumanさんのページは大変勉強になります。ありがとうございました。 - 入門者 (2008年08月29日 09時23分00秒)


 HEXファイルが生成できません - 超初心者(中学) (2008年07月05日 16時45分49秒)

AVRSTUDIO(4.14)とWINAVR(20080610)を使っています。ソースを打ち込んでビルドしようとしましたが、この(make:Makefile:No such file or directryとmake: ***No rule to make target 'makefile'. Stop)エラーがでてきてうまくいきません。どなたかアドバイスをお願いします。

  • make時の各種設定を記録したMakefileという名前のファイルが無いよ という事だと思います。WINAVRでしたらMakefileを生成するユーティリティが付いているので、それを立ち上げてクロック周波数など各種設定を行ってからソースの入っているディレクトリにセーブすればいいと思います。 - Neko (2008年07月05日 22時44分51秒)
  • AVRStudioを利用する場合にはあえてMakefileは必要ないのですが[Project]メニューの[Project Wizard]もしくは[New Project]でProjectの作成をされているのでしょうか? - kkk (2008年07月06日 04時37分20秒)
  • 皆さんアドバイスありがとうございます。kkkさん僕は[Project]からプロジェクトを作っています。 - 超初心者(中学) (2008年07月06日 07時24分12秒)
  • [Project]の[Configuration Options]でUse External Makefile のチェックを入れなければ外部のMakefileを使用しない様になります(defaultフォルダに自動で作成されて使用される) - kkk (2008年07月06日 07時50分48秒)
  • ん・・・>***No rule to make target 'makefile'. Targetが'makefile'になっている??? - kkk (2008年07月06日 08時04分21秒)
  • makefileではなくMakefileでした。すみません。僕のdefaultフォルダにはMakefileが作成されておりません。これはソフトの欠陥でしょうか。 - 超初心者(中学) (2008年07月06日 11時37分30秒)
  • Build(F7)を実行した段階で作成されるはずなんですが・・・ありませんか? - kkk (2008年07月07日 04時55分19秒)
  • プロジェクトパスのどこかに日本語が含まれていませんか? - km (2008年07月07日 10時25分00秒)
  • パスの一部に日本語が含まれないようにしたらうまくHEXファイルの生成に成功しました。ご指導いただいた皆さんありがとうございました。 - 超初心者(中学) (2008年07月07日 14時29分52秒)

 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.h
AVR: atmega168
WinAVR: 2006.xx.xx
http://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.2007
http://www.ullihome.de/index.php/USBAVR-ISP-Download/de

Hilfe
http://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秒)

 ここでいいや。 - 通りすがり (2007年02月12日 00時38分01秒)

uint8_t DispMenu(void)
{
//4択-4択(計16選択肢)のメニューサンプルプログラム
	const uint8_t U_MENU[4][8] PROGMEM = {
//上位メニュー。1つのメニュー名は半角8字以内とする
		"setting",
		"record",
		"play",
		"poweroff",
	};
	const uint8_t D_MENU[16][8] PROGMEM = { 
//下位メニュー。1つのメニュー名は半角8字以内とする。
		"menu1","menu2","menu3","menu4", //settingメニュー内
		"menu5","menu6","menu7","menu8", //recordメニュー内
		"menu1","menu2","menu3","menu4", //playメニュー内
		"menu5","menu6","menu7","menu8" //poweroffメニュー内
	};
	char i = 0;
//上位メニュー選択中
	for(;;){
		lcd_print(U_MENU[i >> 2]); /*	文字列を表示する関数 */
		if(down_button){
			if(i != 12) i += 4;
		}if(up_button){
			if(i != 0) i -= 4;
		}if(enter_button){
			break;
		}
	}
//下位メニュー選択中
	for(;;){
		lcd_print(D_MENU[i]);
		if(down_button){
			if((i & 0x03) != 3) i++;
		}if(up_button){
			if((i & 0x03) != 0) i--;
		}if(enter_button){
			break;
		}
	}
	return i;
}
  • 通りすがり さん早速ご丁寧にありがとうございます。大変勉強になります。メニューを表示して選択結果をリターンで受け取り、処理を分ければ良いのですね。当方思いもよりませんでした、勉強不足です。ありがとうございました。 - やま (2007年02月14日 00時22分38秒)

 LCDを使ったMENU表示について - やま (2007年02月11日 22時14分00秒)

こんにちは。マイコン初心者です只今C言語&AVRの勉強中です。
そこで相談なのですがC言語でLCDを使用したメニューの構築方法で良い実装法はないでしょうか?
avrfreaks.net でTinyMENUという物を見つけたのですがRAM使用量が大きく使う気になれません。
SWITCH文で作るのが無難なんでしょうか?皆さんならどうします?

  • 仕様によりますね。使用デバイスと、メニューの内容によるということです。 - 通りすがり (2007年02月11日 23時10分16秒)
  • ありがとうございます。mega48を使います。メニューは4択で2〜3階層位です。プリンタに付いているモード設定やステータス確認みたいな物を想像してください。 - やま (2007年02月11日 23時49分04秒)
  • 2階層なら最下位層のメニューに4bitのアドレスを振って、上位2bitを上位層メニューのアドレスとみなす。上位メニューの選択中に下ボタンが押されたら+4、上ボタンが押されたら-4して、決定ボタンが押されたら下位メニューを表示。下位メニューではインクリメント/デクリメントして…って感じですかね。文章で説明してもわかりにくいですが。 - 通りすがり (2007年02月11日 23時58分03秒)
  • 通りすがり さんありがとうございます!なるほど!わかります、その方法ならエントリーも十分取れますね。早速試してみます。 - やま (2007年02月12日 00時11分37秒)
  • 簡単なサンプルコードを書いてみたんですが(書いてみたかったんで)どうやって晒すんでしょうかね - 通りすがり (2007年02月12日 00時35分45秒)

 無題 - M16做的简易示波器 (2007年02月11日 17時57分36秒)

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=702504&bbs_page_no=1&bbs_id=1000
armok01139537.rar


 mega8からmega48へ - dacha (2007年02月11日 16時04分50秒)

改行が消えてしまったのでもう一度投稿します(すみません)
AVRUSBを弄っています。HIDKeysをmega8に対応させようと、
TCCR0 → TCCR0B
TIFR → TIFR0
と書き換えて書き込みましたが、「不明なデバイス」になってしまいます。
usbdrvを06/3/14版、06/3/26版、06/7/18版にしてトライしても結果は同じです。アドバイスお願いします。
  • mega8はmega48の間違いです。すみません - dacha (2007年02月11日 18時53分31秒)
  • 自己解決しました。#define USB_CFG_SAMPLE_EXACTの値を変えてみたら動きました。 - dacha (2007年02月12日 03時46分20秒)

 mega8からmega48へ - dacha (2007年02月11日 16時00分41秒)

AVRUSBを弄っています。
HIDKeysをmega48に対応させようと、
TCCR0 → TCCR0B
TIFR → TIFR0
と書き換えて書き込みましたが「不明なデバイス」になってしまいます。
usbdrvを06/3/14版、06/3/26版、06/7/18版にしてトライしても結果は同じです。
アドバイスお願いします。

 だんだん遅くなる…? - ひろあきん (2007年02月07日 07時00分07秒)

こんにちは。お知恵を拝借したく存じます。

動作速度が次第に遅くなる(というか待ち時間が伸びる)現象に悩み、書き込みをさせていただきます。

内部発振のATTiny2313ー20PUでタイマーもどきを作りました。
機能としては一定の間隔で順次ポートを開き、マトリックス配列になっているトランジスタ8個を駆動させる単純な回路です。

実際に順次トランジスタが駆動し、後につながるソレノイドが動くことを確認しました。

しかし、連続通電させていると、次第に待ち時間が長くなり、トランジスタ駆動の間隔が伸びてしまっています。
プログラム(BASCOM-BASIC)上では1秒に1回、100msだけ通電を8回繰り返し7秒間待つ、ということをしているのですが、実際には待ち時間が15秒ほど、通電のタイミングも数秒に1回、といった形になってしまいます。

使用していないポートは2kオームの抵抗でGNDに落としてあります。
原因がつかめず、困っております。何かチェックする点や気をつけねばならない点などがあるのでしょうか?

よろしくお願いします。

  • BASCOMのソースは短いと思いますので、ここにソースを開示してみてはいかがでしょうか。 - senshu (2007年02月07日 20時33分56秒)
  • 自己完結しました.プログラムに書いた周波数と、ヒューズビットでのクロック分周があっていませんでした。暴走状態に入っていたようです。 - ひろあきん (2007年02月09日 08時33分52秒)


 AVR-gccのAssemblerを使用したいのですが - K (2007年02月06日 21時27分37秒)

インスト−ルの方法、アセンブルの方法、アセンブルのバッチファイル
など、教えて下さい。

 INTn割り込みのレスポンス - ぱど (2007年02月03日 03時40分34秒)

はじめましてぱどともうします。

AVRについて勉強中の身なのですが
INTnのレベル割り込みのレスポンス時間について
資料を見ても良くわからない点があり詳しい方にお尋ねしたく。

知りたいことは、INTnのLowレベルで割込みを行い
ベクタ位置に埋め込んだIN命令でINTnのPORTを読み込む場合
最低何CLK分のLowパルス幅まで外付け無しで検出できるのかということです。

HERO'SさんのサイトのAVRsup.pdfの記述では
INTnのLowレベル割込みは速いように読めるのですが
何CLK前のRISE,FALLいずれでLowレベルになっていればよいのでしょうか?

 HEXファイルのサイズ - Writer (2007年02月01日 18時44分17秒)

いつもお世話になります、やりたいことがあります。

AVR Studio4を使用してHEXファイルを作成し、そのHEXファイルのサイズをマイコンのフラッシュ領域に書き込む

っというちょっと特殊なことをしたいのですが
現在、調査中ですがわかる方いらっしゃいましたらご教授下さい。

?まずHEXファイルのサイズを出力するリンカオプションがわかりません。
?サイズをGETしたら、それをフラッシュの固定アドレスに書く為の記述方法がわかりません。
(フラッシュの固定アドレスに配置する方法はわかりますが、ビルド後のサイズGET後にフィードバックさせ、もう一度ビルドする方法)
言葉足らずで申し訳ありませんが宜しくお願い致します。

  • HEXファイルを加工するプログラムを自作するのはどうでしょう(avrspxのソースやデュアル書き込みRS-CR式にあるHEX2RSCR.Cを参考にして)。HEXをバイナリに変換して最終番地データを追加する様なプログラムを作成。プログラムの自作は大変ですが、バイナリ・HEX変換のソフトはインターネット上にあるので利用できるかもしれません。 - TAD (2007年02月01日 23時51分17秒)

 AVRSPでの発振校正値の読み込みについて - furuta (2007年01月24日 17時17分40秒)

AVRSPを使って発振校正値を読み込みたいのですが、AVRSPで読み込めるのか。できるのなら、どうすれば読み込めるのか全くわかりません。どなたか知っている方お教えください。

  • -rf で表示されませんか? - kkk (2007年01月24日 18時21分48秒)
  • ヒューズを読むときに一緒に読むことができるわけですね。解決しました。ありがとうございます。 - furuta (2007年01月24日 18時26分11秒)

 mega8とtiny2313の書込みについて - としお (2007年01月20日 06時47分29秒)


ちかごろ Sシリーズから megaシリーズにデバイスを変えて
mega8やTiny2313に書込みを試みていますが 一向に書けません。

 どちらさんか アドバイスをください。お願いします。

  E-mail: nanohana_007@mail.goo.ne.jp


  • どんなライタを使っているのかも書かないと、アドバイスは不可能だと思います。 - senshu (2007年01月20日 10時37分15秒)

 FLASH上にアドレス指定して定数を定義するには - Writer (2007年01月19日 20時26分27秒)

いつもお世話になります。
件名の通り、FLASH上にアドレス指定して定数を定義するには
どう記述すればよいのでしょうか?
ご教授願います。


  • 自己レスです - Writer (2007年01月22日 13時25分50秒)
  • あれっ?!編集ができなくなったみたいですね。。。自己レスです。Flashの固定アドレスに定数や変数を指定する方法ですがソース上には、例えばunsigned char ver_tbl attribute((section(".test"))) = 0x1234;っと定義し、あとはStudio4上のConfigurationファイルのMemorySettingの中でFlash .test 0xXXXX(←配置させたい固定アドレスをワードアドレスで指定)すればできました。 - Writer (2007年01月22日 13時29分28秒)

 ATmega88デバッグ方法、コンバ−トミス - 名無しさん (2007年01月13日 22時38分15秒)

分かりかけてきました。
AT90S2313-->ATMEGA88の変更にともない、SCK,MOSI,MISO,RES
をPB7,PB6,PB5,PB4-->PB5,PB4,PB3,PB2に変更しただけではだめで、
WRPORT,RDPORTで、Bit POSITION変換が必要な事、完全には理解して
いないが、(TAD氏から戴いたソ−スを眺めて見て)

 ATmega88デバッグ方法 - kawana (2007年01月13日 17時10分50秒)

ChanさんのSPI-BridgeをATmega88で作成しようとして、ATmaega88にコンバ−トして、Debuggしていますが、なかなか
上手くいきません、効率てきなDebugg方法はないのでしょうか?
アイデアなど教えて下さい。
TADさんよりトリプルライタ−のソ−ス戴き検討をしているのですが
割り込みテ−ブルの変更、プログラムの、命令(OPC)、レジスタの変更をして一応、Assembleは出来ています。
SCK,MOSI,MISO,RESにLEDを付けモニタしています。
これが動作していない、
Debuggerで1step実行など、できるのですか?

 Hexファイルのチェックサム - Writer (2007年01月09日 16時13分40秒)

Hexファイルの各行にチェックサムが入っていますが

他マイコンのようにFlashにWrite後にトータルチェックサムみたいな機能はATMEGAにはないのでしょうか?
宜しくご教授お願いします。

  • 通常はライター側で書いたデータを読み直してベリファイしています。このときHEXのチェックサムはパソコン内で使われているだけでマイコンには送ってないので、デュアルライターのchsum_flashサブルーチンのように自分で作るしかないと思います。 - TAD (2007年01月09日 23時08分34秒)
  • 御回答ありがとうございます。いろんなマニュアルを見ましたがやっぱりそういう機能はないんですね...有難うございました。 - Writer (2007年01月10日 17時06分54秒)
  • トータルチェックサム機能のあるマイコンを私は知らないのですが、マイコン自身が計算しているのではなく、パソコンの書き込みソフトがチェックサムを表示しているのではないでしょうか。 - TAD (2007年01月10日 22時36分20秒)
  • ご指摘の通り、マイコンの機能ではなくFlashライターの機能になりますね。 - Writer (2007年01月19日 20時27分54秒)

 割り込み禁止状態で使うかもしれない関数での割り込み禁止 - samsara (2007年01月04日 17時47分35秒)

『Getting Started Notes』の『割り込み禁止状態で使うかもしれない関数での割り込み禁止』に書かれている事で質問があります。

SREG = save_sreg; によって、SREGの全割込み許可(I)ビットを元に戻すのは理解できましたが、他のビットを上書きしてしまっても良いものなのでしょうか?

C言語でプログラムを書いている為に、SREGの他のビットがどのように使用されているかわからない為に、質問させていただきました。

  • あとは全部演算結果のフラグですから、C言語の場合変更しても問題ないと思います。 - UKEI (2007年01月08日 03時21分04秒)
  • 回答ありがとうございます。 - samsara (2007年01月15日 09時58分44秒)

 AVRが吐き出すインテルHexファイルのCheckSum計算方法 - Writer (2006年12月25日 20時49分28秒)

連続書込み失礼致します。

件名の通り、AVRが吐き出すインテルHexファイルのCheckSumの計算方法を調べたのですが・・計算とあわない行があります。

計算式:
?各行のバイトカウント〜チェックサムの前までのデータを加算
?上記、和が例えば123hだとしたら200h(下位1バイトの値が00h)になるような値を算出
?その値が各行のチェックサムとなる。

上記計算式である行はAVRが吐き出すチェックサムと同じ、
しかしある行はAVRが吐き出すチェックサムと違います。

行によって計算式が違うのでしょうか?
宜しくお願い致します。

  • チェックサムの計算はどの行でも同じはずです???。計算が合わない行をここへ貼り付けてみてください。(「AVRが吐き出す」とはWinAVR/avr-gccのことですよね?) - kkk (2006年12月26日 07時13分41秒)

  • いつもありがとうございます。

下記の行のチェックサム値が上記計算式と違う値となっています。
宜しくご教授下さい。

:100000000C942A000C9445000C9445000C94450077
:100010000C9445000C9467050C9445000C94450025
:100020000C9445000C9445000C9445000C94460A31 ←この行
:100030000C9445000C94C0000C9445000C944500B1
:100040000C9445000C9445000C9445000C9445001C
:100050000C94450011241FBECFE5D8E0DEBFCDBF14 ←この行
:1000600011E0A0E6B0E0ECE7F8E302C005900D92E5 ←この行
:10007000AA33B107D9F713E0AAE3B1E001C01D929A ←この行

- Writer (2006年12月26日 09時20分15秒)

  • 計算してみました。あっているように思えますが・・・
  例えば3行目
10+00+20+00+0C+94+45+00+0C+94+45+00+0C+94+45+00+0C+94+46+0A+31=0400

- kkk (2006年12月26日 22時58分27秒)

  • !? 確かに計算するとあってました。実は2つのHexファイルを1つにするHexファイルに結合するソフトを作成してもらって、AVRの出力Hexファイルと値が違う結果で計算式があっていたのでこちらにあげさせてもらいましたが・・・・ご足労お掛けし大変申し訳ありません。再度見直してみます。 - Writer (2006年12月28日 14時03分54秒)

 電源断による不具合 - Writer (2006年12月25日 20時39分17秒)

ATMEGA32を使用しているのですが下記現象がでてるのですが、
こういった事象があったかご存知の方いましたら教えて下さい。


現象:
boot_page_erase_safe()を使用するプログラムを作成したのですが
プログラム動作中の電源断時に、boot_page_erase_safe()を実行してしまってFlash先頭ページを消去してしまってるようです。
尚、boot_page_erase_safe()のコールする所には入っていませんので、直接アドレスを叩いてる感じです。
ご教授下さい。





  • 同様の事はFlashだけではなくEepromでも起こります。それらは電源断の時にCPUが暴走してFlashやEepromの書込みルーチンや消去ルーチンを実行することにより起きるようです。5V又は3Vの電源を使用している場合はヒューズのBODを有効にすることで避ける事が出来ます。もしBODの設定をしていないのであれば試してみてください。 - kkk (2006年12月26日 07時08分14秒)
  • 御回答有難うございます。BODは設定しておりましたが違う設定値でもためしてみましたがだめでした。マイコン仕様書を読み返しましたが”電源電圧が不安定な時にはRESETをLoにたもたなければいけない”っとありましたがNMIがないと防げない???ような感じもしますがどうなんでしょうか? - Writer (2006年12月26日 10時15分48秒)
  • BODでもだめならNMIがあっても全く役に立ちません。ちなみにBOD-4Vで外部クリスタルの時はヒューズの下位バイトは0x1Fとなると思います(セラミック振動子の時は0x2E)。BOD-4Vを有効にした状態でCPUが不安定になる事は考えにくいですので他に原因があるのかも知れませんね。 - kkk (2006年12月26日 23時20分27秒)
  • いつも有難うございます。なんともまぬけな話しですが、BOD LEVELの設定はしてあったのですがENABLEに設定しておりませんでした。ENABLEにすることによって現象はみられなくなりました。本当にいつも有難うございます。 - Writer (2006年12月28日 13時59分47秒)

 エラーが多くて読めません - kuman (2006年12月16日 17時29分07秒)

サーバが変わってからでしょうか、何度もアクセスしないとTOPページが開けません。リンクをたどるとまたエラーで参っています。
どうしたのでしょう。

  • 本当に困りましたね。。。 このまま改善されないようならどこへ引越し検討でしょうか。。 - あしざー (2006年12月16日 19時05分49秒)
  • 私も10回に1回くらいしかTOPページが表示されません。この不具合は何とかならないでしょうか。 - senshu (2006年12月18日 22時10分17秒)
  • サーバの問題でCGIではどうしようもないので、引っ越しできる先がありましたらAttleeまで連絡ください。ソース全部お渡しいたします。 - Attlee (2006年12月19日 09時00分21秒)
  • もしよろしけば私のサーバーを使ってもらえますか?http://himitsu.jpn.ph/avrwiki/wiki.cgi - ゆーけい (2006年12月23日 13時41分49秒)
  • http://www7a.biglobe.ne.jp/~attlee/avr/data.lzh - Attlee (2006年12月26日 01時55分21秒)
  • ↑にdataフォルダとattachフォルダを纏めておいておきました。FSWikiみたいだからこれでOK? - Attlee (2006年12月26日 01時56分13秒)
  • 入れてみたのですが、表示されないタグがあります。何かプラグインを使ってらっしゃいますか? - ゆーけい (2006年12月26日 18時11分51秒)
  • それから管理については、私が引き継ぐという形でよろしいでしょうか? - ゆーけい (2006年12月26日 18時15分34秒)
  • brで整形したい人がいたのでtag2プラグインを導入しました。で、管理については引き継ぎでお願いします。 - attlee (2006年12月26日 19時29分48秒)
  • 多分これで移行完了できたと思います。 - ゆーけい (2006年12月27日 18時37分59秒)
  • ゆーけいさん、ありがとうございます!好調に閲覧できるようになりました。新サイトへ引越しした旨を旧サイトに記述(リンク)しておけば完璧ですね。 - あしざー (2006年12月28日 01時56分50秒)
  • ようやく、本来の状態に戻りましたね!どうもありがとうございます。 - senshu (2006年12月28日 08時05分23秒)
  • この場所は適当でないかもしれませんが、Menuへ行けるように左上の「メニュー」に「Menu」を追加してください。 - kumn (2006年12月28日 10時54分19秒)
  • 挨拶が遅れてしまいましたが ゆーけいさん,今後ともよろしくお願いします。attleeさん,お疲れさまです、お世話になりました。 - TAD (2006年12月28日 21時24分29秒)

 外部メモリの使用 - samsara (2006年12月13日 14時01分42秒)

お世話になります。
ATmega128/AVRStudio4/WinAVRを利用しております。
現在使用しているマイコンボードに外部SRAMが接続
されているます。外部SRAMに変数を配置する場合には、
どのように設定を行うのでしょうか?
AVRStudioのConfigrationOptionで、MemorySettingsで
Segmentを設定はしましたが、どうもMAPファイルを
見てもSegmentに追加されていないように見えます。
変数Aは外部、変数Bは内部というように細かく設定できるのでしょうか?
宜しくお願い致します。

各変数を細かく指定することは出来ませんが、全ての変数を外部RAMへ移動する
には、リンカオプションで、『-Wl,-Tdata,0x801100』を設定する事で解決しました。

 ゆっくりしたVCC電圧立ち上がりによる障害 - グーグー (2006年11月24日 20時40分07秒)

再度お世話になります。ATmega162-16MHzを使用した基板を設計したのですが、5VのVCC電源をゆっくり立ち上げるとCPUがハングアップしたかのような状態になることを発見しました。(たまたまVCC電源に実験用電圧可変型安定化電源を使用していて発見しました)。このままRESETピンをLOWにしても、RESETされません。ちなみにRESET ICを使用して4.5V以上にならないとリセット解除できない回路を組んでいるので、RESETが原因の不調ではないと思います。クロックは12.8MHz水晶です。FUSEビットもデータシートの指定通りに書き換えました。5V電源の立ち上がりが速いと、この症状は発生しません。5V電源の立ち上がり時間でCPUが動作したり、しなかったりなんてことはデータシートも書いてありませんし、ATMELのWebサイトのAppNoteを見てもそのような記事はありません。どなたかわかる方教えてください。
※過去にAT90S8515を使った基板を設計していたことがありますが、こんなトラブルはありませんでした。megaシリーズ特有のものなのでしょうか。

  • 自己レスです。AVRのAppNote:AVR190-POWER UP CONSIDERATIONS に AT90S8515,AT90S1200は100msec以内にVCCを立ち上げないとCPUが動作しない、一旦この状態になったら外部からのRESET信号でも解除できない、CPUのVCC電圧を一度0Vにする以外解除する方法はない、云々という注意書きがあるのを見つけました。今回のこの症状はこれと非常に似ています。試しに2.2Vまでは直ぐに立ち上げて、その後ゆっくりと5Vまで電圧を上げるような実験をしたらちゃんとCPUが立ち上がりました。ATmega162もこの注意が当てはまるのでしょうか?同じような問題を経験された方よろしくお願いします。(ちなみにこの問題は共立エレショップのWebサイトでもレポートされていました)
  • 結局自己レスです。ATMELのテクニカルサポートとえんえん1ヶ月やり取りしてました。結果をお知らせします。同様の問題で悩んでいる方は参考にして下さい。なおATMELに電源電圧の立上り時間に対する注意書きを今後データシートに掲載して欲しい、ということを要請しておきました。From Atmel Techical Support:この問題は全てのAVR CPUで発生するわけではない(発生するものとそうでないものがある)が、問題が発生した場合は電源電圧の立上り時間を 0.3V/msecより早く立ち上がるようにして使いなさい



 ウォームリブートとクールリブートの違い - Writer (2006年11月24日 15時02分12秒)

電源断によるリセットと、ソフトウェアリセットによる違いはあるのでしょうか?


(ATMEGA32にて)ブートローダにてアプリケーションプログラム書換え後、ブートローダからアプリケーション領域にジャンプさせアプリケーションプログラムを起動させたのですが・・動作が不安定になります(特に通信がうまくできない模様)


ブートローダーからのジャンプは

cli();

全割込み禁止処理;

GICR = 0x01;	// Enable interrupt vector select

GICR = 0x00;	// Move interrupt vector to flash

asm	volatile("push r1" "\n\t" 
	         "push r1" "\n\t" 
        "ret"     "\n\t"::);


にてさせております。
上記処理で抜けがあるのかアプリケーションのスタートアップ処理に何か抜けがあるのか?御教授下さい
(書き換えるアプリケーションプログラムは、書換え前のアプリケーションプログラムと全く同じものを試しにつかっており書換え前のアプリケーションプログラムは動作上、全く問題ありません)


 USBasp書き込み時のエラーについて - 石原 (2006年11月23日 14時58分09秒)

石原です。はじめまして
USBaspを作成してみましたが不思議なエラーで困っています。
・USBの認識は出来ています。読み込みも問題ないようです。
 (avrdude -p 2313 -c uspasp -v で確認)
 ・AT90S2313の書き込みで以下のエラーメッセージが出ます。
 (ホスト機はノートブックです。
 ターゲットのクロックは10MHzの水晶です。
 書き込みは高速でも低速でも同じエラーです。
 エラー後は書き込みのLEDが点灯したままになります)
・dumpしてみると、アドレス0xc7までは書けているようです。(それ以降は0xff)
 (短いプログラムで実行出来ることをを確認)
・ターミナルモードで 0xc8 以降に writeしてdumpしてみると書けています。
使用したのはuspasp.2006-09-16です。なにが原因なのかわかりますでしょうか。
------[エラーメッセージ]-----
C:\AVRsample2>c:\avr\avrdude-5.2cvs\WinAVR\bin\avrdude -p 2313 -c usbasp -U  flash:w:test.hex:a
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.02s
avrdude: Device signature = 0x1e9101
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
        To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "test.hex"
avrdude: input file test.hex auto detected as Intel Hex
avrdude: writing flash (146 bytes):
Writing |                                                    | 0% 0.00savrdude:
error: usbasp_transmit: usb_control_msg: sending control message failed, win err
or: スレッドの終了またはアプリケーションの要求によって、I/O 処理は中止されました
。

  • uspasp.2006-09-16のHEXは正常に動作しないと思われます。SandBoxに少し説明しています。一つ前のバージョンusbasp.2005-11-14ではどうでしょうか?あるいはSandBoxで公開しているavrspx_b10_10.zipの中のusbaspx113を利用してみてください。2006-09-16バージョンが必要であれば作成します - kkk (2006年11月23日 16時46分06秒)

 AVRのクロックの限界について - グーグー (2006年11月22日 08時26分06秒)

クロックプリスケーラの機能を使った場合の、AVRに入力できるクロックの上限の考え方について教えて下さい。データシートをよ〜く見たんですが、分かりません。
例えばATmega162を出しますと:
1)ATmega162の動作周波数は 4.5V〜5.5Vレンジでmax16MHzとなっています。
2)
ATmegaシリーズはクロックプリスケーラ機能があって、デバイスに入力されたクロックを決められて分周比で分周できる機能があります。
3)
ここで疑問です。ATmega162を外付けクリスタルで動かすとします。例えば分周比を 1/8 に設定した場合、64MHzの水晶をつけてもよいのでしょうか。
64MHZのクリスタルでも分周機能で1/8されれば,内部の動作周波数は16MHzとなりますよね。

データシートのクロック分周機能の説明のページを見ると、
「デバイスに入力されるクロックがデバイスの動作周波数を上回る場合は、クロック分周機能を使って適切なデバイスの動作周波数まで落とさないといけない」という趣旨の説明があり、この説明だと、クロック分周機能を使えばデバイスには動作周波数以上のクロックが入力出来る、というように解釈できるからです。
よろしくお願いします。

  • 8分周設定のTiny13V-10PIに40MHzの外部クロックを入れたら5MHzで動きました。しかし、分周無しでも40MHz動作したので真の上限クロックは解りませんでした。尚、水晶振動子は24MHzを超えると基本波ではなく3次オーバートーンになりますので発振しにくいと思います。 - TAD (2006年11月23日 23時18分55秒)
  • アドバイスありがとうございます - グーグー (2006年11月24日 13時20分01秒)

 BLS領域への書込み - Writer (2006年11月20日 18時42分01秒)

ブートプログラムを作成しBLS領域へWriteしたいのですがどうしても先頭番地0x0000からWriteをはじめてしまいます。
御教授下さい。

/*--- 環境 ---*/

マイコン:ATMEGA32

ライター:ATMEL純正USBライター(ISP MK?)

ソフト:AVR Studio4

当方のやり方は
AVR Studio4のAVRISP mk?画面よりProgramを実行しフラッシュの内容をダンプすると0x0000よりWrite。但しサイズはあっていました。

AVR Studio4のConfigurationOptionsのMemorySettingには
Flash .bootloader 0x3800
を追記設定しておりますが、ブートローダソース上では、section指定はあえてしておりません。
っというのは以前、avrsp改.exeによりブートローダーを書き込んだ時にはMAKE Fileだけの対応だけでBLS領域へWriteできた為です。


  • ソースにもよりますがAVRStudioのMemorySettingにはFlash .textの方に設定してみてはどうでしょうか? - kkk (2006年11月20日 20時24分06秒)
  • ありがとうございます。早速ためしてみましたが0x0000からWriteしているようです。もうちょっと色々試してみます。 - Writer (2006年11月21日 09時33分42秒)
  • 成功例です。。。。Studio4のConfigrationOptionsのMemorySettingsにFlash .text 0x3800追加、CustomOptionのAllFilesに-Wl,-section-start=.text=0x3800を追加したら一旦BuildしMakefileに反映されてれば0x3800よりWriteされてました。 kkkさんいつも有難うございます。 - Writer (2006年11月21日 13時24分06秒)
  • おめでとうございます。気になる点・・・CustomOptionのAllFilesに-Wl,-section-start=.text=0x3800は特に指定しなくてもMemorySettingsにFlash .text 0x3800で十分のような気がします。仮に-Wl,-section-startで指定するのであればワード単位のアドレス0x3800ではなくバイト単位のアドレス0x7000を指定する必要があるように思われます。またこの場合はリンカオプションですのでCustomOptionのAllFilesの方ではなくCustomOptionのLinkerOptionの方に追加することになります。AVRStudioのBuildメッセージのコンパイル&リンクの情報を確認してみてください、何か情報が得られませんでしょうか。 - kkk (2006年11月21日 15時12分22秒)
  • AVRStudioのProjectOptionを変更した場合は念のため[Build]->[Clean]でゴミ掃除をしておいてから再度ビルドしてください。Makeを使用する場合は Make Clean の後 Make を実行します。 - kkk (2006年11月21日 15時28分52秒)
  • kkkさん、御指摘ありがとうございます。全く持って御指摘通りですね。。。削除しても0x3800からWriteできました。いつも勉強になります有難うございます。 - Writer (2006年11月21日 20時29分53秒)