ATtiny2313 содержит 128 Байт EEPROM (ППЗУ)-памяти. Эта память организована как отдельное пространство данных, каждый один байт может быть прочитан и записан. EEPROM (ППЗУ) может быть записана и стерта в сумме как минимум 100 000 раз.
Запись и чтение EEPROM осуществляется при помощи следующих регистров:
EEAR — регистр адреса EEPROM
EEPROM ATtiny2313 содержит 128 байт.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
— | EEAR6 | EEAR5 | EEAR4 | EEAR3 | EEAR2 | EEAR1 | EEAR0 |
EEAR0…6 — адреса EEPROM (0…127)
Пример использования:
EEAR = 0; // адрес ячейки памяти EEPROM = 0
EEDR — регистр данных EEPROM
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EEDR[7:0] |
Регистр данных EEDR должен содержать данные, которые будут записываться в EEPROM, по адресу определенному в регистре адреса EEAR.
Пример использования:
EEDR = 123;
EEСR — регистр управления EEPROM
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
— | — | EEPM1 | EEPM0 | EERIE | EEMPE | EEPE | EERE |
Биты EEPM1 и EEPM0 определяют какое действие выполнит программа, когда в бит EEPE будет загружена 1. Это позволяет программировать данные в автоматическом режиме (стирание старых данных и записывание новых данных) или выполнять от отдельно операции стирания и записи.
EEPM[1:0] | Время исполнения | Операция |
00 | 3,4 мс | стирание и запись за одну операция (автоматический выбор) |
01 | 1,8 мс | только стирание |
10 | 1,8 мс | только запись |
11 | — | — |
Бит EERIE — прерывание EEPROM по состоянию «готово к записи» . В бит EERIE нужно записать 1, чтобы разрешить прерывание и переход к вектору EE READY (EE_READY_vect — прерывание по готовности памяти EEPROM).
Бит EEMPE — разрешение записи данных в EEPROM по заданному адресу.
Бит EEPE исполнения записи в EEPROM. Бит EEMPE должен уже содержать единицу еще до того, как единица будет записана в бит EEPE, иначе запись EEPROM не будет осуществлена.
Бит EERE разрешение чтения данных из EEPROM по указанному адресу.
Функции записи и чтения EEPROM
unsigned char EEPROM_read(unsigned int uiAddress){ while(EECR & (1<<EEPE)); // проверка готовности EEPROM EEAR = uiAddress; // регистр адреса EECR |= (1<<EERE);// чтение EEPROM return EEDR; // вывод значения } void EEPROM_write(unsigned int uiAddress, unsigned char ucData){ while(EECR & (1<<EEPE)); // проверка готовности EEPROM EEAR = uiAddress; // регистр адреса EEDR = ucData; // регистр данных EECR |= (1<<EEMPE);// Разрешение записи в EEPROM EECR |= (1<<EEPE); // Запись в EEPROM }
Пример:
void setup() { DDRB |= (1 << 0); // PB0 выход EEPROM_write(0,14);// запись число 123 по адресу 0 в EEPROM } void loop() { if( EEPROM_read(0) == 14 ) {PORTB |= (1 << 0);} // если результат чтения адреса EEPROM равен 123, зажечь светодиод, delay(1000); PORTB &= ~(1 << 0);// погасить светодиод delay(1000); } unsigned char EEPROM_read(unsigned int uiAddress){ while(EECR & (1<<EEPE)); // проверка готовности EEPROM EEAR = uiAddress; // регистр адреса EECR |= (1<<EERE);// чтение EEPROM return EEDR; // вывод значения } void EEPROM_write(unsigned int uiAddress, unsigned char ucData){ while(EECR & (1<<EEPE)); // проверка готовности EEPROM EEAR = uiAddress; // регистр адреса EEDR = ucData; // регистр данных EECR |= (1<<EEMPE);// Разрешение записи в EEPROM EECR |= (1<<EEPE); // Запись в EEPROM }
Светодиод подключен к выходу PB0, в секции setup() осуществляется запись числа 14 в 0 ячейку памяти EEPROM, в цикле loop() осуществляется чтение адреса 0 EEPROM, если данные записи и чтения идентичные, то светодиод начинает мигать с интервалом 1 секунда.