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

雑談5

雑談場所5

雑談をする場所も必要でしょー(それがメインになるのも考えものだが)※ここのDATAが多くなったので雑談4、3、2、1に詰め込みました。

古い話題は 雑談4 以前でお願いします。

お名前
件名
本文
認証 以下のうち0のみすべてチェックしてください。

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

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

  • Tiny2313(\100)とmega328(\250)秋月にて。 - kuman (2011年07月24日 15時24分39秒)
  • ありがとうございます。早速買ってみます。 - NiwakaPICer (2011年07月27日 19時25分16秒)
お名前: コメント:

 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,$AALDS $00A0,R16STS R17,$00A0AVRStudioでアセンブルしデバッカで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 professionalAVR Studio : ver 4.17WinAVR : 20090313V-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.13WinAVRは20080610PCは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ライタです。http://www.geocities.jp/arduino_diecimila/avr-writer/bread_writer_1.jpghttp://farm4.static.flickr.com/3090/3162073199_1e055d5639_o.jpg

お名前: コメント:

 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 -fh11011101avrsp -fl11010111avrsp -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秒)
お名前: コメント: