ATtiny2313 EEPROM

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 секунда.

Добавить комментарий

Войти с помощью: