Atmel StudioのEEPROMアドレス

このQ&Aのポイント
  • Atmel Studio6.2でATmega88pマイコンのプログラミングを行っています。EEPROMアドレスへのデータ書き込みが逆になる問題が発生しています。
  • AVR studio4.19 + winAVRとAtmel Studio6.2の違いによって、EEPROMアドレスの配置が逆になっています。
  • 最初のアドレスに割り当てるためには、コードを逆にして記述する必要がありますか?
回答を見る
  • ベストアンサー

Atmel Studioのeepromアドレス

現在Atmel Studio6.2でATmega88pマイコンのプログラミングを行っています。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/head/branches/test002_AVRS6_20140819/test02/test02/src/main.c AVR studio4.19 + winAVR Cコンパイラで作成していたコードをAtmel Studio6.2に移してコンパイルを行ったところ、EEPROMアドレスへのデータ書き込みが逆になってしまう現象が起きました。 #define EEPROM __attribute__((section(".eeprom"))) ctl_data EEPROM gctl_data; reg_slave EEPROM greg_slave[100]; int EEPROM eprom_level[14]; char EEPROM eprom_fixid[3]; char EEPROM test_mode; char EEPROM monitor_state; int EEPROM wdt_cnt; int EEPROM cnt_loop_break; このようなコードを”AVR studio4.19 + winAVR”の時からしているのですが、このときは ctl_data EEPROM gctl_data; こちらがEEPROMアドレスの0x0000番地から始まっていたのですが、Atmel Studio6.2の場合は、 int EEPROM cnt_loop_break; こちら側が0x0000番地に配置するようになっていて、逆になってしまっています。 この場合、一番最初のアドレスに割り当てするには、コードも逆にして記述する必要がありますでしょうか? どうぞ、ご教示頂きますようお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kabasan
  • ベストアンサー率44% (264/588)
回答No.1

単に変数宣言しただけだけでは変数の実アドレスはコンパイル環境依存であり、 プログラムからメモリ位置を制御できません。 WinAVRもAS6も同じGCCですがバージョンが異なります。 そもそも変数名でアクセスすれば実アドレスは関知しなくて良いはずですし、 自分で分かる実アドレスに配置したいならポインタを使うものです。

techhouse
質問者

お礼

回答頂きありがとうございます。 #define EEPROM __attribute__((section(".eeprom"))) save_eeprom_data_t EEPROM save_eeprom_data; このように save_eeprom_data_t 構造体にまとめて、アドレス位置を決めるように設定してみました。 https://sourceforge.jp/projects/cc1101driver/scm/svn/commits/2557 助かります。

