Хелпикс

Главная

Контакты

Случайная статья





Пам’ять даних EEPROM



Пам’ять даних EEPROM (Electrically Erasable Programmable Read-Only Memory – постійна пам’ять з перепрограмуванням і з електричним стиранням) мікроконтролера ATmega8 містить 512 байт. Пам’ять EEPROM є енергонезалежною і дані в ній зберігаються після вимкнення живлення. Вона організована як окремий адресний простір (0x000... 0x1FF), в якому кожен окремий байт доступний для запису та зчитування. Пам’ять EEPROM розрахована щонайменше на100000 циклів запису/стирання. Обмін даними між EEPROM та ЦП описаний нижче і здійснюється за допомогою трьох регістрів: адресного регістру EEAR, регістру даних EEDR та регістру керування EECR, які знаходяться в адресному просторі регістрів В/В.

Запис одного байту в пам’ять EEPROM триває набагато більше часу, ніж в пам’ять даних SRAM (8, 5 мс при тактовій частоті 1 МГц). Зчитування байту з пам’яті EEPROM здійснюється практично одразу. Звідси випливає основна особливість роботи з EEPROM – для того, щоб записати наступний байт, або зчитати байт з пам’яті EEPROM, необхідно дочекатись закінчення запису попереднього байту.

Розглянемо регістри, які забезпечують запис/зчитування пам’яті EEPROM. В адресний регістр EEAR (EEPROM Address Register) необхідно записати адресу байту для запису або зчитування. Оскільки об’єм EEPROM в ATmega8 складає 512 байт, для адресації недостатньо одного 8-розрядного регістру (треба 9 розрядів), тому адресний регістр EEAR є 16-розрядним і складається з молодшої та старшої частини EEARL та EEARH відповідно.

В 8-розрядний регістр даних EEDR (EEPROM Data Register) треба занести байт, який буде записаний в EEPROM, а також в цьому регістрі буде прочитаний з EEPROM байт після закінчення операції зчитування.

Регістр керування EECR (EEPROM Control Register) містить біти, які керують операціями запису/зчитування EEPROM:

 

 

Біт EERIE(EEPROM Ready Interrupt Enable) – це біт дозволу переривання готовності EEPROM. Встановлення в одиницю цього біту дозволяє переривання готовності EEPROM, якщо встановлено І-біт в SREG. Скидання біту EERIE забороняє дане переривання. При скинутому біті EEWE переривання готовності EEPROM генерується постійно.

Біт EEMWE: майстер-дозвіл на запис в EEPROM (EEPROM Master Write Enable). Біт EEMWE визначає, чи буде здійснюватись запис в EEPROM при встановленні біту EEWE. Якщо біт EEMWE встановлено, встановлення біту EEWE протягом чотирьох системних тактів викликає запис даних в EEPROM за визначеною адресою.

Якщо біт EEMWE скинуто, встановлення біту EEWE ігнорується. Якщо біт EEMWE встановлюється програмно, МК скидає цей біт після чотирьох системних тактів, див. опис біту EEWE нижче.

Біт EEWE: дозвіл на запис в EEPROM (EEPROM Write Enable). Біт EEWE – це строб-біт запису даних в EEPROM. Коли в регістр EEAR занесена адреса для запису, а в регістр EEDR занесений байт для запису, встановленням біту EEWE власне здійснюється (точніше, ініціюється) запис вказаного байту за вказаною адресою. Перед встановленням біту EEWE повинен бути встановлений біт майстер-дозволу EEMWE, інакше запис в EEPROM не відбудеться. Для запису в EEPROM повинні бути послідовно виконані наступні операції (виконання кроків 3 та 4 не є обов’язковим):

1) Очікування, поки біт EEWE матиме нульове значення

2) Очікування, поки біт SPMEN в регістрі SPMCR матиме нульове значення (тільки якщо передбачено запис в пам’ять програм)

3) Записати нову адресу в регістр EEAR (опціально)

