AVR-en az int 16 bit szokott lenni. Ha biztosra akarsz menni, akkor kerüld az intet, és használj helyette pontosan mindig ugyanakkora méretű változót, például uint16_t vagy ha kellenek negatív számok is, akkor int16_t.
Minden digitális memória legkisebb egysége a bit, amikből nyolc egy byte. Ezeket aztán platformtól függően lehet csoportokba szervezni. Az AVR egy 8 bites platform, így a memóriája bájtonként van struktúrálva. Mivel az int 16 bit, ezért két bájton fér el. Ezt a két bájtot kell külön elraknod az EEPROMba, majd visszaolvasni, és összerakni integerré. Többféle megoldás is létezik erre, leírok neked hármat.
1 Bitműveletek
16 bites adat két bájtja:
uint16_t data = 1976;
uint8_t dataLowByte = (uint8_t) ((data) & 0xff);
uint8_t dataHighByte = (uint8_t) ((data) >> 8);
Ezután az alsó és a felső bájtot már könnyen kiírod.
Visszafelé pedig a fordítottja:
uint8_t dataLowByte = EEPROM.read(addressLow);
uint8_t dataHighByte = EEPROM.read(addressHigh);
uint16_t data = (dataHighByte << 8) | dataLowByte;
De az Arduinoban ezekre a gyakran használt műveletekre van makró is:
https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/lowbyte/
https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/highbyte/
https://www.arduino.cc/reference/en/language/variables/data-types/word/
2. union (Egy memóriaterület többféle értelmezése.)
union Data_t {
uint16_t data16;
uint8_t dataBytes[2];
}
Használata:
Data_t myData;
myData.data16 = 1979;
EEPROM.write(addressLow, dataBytes[0]);
EEPROM.write(addressHigh, dataBytes[1]);
3. Static cast (byte tömbként érelmezzük és használjuk a 16 bites elemekből álló tömböt az EEPROM műveletek során)
uint16_t data[16] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};
uint8_t *dataBytes = static_cast<uint8_t*>(static_cast<void*>(data));
//Írás:
for (int i = 0; i < 16 * 2; i++) {
EEPROM.write(startAddress + i, dataBytes[i]);
}
//Olvasás:
for (int i = 0; i < 16 * 2; i++) {
dataBytes[i] = EEPROM.read(startAddress + i);
}