Программирование МК Тема 7 Тесты PDF
Document Details
Uploaded by SwiftBoltzmann248
Tags
Related
- Лекция 8. Функциональное и объектное программирование в Javascript.pdf
- Python за 7 дней: Краткий курс для начинающих PDF
- Задание 1. Информатика 2 задание Зебо PDF
- Программирование на языке Python (Учебное пособие, 2022) PDF
- Объектно-ориентированное программирование (ООП)
- Программирование МК Тема 7 тесты PDF
Summary
Этот документ описывает работу с памятью EEPROM на примере микроконтроллера ATmega16. В нем рассмотрены схемы подключения, функции записи и чтения, а также примеры кода на C. Ключевые слова: программирование микроконтроллеров, ATmega16, EEPROM.
Full Transcript
Работа с памятью Описание задачи Рассмотрим использование функций записи и чтения памяти EEPROM на примере следующей задачи. Пусть к входам PD0 и PD1 микроконтроллера ATmega16 подключены тактовые кнопки. К выходам PC0-PC7 подключен семисегментный индикатор. На индикатор постоянно выводи...
Работа с памятью Описание задачи Рассмотрим использование функций записи и чтения памяти EEPROM на примере следующей задачи. Пусть к входам PD0 и PD1 микроконтроллера ATmega16 подключены тактовые кнопки. К выходам PC0-PC7 подключен семисегментный индикатор. На индикатор постоянно выводится значение переменной, считанной из области памяти EEPROM. По нажатию кнопки на ножке PD0 должен происходить инкремент (увеличение на единицу) некоторой программной переменной, затем получившееся значение переменной следует сохранять в память EEPROM. По нажатию на вторую кнопку (ножка PD1) из EEPROM считывается последнее сохраненное значение переменной и на индикатор выводится соответствующая цифра. Если переменная после очередного инкремента стала равна 10, то необходимо обнулить ее значение. Схема в SimulIDE для моделирования работы программы Для моделирования работы микроконтроллера ATmega16 согласно условиям поставленной задачи понадобится собрать схему как на рисунке 1. Рис. 1. Схема моделирования в SimulIDE Здесь использованы элементы кнопка (Переключатели – Кнопка), семисегментный индикатор (Выходы – Светодиоды – 7-сегментный индикатор) и земля (Источники – Земля (0 Вольт)). Как видно, кнопки одним контактом подключены к ножкам порта D, а другим – к земле. Поэтому при нажатии на кнопку на соответствующую ножку поступит логический ноль. Подключение библиотек и раздел инициализации Для реализации поставленной задачи будут использованы типовые библиотеки, с добавлением библиотеки для работы с памятью EEPROM (см. рисунок 2). Рис. 2. Подключение библиотек Далее понадобится объявить глобальные переменные: - s – переменная, которая будет инкрементироваться по нажатию кнопки; - s_read – переменная, в которую будет считываться значение из EEPROM; - eeprom_var – переменная в области памяти EEPROM. Объявление указанные переменных приведено на рисунке 3. Рис. 3. Объявление переменных Последнее объявление требует пояснения: в данном случае используется специальный атрибут EEMEM для указания компилятору, что данную переменную необходимо будет разместить в области памяти EEPROM. Для настройки используемых аппаратных средств микроконтроллера предлагается написать пользовательскую функцию void init(void). Данная функция будет вызываться в основной функции main() перед бесконечным циклом, а содержимое функции init() будет заполняться необходимыми командами для инициализации аппаратных средств (см. рисунок 4). Рис. 4. Объявление пользовательской функции инициализации аппаратных средств В данном случае, по условию задания, используются только порты C и D. Соответственно в init() все ножки порта С настраиваются на вывод данных, а ножки PD0 и PD1 порта D – на ввод данных. К этим двум ножкам дополнительно подключаются подтягивающие резисторы командой PORTD = 0х03; Кроме настройки портов в функции init() инициализируется исходное значение переменной s: оно считывается из EEPROM. Для считывания используется функция uint8_t eeprom_read_byte (const uint8_t *__p) библиотеки eeprom.h. В качестве параметра в данной функции используется указатель *__p на ячейку памяти, из которой нужно считать байт данных. При вызове функции eeprom_read_byte() можно указать адрес переменной из области EEPROM, значение которой требуется получить: s = eeprom_read_byte(&eeprom_var); В данном случае это значение переменной eeprom_var, поэтому в качестве параметра в функцию чтения из EEPROM передается адрес &eeprom_var этой переменной. Таким образом, при включении питания микроконтроллера в переменную s запишется последнее сохраненное значение (от 0 до 9) из переменной eeprom_var в EEPROM. Поскольку EEPROM – энергонезависимая память, это значение в общем случае может быть не нулевым. Формирование бесконечного цикла В основной функции main() объявляется массив значений для индикатора и далее функция init() для настройки аппаратных средств и инициализации переменной s (см. рисунок 5). Рис. 5. Основная функция main() Операции в бесконечном цикле можно разбить на четыре шага: 1) проверка состояния кнопки на ножке PD0 и инкремент значения s, если кнопка нажата; 2) обнуление s, если ее значение превысило 10; 3) проверка состояния кнопки на ножке PD1 и запись нового значения s в переменную eeprom_var в EEPROM, если кнопка нажата; 4) считывание текущего значения переменной eeprom_var из EEPROM и вывод соответствующей цифры на индикатор. На рисунке 6 приведен код для бесконечного цикла, реализующий указанные 4 шага. Рис. 6. Бесконечный цикл программы Выражение (PIND&(1