Низкоуровневая запись в 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!