関連するQ&A

  • Atmel studo6.2デバッグ時EEPROM

    現在、Atmel studio6.2でAtmel88pマイコンのプログラミングを行っています。JTAGICE3でリアルタイムデバッグをやっています。通常のプログラミングモードからデバッグモードにマイコンを切り替える際に、EEPROMの内部データが初期化されてしまいます。 マイコンのデバッグを開始する際に一番最初にEEPROMのデータ内容を読み込んでいるので、このデータをいちいち打ち込まなければいけないのですが、EEPROM内容を保存しているeepファイルなどを読み込む機能はデバッグモード時にありますでしょうか? AVR Studio4.19の時はこの機能があったと思うのですが、ご教示頂きますよう、よろしくお願い致します。

  • AVR studio6でeepromリードできない

    AVR studio6.1の環境をPCに入れてATmega88のプログラムを行っています。ATmega88に電源を投入直後に初期設定のために、あらかじめeeprom内に設定しているプリセット値を読み込むためにeeprom_read_byte関数を使用してデータを読み出したいと思っています。 テストとしてeepromの0x00番地のデータを読み出そうとしているのですが、データを読み出すことができず困っています。 volatile u8 test01; volatile u8 test02; volatile u8 test03; volatile u8 test04; volatile int addr; addr = 0x00; eeprom_busy_wait(); test01 = eeprom_read_byte(&addr); addr = 0x01; eeprom_busy_wait(); test02 = eeprom_read_byte(&addr); addr = 0x02; eeprom_busy_wait(); test03 = eeprom_read_byte(&addr); addr = 0x03; eeprom_busy_wait(); test04 = eeprom_read_byte(&addr); このようなプログラムを組んでAVR Studio6.1のシミュレーションモードで、eepromのアドレス0x00番地から順に0x00,0x01,0x02,0x03,0x04・・・・  このように設定してみたのですが、 実際にシミュレーションしてみるとeeprom_read_byteの戻り値に代入されたtest01,test02,test03,test04には0x00という値が代入されeeprom内からのデータの読み出しに失敗しているようです。 eepromデータの取り扱いに関するプログラムの書き方などご教示頂きますよう、お願い致します。

  • AVR StudioのEEPROMのhexファイル

    いままでAVR Studio4というAtmelマイコンの開発環境をwindows 7のPCで使用していました。最近、PCを買い換えてwindows8になってからマイコンの書き込みで使っていたUSB接続のAVRICEデバッガがwindows8のドライバで対応していないなどがあり、AVR Studio6をインストールしたらこれらのデバッガが使えるようになったので使っていました。 しかし、複数のAtmega88のEEPROM領域に初期値として書き込んでいたhexファイルがあったのですが、なぜかAVR Studio6でダウンロード使用とすると書き込みがエラーしたりします。 まったく同じファイルをAVR Stuio4でダウンロード使用とするとこれは可能でした。 このEEPROMへのファイルのダウンロードに関してVer4とVer6ではなにか仕様に変化がありましたでしょうか? ご存じの方いらっしゃいましたらご教授頂きますようお願い致します。

  • Atmel Studioでdelay関数でエラー

    現在Atmel Studio6.2でATmega88のプログラミングをやっています。 LEDを1秒間隔で点滅させるプログラムをやってみてます。 http://sourceforge.jp/projects/cc1101driver/scm/svn/tree/2510/branches/CC1101_source_ATmega88_AVRS6/AVRGCC1/ このプログラムでdelay関数として #include <util/delay.h> このヘッダーファイルをインクルードして int main() { hw_setup(); while(1) { B_CTL_HIGH; _delay_ms(1000); B_CTL_LOW; _delay_ms(1000); } } このようなプログラムを組んで見たところ次のようなエラーが出てきます。 (エラー内容) Error 1 __builtin_avr_delay_cycles expects a compile time integer constant c:\program files (x86)\atmel\atmel toolchain\avr8 gcc\native\3.4.1056\avr8-gnu-toolchain\avr\include\util\delay.h 163 28 CC1101_ATmega88 このエラーの解決方法をご教示頂きますよう、お願い致します。

  • EEPROMからRAMへ移動したがウォッチできない

    現在、Atmel Studio6.2でatmega88pマイコンのプログラミングを行っています。リアルタイムデバッグではJTAGICE3を使用しています。プログラムのVersion値とeepromに保存しているVersion値を比較して、違いがあった場合は、プログラムの更新があったことを記録するため、最新のVersion値をEEPROMに書き込むプログラムを作成したのですが、EEPROMからRAM領域へ取り出したデータをリアルタイムデバッグでウォッチできない現象が起こり困っています。 なお、このプロジェクトフォルダは https://sourceforge.jp/projects/cc1101driver/scm/svn/tree/2564/branches/test002_AVRS6_20140819/test02/ こちらで公開させてもらっています。 (EEPROM領域側) #define EEPROM __attribute__((section(".eeprom"))) save_eeprom_data_t EEPROM save_eeprom_data; (RAM領域側) new_ctl_data tnew_ctl_data; main関数スタート後 check_env()関数内でEEPROM領域からRAM領域へデータを my_eeprom_read_block((u8 *)&tnew_ctl_data,(u8 *)&save_eeprom_data.gnew_ctl_data,sizeof(ctl_data)); この関数で読み出しているのですが、再度main関数内で if(tnew_ctl_data.fix_osccal_flag != 0x01 || tnew_ctl_data.prog_ver != PRG_VERSION) { ------(中略)--------------------------------- } このコードに来たときにtnew_ctl_dataをウォッチしても new_ctl_data.fix_osccal_flag tnew_ctl_data.prog_ver どちらの値も0x00と表示されてしまいます。 また、 tnew_ctl_data.prog_ver の値は0xdcのはずなのですが、0x00となっており、 PRG_VERSIONは #define PRG_VERSION 0xDD 0x00 と0xDDでは違いが出ているのですが、そのときの条件でEEPROM内容を tnew_ctl_data.fix_osccal_flag = 0x01; tnew_ctl_data.prog_ver = PRG_VERSION; eeprom_busy_wait(); eeprom_write_block(&tnew_ctl_data.fix_osccal_val,&save_eeprom_data.gnew_ctl_data.fix_osccal_val,3); このコードで0xddにtnew_ctl_data.prog_verの領域バイトを書き換えるはずなのですが、0xdcのままになってしまいます。 このような場合、どのように修正したら良いのかをご教示頂きますよう、お願い致します。

  • AVR Studio 6のCコンパイラについて

    今まではAtmelのマイコンでのコーディングの時にはAVR Studio 4をインストールして、C言語でのプログラミングのためにwinavrというCコンパイラをダウンロードしてインストールして使用していました。 最近のAtmelの開発環境はVersionが上がっていてAVR Studio 6というのが使用できるようになっていたので、インストールして使用してみたのですが、この開発環境をインストールすると既にC言語のコーディングとかコンパイラができるようになっていました。 この標準搭載のCコンパイラはwinavrのものなのでしょうか? それともAtmel自信のCコンパイラなのでしょうか? ご存じでしたらご教授よろしくお願い致します。

  • avr studio4 について

    #include <avr/io.h> #include "adc.h" #define SENSOR_IR 1 #define SENSOR_PORT PORTC #define SENSOR_DDR DDRC #define LED_PORT PORTD #define LED_DDR DDRD // 点灯パターン 16x8ドット unsigned int pat[]={ //123456789ABCDEFG 0b0011010001011100, 0b0101010001010010, 0b1001010001010010, 0b1001001010011100, 0b1111001010010100, 0b1001001010010100, 0b1001000100010010, 0b1001000100010010 }; int main(void) { #define DOTMAX (16*3) #define THRESHOLD 200 #define SHIFTCNT 50 int adc; int adc_back; int line; char iso; char edge=0; unsigned int cnt; unsigned int cnt_mst; unsigned int bitnum; int turn; ad_init(0); turn=0; iso=0; SENSOR_DDR |= (1<<SENSOR_IR); SENSOR_PORT |= (1<<SENSOR_IR); LED_DDR |= 0xff; turn=10000; while(turn-->0); cnt = 0; cnt_mst = 1; while(1) { bitnum = (DOTMAX * cnt) / cnt_mst; bitnum += iso; bitnum &= 0xf; // bitnum = bitnum mod 16 for(line=0; line<8; line++){ if((1<<bitnum) & pat[line]) LED_PORT |=(1<<line); else LED_PORT &= ~(1<<line); } cnt++; adc_back = adc; adc = ad_get(); if(edge==0) { if(adc < (adc_back-THRESHOLD)) { edge = ~edge; cnt_mst = cnt-(cnt/(DOTMAX*2)); cnt=0; turn++; if(turn >= SHIFTCNT){ turn=0; iso =(iso-1)& 0xf; } } }else{ if(adc > (adc_back+THRESHOLD)) { edge = ~edge; } } } return 0; } と入力してビルドしたところ Build started 5.2.2007 at 02:21:46 avr-gcc -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT loopled.o -MF dep/loopled.o.d -c ../loopled.c ../loopled.c: In function 'main': ../loopled.c:87:24: warning: 'adc' may be used uninitialized in this function [-Wmaybe-uninitialized] avr-gcc -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT adc.o -MF dep/adc.o.d -c ../adc.c avr-gcc -mmcu=atmega168 -Wl,-Map=loopled.map loopled.o adc.o -o loopled.elf avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature loopled.elf loopled.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex loopled.elf loopled.eep || exit 0 avr-objdump -h -S loopled.elf > loopled.lss AVR Memory Usage ---------------- Device: atmega168 Program: 526 bytes (3.2% Full) (.text + .data + .bootloader) Data: 16 bytes (1.6% Full) (.data + .bss + .noinit) Build succeeded with 1 Warnings... とでてきました どうすればビルドできますか?

  • アトメルのJTAGICE mk3について

    ATMEL社製のJTAGICE mk3について、 http://akizukidenshi.com/catalog/g/gM-06721/ 今AVR Studio 4.19 + winAVRでのプログラミング作業を行っていて、デバッガとしてJTAGICE mk2を使用していたのですが、mk2の動作が不安定なためリアルタイムデバッグ作業ができず困っており、mk3でできないかと調べているのですが、 このmk3はAVR4.19でも使用できるのかご教示の程よろしくお願い致します。

  • new char[]について。

    "\n"を含む文字列から"\n"ごとに文字列を作成しようとしています。 コードは次のとおりです。 //----------------------------------------------------------- int main() { char*buf = "1:This is a Test\n2:This is a test\n3:This is a test"; //終端まで操作 for(;;) { char*startPos = buf; int cnt =0; //そこの行を取得する while(buf[0] != '\n' && buf[0] != '\0') { cnt++; buf++; } char*tmp = new char[cnt]; memcpy(tmp,startPos,cnt); puts(tmp); buf++; delete tmp; if(buf[0] == '\0') break; } } //----------------------------------------------------------- 期待する結果は、 1:This is a Test 2:This is a test 3:This is a test" なのですが、実際は 1:This is a Test■■■ 2:This is a test■■■ 3:This is a test■■■ と終端に汚い文字が入ってしまいます。 何がいけないのでしょうか。 ご教授お願いします。 環境はXP,VC2005です。

  • AVR Studio4 の使用方法

    AVR Studio4 をダウンロードし C言語でプログラムを作りたいのですが WinAVR もいれ AVR Gccで製作しました。 簡単な テスト サンプルをコピー ビルドすると make: Makefile: No such file or directory make: *** No rule to make target `Makefile'. Stop. Build failed with 2 errors and 0 warnings... が表示され コンパイルできません。  C言語プログラム すべて このようなエラーが出て コンパイルできません。  どのように直せば C言語プログラム受け付けてくれるのでしょうか?