См. начало — Чтение и запись EEPROM в WinAVR
В предыдущей статье мы пробовали записывать и читать память EEPROM микроконтроллеров AVR используя функции WinAVR. Тогда мы работали с байтами и словами (тоже самое — char и int). А что если мы хотим записать long int, массив переменных (опять же char, int, long int) или float? Давайте разберем все по порядку.
Чтение/запись dword (long int)
Итак, переменная типа long int (размер переменной в WinAVR — 4 байта). Для чтения и записи переменной этого типа в файле eeprom.h есть функции — eeprom_read_dword, eeprom_write_dword.
Вначале объявляем переменную этого типа в EEPROM (не забываем подключить eeprom.h).
long int eelongVar EEMEM=0;
Затем для чтения и записи этой переменной поступаем так:
Т.е. аргументами функции eeprom_write_dword служат адрес в EEPROM куда записать и значение, которое нужно записать. Для функции eeprom_read_dword достаточно только адреса в EEPROM откуда считать переменную.
Чтение/запись блоков (массивов)
Теперь поработаем с массивами данных. Для работы с массивами предусмотрены функции eeprom_read_block и eeprom_write_block. Объявим в EEPROM массивы переменных разных типов
А теперь будем записывать значения в эти массивы и читать их:
Тоже самое
Т.е. при чтении блока данных аргументами функций служат адрес массива в который нужно записать, адрес откуда записать и размер блока. При записи — адрес массива с которого записать данные, адрес массива в который записать и количество элементов. Как видно для работы с массивами переменных разных типов служит одна функция. Если мы хотим записать какую-то одну переменную массива, тогда мы просто используем функции для чтения/записи переменной соответствующего типа и передаем адрес элемента массива, который хотим изменить. Например, для переменной типа char хотим изменить 3-й элемент массива
eeprom_write_byte(&eeCharArray[2], 12);//2 — т.к. нумерация с 0
Также точно для переменной другого типа. Если мы хотим изменить несколько элементов массива, тогда начальный адрес записи указываем тот, с которого хотим начать запись и количество записываемых элементов. Например, хотим изменить 2й и 3й элемент массива eeIntArray
Также, как запись можем и читать отдельные элементы массива и куски массива.
Чтение/Запись float
Есть в файле eeprom.h функции eeprom_read_float и eeprom_write_float. Но, честно говоря, я их когда то попробовал, у меня не получилось, и после этого больше не использую. Для записи переменной типа float можно поступить двумя способами:
- Если мы знаем сколько знаков после запятой мы хотим оставить, тогда умножаем наше число на (10*число_знаков_после_запятой) и сохраняем как, например, long int. Это при условии, что это число влезет в long int.
- Сохраняем отдельно целую часть и дробную. Можно блоком (например, первый элемент — целая часть, второй — дробная), а можно отдельными переменными.
В общем-то, используя какой-нибудь из методов описанных выше можно писать и читать переменные любых типов в EEPROM.
Спасибо. Все кратко, ясно, понятно.