電子書籍の厳選無料作品が豊富!

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データの取り扱いに関するプログラムの書き方などご教示頂きますよう、お願い致します。

A 回答 (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 …
引数の型から、「&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);
# ですかね。

この回答への補足

お世話になっております。



とあるサイトで、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アドレスに設定したデータが表示されました。


どうも、シミュレーションが実施できない理由は他に問題があるようだとのことです。




ご協力頂きありがとうございました。

補足日時:2014/04/25 10:56
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。

教えて頂きましたプログラムでシミュレーションで実行してみました。


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データの読み取りに失敗しているのでしょうか?

解決方法などご教示頂けると助かります。

お礼日時:2014/04/17 14:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!