
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データの取り扱いに関するプログラムの書き方などご教示頂きますよう、お願い致します。
No.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アドレスに設定したデータが表示されました。
どうも、シミュレーションが実施できない理由は他に問題があるようだとのことです。
ご協力頂きありがとうございました。
回答頂きありがとうございます。
教えて頂きましたプログラムでシミュレーションで実行してみました。
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データの読み取りに失敗しているのでしょうか?
解決方法などご教示頂けると助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- ドライブ・ストレージ HDDのチェック方法 6 2022/05/04 09:49
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- その他(プログラミング・Web制作) ZWCAD CUIXとLISPの関係について 1 2022/09/28 03:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 10分後にエクセル...
-
テキストボックスの背景をVB...
-
(Linux、データベース初心者)...
-
型について
-
PostgreSQL serial型の質問
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
オラクルのUPDATEで複数テーブル
-
結合したテーブルをSUMしたい
-
UPDATEで既存のレコードに文字...
-
PostgreSQLのtimestamp型で時間...
-
既存データをINSERT文にして出...
-
データ削除とSQL*Loaderでのイ...
-
mysql 複数テーブルの条件付け摘出
-
既にテーブルが存在する場合の...
-
【VB】セルが空になるまで処理...
-
エラーを起こす方法
-
Accessで重複したデータを削除...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CSVファイルを読み込んでテーブ...
-
SQLSERVER 連番更新について
-
timestamp が空のデータを除い...
-
テキストボックスの背景をVB...
-
ACCESS テキストボックスに入...
-
SELECT文で足し算をした場合、N...
-
エクセルVBA 10分後にエクセル...
-
エクセルVBEについて
-
date型でのbetweenについて教え...
-
Accessエクスポート時に連番を...
-
1つのドメインを複数のDNSで管...
-
配列データに対する、要素の追...
-
【Access】SQL文教えてください!
-
データがリストアできない!!
-
型について
-
Access VBA Excelbookを開く際...
-
PostgreSQLのnumericでの書き込...
-
エクセル vba 色分け
-
Japanese schools
-
バッチファイルでrenを使用時、...
おすすめ情報