1

問題があります。ATtiny から EEPROM を読み取ることはできますが、何かを書き込むことができません。

これが私のコードです:

#include <EEPROM.h>

int addr = 0;
int val = 2;
    
void setup()
{
}
    
void loop()
{
  EEPROM.write(addr, val);
      
  addr = addr + 1;
  if (addr == 512)
    addr = 0;
}

編集

今私の書き込みコードは次のとおりです。

#include <EEPROM.h>

int addr = 0;
int val = 2;

void setup()
{
}

void loop()
{
  EEPROM.write(addr, byte(val));
  
  addr = addr + 1;
  if (addr == 512)
    while(1);
}

そして私の読み取りコード:

int address = 0;
byte value;

#include <SoftwareSerial.h>

void setup()
{
  SSerial.begin(9600);
}

void loop()
{
  value = EEPROM.read(address);
  
  SSerial.print(address);
  SSerial.print("\t");
  SSerial.print(value, DEC);
  SSerial.println();
  
  address = address + 1;
  
  if (address == 512){
    address = 0;
    delay(100000000);
  }
}

私は常に値 255 しか取得しません。すべてのアドレスで。次に、int を byte に変換します。私の場合、int は 255 を超えません。

ところで、int を byte として作成できますか? ということで、普通の int のように使えますが、直接書けるのでしょうか?

4

2 に答える 2

1

あなたは1バイトを書いていますが、anintは2バイトです。EEPROM.get()より大きな型には&を使用できますEEPROM.put()(読み取り/書き込みは 1 バイトのみを処理します)。

#include <EEPROM.h>
int addr = 0;
int val = 2;

void setup(){}

void loop(){

  //Write value
  EEPROM.put(addr, val);

  //Read value
  EEPROM.get(addr, val);

  addr += sizeof(int);  //Increment cursor by two otherwise writes will overlap.

  if(addr == EEPROM.length())
    addr = 0;
}

Vladimir Tsykunov が述べたように、このテスト コードは実行中に何度もループするため、EEPROM に悪影響を与える可能性があります。1 回の反復後にループを停止する方がよい場合があります。

  if(addr == EEPROM.length())
    while(1); //Infinite loop
于 2016-04-03T22:27:09.030 に答える
0

ループで eeprom を書き込まないようにしてください。eeprom の書き込み/読み取りサイクルの数は限られていると思います。ターミナルで読み書きした値を表示する必要があります。

于 2016-04-03T16:36:10.733 に答える