Hallo!
Ich habe folgendes Problem: Ich muss 16 integer-Werte in den eeprom (ab 0x8000) eines Wärmebildsensors (i2c adresse = 0x33) schreiben.
Zuerst lese ich die bestehenden Werte aus, gebe dann die zu schreibenden Werte aus und zuletzt sollten diese neuen Werte auch wieder gelesen werden.
Das Problem ist nun, dass ich die alten Werte zwar schön lesen kann, diese aber nicht durch die neuen ersetzt werden.
Die Vorlage für den sketch, den ich hierfür verwende ist hier zu finden:
https://forum.arduino.cc/index.php?topic=351494.30
#include <Wire.h>
#define I2C_EEPROM_ADRESSE 0x33
#define EEPROM_SPEICHER_ADR 0x8000
const uint16_t Anzahl_Rezepte = 16; // anzahl Rezepte
uint16_t Zaehler[Anzahl_Rezepte] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
bool oneshot = true;
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("Programmanfang");
i2c_eeprom_readUIntArray(I2C_EEPROM_ADRESSE, EEPROM_SPEICHER_ADR, Zaehler, sizeof(Zaehler) / sizeof(Zaehler[0])); // Liest die alten Werte aus dem EEPROM
Serial.print("Zaehlerfeld vor dem Schreiben: \t");
for (uint16_t j = 0; j < (sizeof(Zaehler) / sizeof(Zaehler[0])); j++)
{
Serial.print(Zaehler[j]);
Serial.print(" ");
}
Serial.println();
}
void loop()
{
//oneshot = false;
if (oneshot)
{
Zaehler[0] = 9;
Zaehler[1] = 171; // = HEX AB
Zaehler[2] = 18843; // = HEX 499B
Zaehler[3] = 0;
Zaehler[4] = 8289; // = HEX 2061
Zaehler[5] = 5;
Zaehler[6] = 800; // = HEX 320
Zaehler[7] = 992; // = HEX 3E0
Zaehler[8] = 6694; // = HEX 1A26
Zaehler[9] = 41512; // = HEX A228
Zaehler[10] = 389; // = HEX 185
Zaehler[11] = 1177; // = HEX 499
Zaehler[12] = 0;
Zaehler[13] = 6401; // = HEX 1901
Zaehler[14] = 0;
Zaehler[15] = 0;
Serial.print("neu zu schreibende Werte: \t");
for (uint16_t j = 0; j < (sizeof(Zaehler) / sizeof(Zaehler[0])); j++)
{
Serial.print(Zaehler[j]);
Serial.print(" ");
}
i2c_eeprom_updateUIntArray(I2C_EEPROM_ADRESSE, EEPROM_SPEICHER_ADR, Zaehler, sizeof(Zaehler) / sizeof(Zaehler[0])); // Schreibt die neuen Werte in den EEPROM
i2c_eeprom_readUIntArray(I2C_EEPROM_ADRESSE, EEPROM_SPEICHER_ADR, Zaehler, sizeof(Zaehler) / sizeof(Zaehler[0])); // Liest die neuen Werte aus dem EEPROM
Serial.println();
Serial.print("Zaehlerfeld nach dem Schreiben: \t");
for (uint16_t j = 0; j < (sizeof(Zaehler) / sizeof(Zaehler[0])); j++)
{
Serial.print(Zaehler[j]);
Serial.print(" ");
}
Serial.println();
oneshot = false;
}
}
void i2c_eeprom_updateUIntArray(int16_t deviceaddress, uint16_t eeaddress, uint16_t *ptr, uint16_t anzahlElemente)
{
uint16_t buf[anzahlElemente];
i2c_eeprom_readUIntArray(deviceaddress, eeaddress, buf, sizeof(buf) / sizeof(buf[0]));
uint16_t eadr=eeaddress;
for (uint16_t j = 0; j < anzahlElemente; j++)
{
if ((ptr[j] >> 8) != (buf[j] >> 8))
{
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eadr >> 8)); // MSB
Wire.write((int)(eadr & 0xFF)); // LSB
Wire.write(ptr[j] >> 8);
Wire.endTransmission();
delay(10);
}
eadr++;
if ((ptr[j] & 0xFF) != (buf[j] & 0xFF))
{
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eadr >> 8)); // MSB
Wire.write((int)(eadr & 0xFF)); // LSB
Wire.write(ptr[j] & 0xFF);
Wire.endTransmission();
delay(10);
}
eadr++;
}
}
void i2c_eeprom_readUIntArray(int16_t deviceaddress, uint16_t eeaddress, uint16_t *ptr, uint16_t anzahlElemente)
{
uint16_t data = 0xFF;
delay(2);
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress, anzahlElemente << 1);
for (uint16_t j = 0; j < anzahlElemente; j++)
{
delay(5);
data = Wire.read() << 8;
delay(5);
data = data | Wire.read();
ptr[j] = data;
}
}
Ergebnis:
Programmanfang
Zaehlerfeld vor dem Schreiben: 9 172 27039 0 8289 5 800 992 2571 24488 390 1177 0 6657 0 0
neu zu schreibende Werte: 9 171 18843 0 8289 5 800 992 6694 41512 389 1177 0 6401 0 0
Zaehlerfeld nach dem Schreiben: 9 172 27039 0 8289 5 800 992 2571 24488 390 1177 0 6657 0 0
Vielleicht kann mir ja jemand von den Profis helfen. Danke im voraus, lg stoppi



