Программирование МК Тема 7 тесты PDF
Document Details
Uploaded by Deleted User
Tags
Summary
Данный документ содержит описание задачи по программированию микроконтроллера, в которой используется память 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). ![](media/image2.png) Рис. 2. Подключение библиотек Далее понадобится объявить глобальные переменные: \- s -- переменная, которая будет инкрементироваться по нажатию кнопки; \- s\_read -- переменная, в которую будет считываться значение из EEPROM; \- eeprom\_var -- переменная в области памяти EEPROM. Объявление указанные переменных приведено на рисунке 3. Рис. 3. Объявление переменных Последнее объявление требует пояснения: в данном случае используется специальный атрибут EEMEM для указания компилятору, что данную переменную необходимо будет разместить в области памяти EEPROM. Для настройки используемых аппаратных средств микроконтроллера предлагается написать пользовательскую функцию void init(void). Данная функция будет вызываться в основной функции main() перед бесконечным циклом, а содержимое функции init() будет заполняться необходимыми командами для инициализации аппаратных средств (см. рисунок 4). ![](media/image4.png) Рис. 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 шага.** ![](media/image6.png) **Рис. 6. Бесконечный цикл программы** **Выражение (PIND&(1 \