тип данных EEPROM

IUS
Offline
Зарегистрирован: 15.01.2015

Не могу понять какой тип данных у EEPROM.

У меня данные для хранения int- 2 байта, меньше не могу, а у ПЗУ я так нонимаю 1 байт,  что делать, или записывать их в 2 ячейки, то как это съделать коректно? 

заранее спасибо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да как угодно, лишь бы байты записывались в том же порядке, в каком потом читаются. Ну, если по рабоче-крестьянски (без union там), то хоть так:

int a = 321;
unsigned char * pLowByte = (char *) &a;
unsigned char * pHighByte = pLowByte + 1;

Теперь спокойно пишите туда *pLowByte и *pHighByte.

Только непонятно, зачем такое извращение, когда функция EEPROM.put вполне может записать туда любой тип данных хоть int, хоть float, хоть даже произвольную структуру или класс.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

Только непонятно, зачем такое извращение, когда функция EEPROM.put вполне может записать туда любой тип данных хоть int, хоть float, хоть даже произвольную структуру или класс.

Ну, как бы EERPOM бывает не только на кристалле Атмеги. И не все библиотеки допускают обмен данными отличающимися от байта.

Другое дело, что при записи с этим нужно быть предельно осторожным, т.к. бывает, что интервал времени между двумя последовательными записями не должен быть меньше 5000 мкс. При несоблюдении интервала данные просто теряются. А библиотека Wire это никак не отслеживает (хотя, могла бы).

IUS
Offline
Зарегистрирован: 15.01.2015

не совсе понял,  тоесть применяя EEPROM.put и get компилятор сам будет выделять нужное кол- во байт?

или мне всё равно нужно учитывать длину данных и обращаться к ним с начальным адресом? тоесть если в EEPROM(0) храница первый INT, то ко второму я обращаюсь по адресу EEPROM(2).

Radjah
Offline
Зарегистрирован: 06.08.2014

Вот что за мания такая на каждый новый вопрос по одной тематике создавать новую тему на форуме? o_0

Timur007
Offline
Зарегистрирован: 17.05.2015

Используй библиотеку 

EEPROMex с оф сайта. Можешь записывать хоть double. Она сама все раскидает так как надо

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

IUS пишет:

не совсе понял,  тоесть применяя EEPROM.put и get компилятор сам будет выделять нужное кол- во байт?

или мне всё равно нужно учитывать длину данных и обращаться к ним с начальным адресом? тоесть если в EEPROM(0) храница первый INT, то ко второму я обращаюсь по адресу EEPROM(2).

Да, сам будет выбирать. get и put - шаблоны, и разворачиваются они в обыкновенный цикл чтения/записи по 1 байту от 0 до < sizeof(<используемый тип>).

Разумеется, если писать следующее что-то, адрес надо поменять на sizeof(<используемый тип>), т.е. для int - на 2.

Это просто упрощалка - есть у Вас структура myS на 43 байта, напишите EEPROM.put(myS) он все 43 байта и зафигачит.

Вот тексты put и get из стандартной поставки Arduino IDE

    //Functionality to 'get' and 'put' objects to and from EEPROM.
    template< typename T > T &get( int idx, T &t ){
        EEPtr e = idx;
        uint8_t *ptr = (uint8_t*) &t;
        for( int count = sizeof(T) ; count ; --count, ++e )  *ptr++ = *e;
        return t;
    }
    
    template< typename T > const T &put( int idx, const T &t ){
        EEPtr e = idx;
        const uint8_t *ptr = (const uint8_t*) &t;
        for( int count = sizeof(T) ; count ; --count, ++e )  (*e).update( *ptr++ );
        return t;
    }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

Ну, как бы EERPOM бывает не только на кристалле Атмеги. И не все библиотеки допускают обмен данными отличающимися от байта.

Так они реально в побайтовый обмен разворачиваются (см. тексты в моём посте чуть выше).

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

EEPROM делится на страницы.

И из-за этого с записью туда намного сложнее, чем со считыванием.

И "побайтно" мы будем писать в темпе 50 long в секунду.

Это если писать правильно. А если неправильно (не выдерживая пауз), то записанным окажется только первый байт.