4) Записати нові дані в регістр EEDR (опціально)

5) Записати лог. 1 в біт EEMWE при нульовому значенні біту EEWE в EECR

6) Протягом чотирьох системних тактів після встановлення біту EEMWE записати лог. 1 в біт EEWE

Пам’ять EEPROM не може бути програмована під час програмування Flash-пам’яті. Програма повинна перевірити, чи закінчено програмування flash-пам’яті перед ініціюванням нового запису в EEPROM. Крок 2 є необхідним, лише коли ЦП здійснює програмування flash-пам’яті через програмний завантажувач (boot loader). Якщо обновлення вмісту flash-пам’яті не передбачається, крок 2 може бути пропущений.

Увага: Переривання між кроками 5 та 6 призведе до зриву процедури запису, оскільки буде мати місце тайм-аут, адже біт EEWE повинен бути встановлений протягом 4-х системних тактів після встановлення біту EEMWE. Якщо підпрограма запису до EEPROM по перериванню переривається іншим перериванням доступу до EEPROM, регістри EEAR, EEDR буде модифіковано новими значеннями, внаслідок чого триваюча операція запису буде невдалою. Рекомендується скидати І-біт глобального дозволу переривань протягом виконання усього циклу операцій запису в EEPROM для запобігання даній ситуації.

Коли час, відведений на запис, спливає, біт EEWE апаратно скидається. Програма користувача може опитувати цей біт, очікуючи на його нульове значення, для здійснення запису наступного байту. Після встановлення біту EEWE центральний процесор призупиняється на два системних такти перед виконанням наступної команди.

Біт EERE: Дозвіл на зчитування з EEPROM (EEPROM Read Enable). Біт EERE є строб-бітом при зчитуванні даних з EEPROM. Після того, як в регістрі EEAR встановлено коректну адресу, біт EERE повинен бути встановлений для початку операції зчитування. Зчитані дані є доступними практично одразу. При зчитуванні даних з EEPROM центральний процесор призупиняється на тривалість чотирьох системних тактів перед виконанням наступної команди. Користувач повинен опитувати біт EEWE перед початком операції читання. Якщо триває операція запису, неприпустимим є ані зчитувати дані з EEPROM, ані змінювати значення в регістрі EEAR.

Приклад функції на С для запису в EEPROM можна знайти в даташиті на МК.

 

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)

{

while(EECR & (1< < EEWE)); //ждем установки бита EEWE

EEAR = uiAddress; //устанавливаем адрес

EEDR = ucData; //записываем байт данных

EECR |= (1< < EEMWE); //устанавливаем EEMWE

EECR |= (1< < EEWE); //устанавливаем EEWE

}

 

Читання проводиться практично так само.

1. Чекаємо поки біт EEWE скинеться.

2. Записуємо адреса в EEAR, за яким будемо зчитувати байт.

3. Встановлюємо біт EERE

4. Тепер регістр EEDR містить зчитаний байт

Приклад функції з того ж даташита

 

unsigned char EEPROM_read(unsigned int uiAddress)

{

while(EECR & (1< < EEWE)); //ждем установки EEWE

EEAR = uiAddress; //устанавливаем адрес чтения

EECR |= (1< < EERE); //разрешаем чтение

return EEDR; //возвращаем прочитанный байт из функции

}

 

У середовищі CodeVisionAVR є стандартна бібліотека для роботи з EEPROM яка включається підключенням файлу #include < eeprom. h>. Основними функціями є eeprom_read_byte (), eeprom_write_byte (), eeprom_read_word (), eeprom_write_word ().

 

Приклад:

char temp, ph; //змінна в RAM

eeprom my_eeprom1; //змінна в EEPROM

eeprom my_eeprom2 @0x01; //змінна в EEPROM по адресу 0x01

eeprom int my_eeprom3 = 5; //змінній в EEPROM поміститься значення 5

 

eeprom_write_byte(& my_eeprom1, ph);

temp = eeprom_read_byte(& my_eeprom1);



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.