- ベストアンサー
AVR Studio6でEEPROMリードできない
- AVR Studio6.1の環境を使用してATmega88のプログラムを実行していますが、EEPROMのデータの読み出しに問題が発生しています。
- プログラムの中でEEPROMの0x00番地から順にデータを読み出そうとしていますが、読み出される値が正しくないようです。
- EEPROMデータの取り扱いに関するプログラムの書き方について教えていただきたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>実際にシミュレーションしてみるとeeprom_read_byteの戻り値に代入されたtest01,test02,test03,test04には0x00という値が代入されeeprom内からのデータの読み出しに失敗しているようです。 アドレス指定がおかしいからでしょう。 volatile int addr; addr = 0x00; test01 = eeprom_read_byte(&addr); で、eeprom_read_byte()に渡しているアドレスは0x0000ではなく 「変数addrが置かれているRAMのアドレス」です。 その場所がEEPROMのアドレス範囲外であれば、失敗することになるでしょうね。 # マイコン内のRAMアドレスとEEPROMのアドレス範囲がどう管理されているのか…という問題はあるかと思われますが。 http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html#ga2d4ee8b92a592c764785fb5e4af5662b 引数の型から、「&addr」としたのかも知れませんが…。 >eepromのアドレス0x00番地から順に0x00,0x01,0x02,0x03,0x04・・・・ このように設定してみたのですが、 ならば、 volatile uint8_t *addr; addr = 0x00; test01 = eeprom_read_byte(addr); addr = 0x01; test02 = eeprom_read_byte(addr); とかやるべきかと。 # 変数経由しないなら… # test01 = eeprom_read_byte((const uint8_t *)0x00); # test02 = eeprom_read_byte((const uint8_t *)0x01); # ですかね。
お礼
回答頂きありがとうございます。 教えて頂きましたプログラムでシミュレーションで実行してみました。 eepromには実行前にアドレス0x00番地から順に0x00,0x01,0x02,0x03,0x04・・・・ このようにデータを設定していきました。 それでこのプログラムを実行してみました。 volatile uint8_t *addr; volatile u8 test01; volatile u8 test02; volatile u8 test03; volatile u8 test04; (中略) 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のシミュレーションでもtest01,test02,test03,test04には”0x00”というデータが入ってきてしまいます。 同様に、 addr = 0x00; eeprom_busy_wait(); test01 = eeprom_read_byte((const uint8_t *)0x00); addr = 0x01; eeprom_busy_wait(); test02 = eeprom_read_byte((const uint8_t *)0x01); addr = 0x02; eeprom_busy_wait(); test03 = eeprom_read_byte((const uint8_t *)0x02); addr = 0x03; eeprom_busy_wait(); test04 = eeprom_read_byte((const uint8_t *)0x03); このやり方でも"0x00"というデータしか入りません。 やはりeepromデータの読み取りに失敗しているのでしょうか? 解決方法などご教示頂けると助かります。
補足
お世話になっております。 とあるサイトで、AVR Studio6のシミュレータでこのプログラムならEEPROMのシミュレーションができるというサイトがありました。 #include <avr/eeprom.h> uint8_t ee01 EEMEM = 0x37; uint8_t ee02 EEMEM = 0x5C; uint8_t ee03 EEMEM = 0xBF; uint8_t ee04 EEMEM = 0xE2; uint8_t ram01, ram02, ram03, ram04; int main(void) { ram01 = eeprom_read_byte(&ee01); ram02 = eeprom_read_byte(&ee02); ram03 = eeprom_read_byte(&ee03); ram04 = eeprom_read_byte(&ee04); } このプログラムを単独のプロジェクトで作成してビルドしてシミュレーションを実施してみたところ、確かにシミュレーションのEEPROMのメモリウィンドウに uint8_t ee01 EEMEM = 0x37; uint8_t ee02 EEMEM = 0x5C; uint8_t ee03 EEMEM = 0xBF; uint8_t ee04 EEMEM = 0xE2; こちらのEEPROMアドレスに設定したデータが表示されました。 どうも、シミュレーションが実施できない理由は他に問題があるようだとのことです。 ご協力頂きありがとうございました。