ATmega328
ATmega328 содержит 1024 Байт EEPROM (ППЗУ)-памяти. Эта память организована как отдельное пространство данных, каждый один байт может быть прочитан и записан. EEPROM (ППЗУ) может быть записана и стерта в сумме как минимум 100 000 раз.
Запись и чтение EEPROM осуществляется при помощи следующих регистров:
EEARL и EEARH — младший и старший регистры адреса EEPROM
Так адресное пространство EEPROM содержит 1024 адресов (0…1023), то за адреса отвечают два регистра адреса (10 бит)
EEARL
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EEAR7 | EEAR6 | EEAR5 | EEAR4 | EEAR3 | EEAR2 | EEAR1 | EEAR0 |
EEARH
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EEAR9 | EEAR8 |
Например если необходимо использовать адрес EEPROM под номером 836 (0B1101000100), то в регистры адреса будут иметь следующие значения:
EEARH = 11
EEARL = 01000100
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 EEARH = ((uiAddress & 0xF0) << 2); // регистр адреса H EEARL = uiAddress & 0x0F; // регистр адреса L EECR |= (1<<EERE);// чтение EEPROM return EEDR; // вывод значения } void EEPROM_write(unsigned int uiAddress, unsigned char ucData){ while(EECR & (1<<EEPE)); // проверка готовности EEPROM EEARH = ((uiAddress & 0xF0) << 2); // регистр адреса H EEARL = uiAddress & 0x0F; // регистр адреса L EEDR = ucData; // регистр данных EECR |= (1<<EEMPE);// Разрешение записи в EEPROM EECR |= (1<<EEPE); // Запись в EEPROM }
Пример:
void setup() { Serial.begin(9600); EEPROM_write(812,123);// запись число 123 по адресу 812 в EEPROM } void loop() { Serial.println(EEPROM_read(812));// считываем содержимое адреса EEPROM 812 и выводим в монитор порта delay(1000); } unsigned char EEPROM_read(unsigned int uiAddress){ while(EECR & (1<<EEPE)); // проверка готовности EEPROM EEARH = ((uiAddress & 0xF0) << 2); // регистр адреса H EEARL = uiAddress & 0x0F; // регистр адреса L EECR |= (1<<EERE);// чтение EEPROM return EEDR; // вывод значения } void EEPROM_write(unsigned int uiAddress, unsigned char ucData){ while(EECR & (1<<EEPE)); // проверка готовности EEPROM EEARH = ((uiAddress & 0xF0) << 2); // регистр адреса H EEARL = uiAddress & 0x0F; // регистр адреса L EEDR = ucData; // регистр данных EECR |= (1<<EEMPE);// Разрешение записи в EEPROM EECR |= (1<<EEPE); // Запись в EEPROM }