Мы не выдаем Китай за Италию. Платы от российского производителя по сниженным ценам.

Новинки: Power DC Shield, Светодиодная лента, Freeduino Mini, модули USB Host, Relay.

Arduino-совместимые платы имеют небольшое ПЗУ (EEPROM), размер которого зависит от используемого микроконтроллера. Для ATmega168 это 512 байт, для ATmega328 – 1024 байта.

Библиотека EEPROM

Для работы с EEPROM существует стандартная библиотека EEPROM, позволяющая записать байт в EEPROM по нужному адресу, и прочесть его оттуда.

Рассмотрим простой пример. Пусть в самом первом байте EEPROM (по адресу 0) хранится счетчик числа сбросов микроконтроллера. При каждом сбросе будет вызываться функция setup(), в которой мы будем считывать счетчик, увеличивать его на единицу и записывать обратно. Также, чтобы увидеть значение счетчика в мониторе последовательного порта, будем выводить число туда.

#include <EEPROM.h>
//подключаем заголовочный файл библиотеки EEPROM

void setup()
{
  uint8_t counter; //Здесь будем хранить счетчик
  //uint8_t - тип данных, занимающий 1 байт,
  //и хранящий значение от 0 до 255

  //Инициализируем последовательный порт на 9600бит/сек:
  Serial.begin(9600);

  //Читаем счетчик из EEPROM:
  counter = EEPROM.read(0);

  counter++;  // увеличиваем его на единицу

  //Записываем значение счетчика
  EEPROM.write(0, counter);

  //Выводим счетчик в порт:
  Serial.print("It's reset #");
  Serial.println(counter, DEC);
}

void loop()
{
}

Поэкспериментируйте с программой, и убедитесь, что значение счетчика сохраняется и после пропадания питания. Фирма ATMEL – производитель микроконтроллеров ATmega, декларирует порядка 100’000 (ста тысяч) успешных циклов записи в EEPROM и хранение данных до 100 лет при температуре 25 градусов по Цельсию.

Библиотека EEPROM2

Рассмотренная программа имеет один недостаток, связанный с тем, что для хранения счетчика используется всего один байт. После достижения счетчиком значения 255 следующее увеличение даст значение 0, из-за переполнения разрядной сетки.

Таким образом, требуется применение счетчика большего размера – 2 байта дадут верхнюю границу в 65’535, а 4 байта – 4’294’967’295.

Стандартная библиотека имеет функции только для работы с однобайтными данными типа uint8_t, и чтение 4-байтного числа будет выглядеть примерно так:

  *((uint8_t*)&counter + 0) = EEPROM.read(0);
  *((uint8_t*)&counter + 1) = EEPROM.read(1);
  *((uint8_t*)&counter + 2) = EEPROM.read(2);
  *((uint8_t*)&counter + 3) = EEPROM.read(3);

Такой исходный код, конечно, будет понятен компилятору, но далеко не каждому начинающему программисту, и поэтому мы написали свою версию библиотеки для работы с EEPOM:

http://www.freeduino.ru/arduino/files/EEPROM2.zip

Как и в большинстве случаев, установка библиотеки сводится к распаковке архива в подпапку \hardware\libraries\ папки с ПО Arduino.

Теперь рассмотрим аналогичную первому примеру программу, хранящую счетчик в 4-байтном числе с помощью библиотеки EEPROM2:

#include <EEPROM2.h>
//подключаем заголовочный файл библиотеки EEPROM2

void setup()
{
  unsigned long counter; //Здесь будем хранить счетчик
  //unsigned long - тип данных, занимающий 4 байта,
  //и хранящий значение от 0 до 4'294'967'295

  //следующие 2 строчки нужны только при первом запуске,
  //чтобы обнулить значение счетчика:
  counter = 0;  
  EEPROM_write(0, counter);

  //Инициализируем последовательный порт на 9600бит/сек:
  Serial.begin(9600);

  //Читаем счетчик из EEPROM:
  EEPROM_read(0, counter);

  counter++;  // увеличиваем его на единицу

  //Записываем значение счетчика
  EEPROM_write(0, counter);

  //Выводим счетчик в порт:
  Serial.print("It's reset #");
  Serial.println(counter, DEC);
}

void loop()
{
}

Загрузите программу в микроконтроллер, удалите строчки, обнуляющие счетчик, и загрузите программу еще раз.

Комментариев в исходном коде вполне достаточно для понимания программы, а синтаксис работы с библиотекой отличается от оригинальной незначительно.

Работа с EEPROM через boot-loader

Процесс старта Arduino-совместимой платы начинается со старта загрузчика, часто называемого boot-loader. Он занимает последние 2 К памяти программ (начиная с UNO - 512 байт), и именно из-за него Ваши проекты ограничены размером 14 К для ATmega168 и 30 K для ATmega328, при объеме памяти программ у микроконтроллеров 16 К и 32 К соответственно.

После старта загрузчик некоторое время ожидает, что управляющий ПК начнет передачу новой программы, и если этот процесс начинается, то именно загрузчик и «прошивает» Вашу программу в микроконтроллер. Если загрузка программы не началась, то загрузчик передает управление на ранее загруженную Вами в микроконтроллер программу, в результате чего выполняется функция setup(), а затем в бесконечном цикле функция loop().

Кстати, именно загрузчик мигает светодиодом на 13 выводе при сбросе микроконтроллера.

При обмене данными с ПК загрузчик использует протокол stk500v1, и может работать, в том числе и с EEPROM.

Для чтения содержимого EEPROM в файл "0.bin" необходимо в командной строке

  • Перейти в подпапку \hardware\tools\avr\bin\ папки с ПО Arduino;
  • Выполнить команду (в одну строку):

avrdude -q -C ..\etc\avrdude.conf -p m168 -c stk500v1 -P COM3 -b 19200 -U eeprom:r:0.bin:r

Для записи содержимого файла 0.bin в EEPROM команда такая:

avrdude -q -C ..\etc\avrdude.conf -p m168 -c stk500v1 -P COM3 -b 19200 -U eeprom:w:0.bin

Параметр «COM3» нужно заменить на Ваш номер порта.