Чтение и запись EEPROM в WinAVR. Продолжение

Просмотров: 19336Комментарии: 1
Электроника. СхемотехникаAVR.Начинающим


В предыдущей статье мы пробовали записывать и читать память 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;

Затем для чтения и записи этой переменной поступаем так:

long int ilongVar;
ilongVar=3675;
eeprom_write_dword(&eelongVar, ilongVar);//запись переменной
ilongVar=eeprom_read_dword(&eelongVar);//чтение переменной

Т.е. аргументами функции eeprom_write_dword служат адрес в EEPROM куда записать и значение, которое нужно записать. Для функции eeprom_read_dword достаточно только адреса в EEPROM откуда считать переменную.

Чтение/запись блоков (массивов)
Теперь поработаем с массивами данных. Для работы с массивами предусмотрены функции eeprom_read_block и eeprom_write_block. Объявим в EEPROM массивы переменных разных типов

char eeCharArray[] EEMEM ={1,2,3};
int eeIntArray[] EEMEM={1,2,3,4};
long int eeLongArray[] EEMEM={12,34};

А теперь будем записывать значения в эти массивы и читать их:

char CharArray[3];
int IntArray[4];
long int LongArray[2];
eeprom_read_block(&CharArray[0], &eeCharArray[0], sizeof(CharArray));//чтение блока
eeprom_read_block(&IntArray[0], &eeIntArray[0], sizeof(IntArray));
eeprom_read_block(&LongArray[0], &eeLongArray[0], sizeof(LongArray));
eeprom_write_block(&CharArray[0], &eeCharArray[0], sizeof(CharArray));//запись блока
eeprom_write_block(&IntArray[0], &eeIntArray[0], sizeof(IntArray));
eeprom_write_block(&LongArray[0], &eeLongArray[0], sizeof(LongArray));

Тоже самое

eeprom_read_block(CharArray, eeCharArray, sizeof(CharArray));//чтение блока
eeprom_read_block(IntArray, eeIntArray, sizeof(IntArray));
eeprom_read_block(LongArray, eeLongArray, sizeof(LongArray));
eeprom_write_block(CharArray, eeCharArray, sizeof(CharArray));//запись блока
eeprom_write_block(IntArray, eeIntArray, sizeof(IntArray));
eeprom_write_block(LongArray, eeLongArray, sizeof(LongArray));

Т.е. при чтении блока данных аргументами функций служат адрес массива в который нужно записать, адрес откуда  записать и размер блока. При записи - адрес массива с которого записать данные, адрес массива в который записать и количество элементов. Как видно для работы с массивами переменных разных типов служит одна функция. Если мы хотим записать какую-то одну переменную массива, тогда мы просто используем функции для чтения/записи переменной соответствующего типа и передаем адрес элемента массива, который хотим изменить. Например, для переменной типа char хотим изменить 3-й элемент массива

eeprom_write_byte(&eeCharArray[2], 12);//2 - т.к. нумерация с 0

Также точно для переменной другого типа. Если мы хотим изменить несколько элементов массива, тогда начальный адрес записи указываем тот, с которого хотим начать запись и количество записываемых элементов. Например, хотим изменить 2й и 3й элемент массива eeIntArray

int Arr[2]={24,34};
eeprom_write_block(Arr, &eeIntArray[1], sizeof(Arr));

Также, как запись можем и читать отдельные элементы массива и куски массива.

Чтение/Запись float
Есть в файле eeprom.h функции eeprom_read_float и eeprom_write_float. Но, честно говоря, я их когда то попробовал, у меня не получилось, и после этого больше не использую. Для записи переменной типа float можно поступить двумя способами:
  1. Если мы знаем сколько знаков после запятой мы хотим оставить,тогда умножаем наше число на (10*число_знаков_после_запятой) и сохраняем как, например, long int. Это при условии, что это число влезет в long int.
  2. Сохраняем отдельно целую часть и дробную. Можно блоком (например, первый элемент - целая часть, второй - дробная), а можно отдельными переменными.
В общем-то, используя какой-нибудь из методов описанных выше можно писать и читать переменные любых типов в EEPROM.

Комментариев: 1 RSS

1 Илья Емельянов 20-11-2013 15:17

Спасибо. Все кратко, ясно, понятно.

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)