Низкоуровневая запись в EEPROM на Си



Рассмотрим вариант низкоуровневой работы с EEPROM, то есть без использования встроенных макросов/функций компиляторов.

Процедура записи в EEPROM состоит из следующих шагов:

1. Ожидаем готовности EEPROM, опрашивая бит EEWE регистра EECR.

2. Устанавливаем адрес в регистре EEAR.

3. Записываем байт данных в регистр EEDR.

4. Устанавливаем основной флаг разрешения записи EEMWE регистра EECE.

5. Устанавливаем флаг разрешения записи EEWE регистра EECE.

Необходимо учитывать, что запись в EEPROM не может производиться одновременно с записью во флэш-память. Если в проекте микроконтроллер обращается к флэш-памяти, то перед записью данных в EEPROM, необходимо проверить флаг SPMEN регистра SPMCR. Он должен быть сброшен в ноль.

Также необходимо учесть, что флаг EEWE должен быть установлен в течение 4 циклов после флага EEMWE. Если в проекте используются прерывания, то на каком-то из этапов, этой последовательности, их нужно запрещать. Это можно сделать или в самом начале или перед установкой флага EEMWE.

В Си коде описанная последовательность будет выглядеть так:

while (EECR & (1<<EEWE));

EEAR = adr;

EEDR = value;

EECR |= (1<<EEMWE);

EECR |= (1<<EEWE);

где adr- это адрес байта в EEPROM, value - данные для записи, EEAR - 16-ти разрядный регистр адреса.

Использовать абсолютный адрес байтов EEPROM неудобно и чаще всего адрес берется у переменной, объявленной в EEPROM. Код в этом случае будет таким:

while (EECR & (1<<EEWE));

EEAR = (int) &data;

EEDR = value;

EECR |= (1<<EEMWE);

EECR |= (1<<EEWE);
где data - переменная объявленная в EEPROM, а & - оператор взятия адреса.

Низкоуровневое чтение из EEPROM на Си

Процедура чтения EEPROM состоит из следующих шагов:

1. Ожидаем готовность EEPROM, опрашивая бит EEWE регистра EECR.

2. Устанавливаем адрес в регистре EEAR.

4. Устанавливаем флаг разрешения чтения EERE регистра EECR.

5. Считываем содержимое регистра данных EEDR.

На Си описанная последовательность будет выглядеть так:

while (EECR & (1<<EEWE));

EEAR = adr;

EECR |= (1<<EERE);

value = EEDR;

Доступ к объявленной в EEPROM переменной:

while (EECR & (1<<EEWE));

EEAR = (int) &data;

EECR |= (1<<EERE);

value = EEDR;

 

 

Упражнение 1.

Задача. К выводу 0 порта B микроконтроллера ATmega32 подключен светодиод. Написать программу мигания светодиода с задержкой 250 мс и запустить программу на отладку в AVR Studio. Рабочая частота МК 4 МГц.

Создать новый проект в среде программирования Code Vision AVR.

Рис. 1.9. Создание проекта в Code Vision AVR

Воспользоваться Code Wizard AVR для автоматической генерации кода.

Рис. 1.10. Использовать мастер генерации кода

Рис. 1.11. Тип МК – ATmega

 

 

Указать мастеру устройство ATmega32.

Рис. 1.12. Выбор чипа МК

Вывод 0 порта B определить как Output.

Рис. 1.13. Конфигурация порта В

Сгенерировать данные настройки.

Рис. 1.14. Генерация настроек

Сохраняем сгенерированные файлы: <Name>.c, <Name>.prj, <Name>.cwp

Рис. 1.15. Сохранение *.c файла

Рис. 1.16. Сохранение *.prj файла

Рис. 1.17. Сохранение *.cwp файла

В появившемся сгенерированном коде добавить подключение библиотеки прерываний, то есть дописать строку #include <delay.h>.

 В бесконечном цикле добавить строки:

     PORTB.0 = 1;

     delay_ms(250);

     PORTB.0 = 0;

     delay_ms(250);

Скомпилировать проект, нажав кнопку  – Build all project files.

Если нет ошибок, то запустить отладку, нажав кнопку  – Run the debugger.

В открывшемся окне AVR Studio 4, нажать кнопку “Open”. В нужной директории выбрать файл с расширением .COFF. Затем появится окно, в котором будет предложено сохранить файл отладки с именем <Имя_файла>_cof. Нажать кнопку «Сохранить».

Далее, будет предложено выбрать отладочную платформу и устройство. Выбрать AVRSimulator и ATmega32 соответственно. Нажать кнопку “Finish”.


Дата добавления: 2018-11-24; просмотров: 278; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!