вторник, 19 марта 2013 г.

Работа с EEPROM в C++

Прежде чем приступать к программированию EEPROM, рекомендую ознакомиться со следующей информацией:
Основные команды для работы с EEPROM:
  • #include <avr/eeprom.h> - подключение библиотеки для работы с EEPROM
  • eeprom_read_byte(адрес) - функция чтения одного байта из EEPROM
  • eeprom_write_byte(адрес, данные) - функция записи одного байта в EEPROM
Предлагаю написать программу, которая при запуске микроконтроллера записывала бы 8 различных байтов данных в EEPROM, а затем в цикле считывала их и выводила на светодиоды, подключенные к порту D, с задержкой 100 мс. Для работы с EEPROM необходимо сначала подключить библиотеку eeprom.h, но можно и самому написать функции чтения и записи.

#include <avr/io.h> //подключение стандартной библиотеки ввода/вывода
#define F_CPU 8000000UL //определение тактовой частоты микроконтроллера для корректной работы функций задержки
#include <util/delay.h> //подключение библиотеки для генерации задержек
#include <avr/eeprom.h> //подключение библиотеки работы с EEPROM

int main(void)
{
DDRD=0xFF; //порт D работает как выход
eeprom_write_byte((uint8_t*)0,0x81); //запись байта 0x81 по адресу 0
eeprom_write_byte((uint8_t*)1,0xC3); //запись байта 0xC3 по адресу 1
eeprom_write_byte((uint8_t*)2,0xE7); //запись байта 0xE7 по адресу 2
eeprom_write_byte((uint8_t*)3,0x7E); //запись байта 0x7E по адресу 3
eeprom_write_byte((uint8_t*)4,0x3C); //запись байта 0x3C по адресу 4
eeprom_write_byte((uint8_t*)5,0x18); //запись байта 0x18 по адресу 5
eeprom_write_byte((uint8_t*)6,0x00); //запись байта 0x00 по адресу 6

while(1) //бесконечный цикл (основная программа)
{
for (int i=0;i<7;i++) //цикл чтения байтов с адресами от 0 до 6
{
PORTD = eeprom_read_byte((uint8_t*)i); //чтение байта данных по адресу i и запись значения в порт D
_delay_ms(100); //задержка 100 мс
}
}
}
Рисунок 1 - Схема подключения

Также в библиотеке eeprom.h есть функции проверки готовности EEPROM - eeprom_is_ready() и функции чтения/записи слова (16 бит), двойного слова (32 бит), значения с плавающей точкой (32 бит), а также блока данных:
  • eeprom_read_word(адрес, данные)
  • eeprom_write_word(адрес)
  • eeprom_read_dword(адрес, данные)
  • eeprom_write_dword(адрес)
  • eeprom_read_float(адрес, данные)
  • eeprom_write_float(адрес)
  • eeprom_read_block(адрес, данные, длина блока)
  • eeprom_write_block(адрес, длина блока)