Vargham Creative Commons License 2018.01.06 0 0 3317

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);

}

Előzmény: granov (3316)