Samou4ka » 🐞 AVR.Начинающим » Чтение и запись EEPROM в WinAVR. Продолжение

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

См. начало — Чтение и запись EEPROM в WinAVR

В предыдущей статье мы пробовали записывать и читать память EEPROM микроконтроллеров AVR используя функции WinAVR. Тогда мы работали с байтами и словами (тоже самое — char и int). А что если мы хотим записать long int, массив переменных (опять же char, int, long int) или float? Давайте разберем все по порядку.

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

Чтение/запись 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
0
+1
0
+1
0
+1
0
+1
0
+1
0
Расскажите друзьям:
Оцените статью:

Один комметарий

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