Будильник на микроконтроллере AVR ATmega32

В этой статье мы рассмотрим схему простого будильника на микроконтроллере ATmega32 (семейство AVR). Для реализации этой идеи мы используем 16 битный таймер, присутствующий в данном микроконтроллере.

Будильник на микроконтроллере AVR ATmega32: внешний вид

Все цифровые часы имеют в своем составе кварцевый резонатор, который является их «сердцем». Кварцевые резонаторы присутствуют практически во всех системах реального времени. Подобные резонаторы генерируют временные импульсы, которые необходимы для точного вычисления времени. Существуют и другие способы точного задания временных интервалов, но все таки использование кварцевых резонаторов является наиболее предпочтительным для решения этой задачи. Поэтому и мы в рассматриваемой схеме будем подсоединять кварцевый резонатор к микроконтроллеру ATmega32 чтобы обеспечить точный расчет временных интервалов.

Необходимые компоненты

Аппаратное обеспечение

  1. Микроконтроллер ATmega32.
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. JHD_162ALCD (ЖК дисплей 16×2).
  4. Кварцевый резонатор 11.0592 МГц.
  5. Конденсатор 22 пФ (2 шт.).
  6. Конденсатор 100 нФ (4 шт.).
  7. Конденсатор 100 мкФ (соединенный по питанию).
  8. Кнопка (4 шт.).
  9. Трехконтактный переключатель (2 шт.).
  10. Транзистор 2N2222.
  11. Зуммер.
  12. Резистор 10 кОм (6 шт.).
  13. Резистор 200 Ом.
  14. Источник питания с напряжением 5 Вольт.

Программное обеспечение

Atmel Studio версии 6.1 (или выше)
Progisp или flash magic (необязательно)

Работа схемы

Схема устройства приведена на следующем рисунке.

Схема будильника на микроконтроллере AVR ATmega32

Для точного подсчета интервалов времени мы подсоединили к микроконтроллеру кварцевый резонатор на 11.0592 МГц. Теперь для того, чтобы отключить внутренний генератор микроконтроллера ATmega32 мы должны соответствующим образом сконфигурировать его «нижние» фьюзы (fuse bits). Но мы не должны трогать «верхние» фьюзы чтобы JTAG интерфейс микроконтроллера был доступен (активирован).

Чтобы сообщить микроконтроллеру о том, чтобы он отключил внутренний генератор и работал от внешнего кварцевого резонатора мы должны выполнить команду

LOW USE BYTE = 0xFF или 0b11111111.

В представленной схеме PORTB микроконтроллера ATmega32 соединен с портом данным жидкокристаллического (ЖК) дисплея. Если вы не хотите трогать фьюзы (FUSE BITS) микроконтроллера, то не используйте PORTC, поскольку PORTC содержит специальные функции (типы связи), которые можно деактивировать только с помощью изменения фьюзов.

В ЖК дисплее (если мы не хотим использовать черный цвет) можно задействовать только 14 его контактов: 8 контактов для передачи данных (7-14 или D0-D7), 2 контакта для подачи питания (1&2 или VSS&VDD или gnd&+5v), 3-й контакт для управления контрастностью, 3 контакта для управления (RS&RW&E).

В представленной схеме мы использовали только 2 контакта управления ЖК дисплея для лучшего понимания работы схемы. Бит контраста и READ/WRITE используются нечасто, поэтому они могут быть замкнуты на землю. Это обеспечивает ЖК дисплею максимальную контрастность и переводит его в режим чтения. Теперь нам всего лишь нужно контролировать контакты ENABLE и RS чтобы передавать на ЖК дисплей символы и данные. Также на нашем сайте вы можете прочитать более подробную статью о подключении ЖК дисплея к микроконтроллеру AVR ATmega32.

В схеме необходимо сделать следующие соединения с ЖК дисплеем:
PIN1 или VSS — земля
PIN2 или VDD или VCC — +5v питание
PIN3 или VEE — земля (обеспечивает максимальный контраст ЖК дисплею)
PIN4 или RS (Register Selection) – контакт PD6 микроконтроллера
PIN5 или RW (Read/Write) — земля (переводит ЖК дисплей в режим чтения что упрощает взаимодействие с ним для начинающих)
PIN6 или E (Enable) — контакт PD5 микроконтроллера
PIN7 или D0 — контакт PB0 микроконтроллера
PIN8 или D1 — контакт PB1 микроконтроллера
PIN9 или D2 — контакт PB2 микроконтроллера
PIN10 или D3 — контакт PB3 микроконтроллера
PIN11 или D4 — контакт PB4 микроконтроллера
PIN12 или D5 — контакт PB5 микроконтроллера
PIN13 или D6 — контакт PB6 микроконтроллера
PIN14 или D7 — контакт PB7 микроконтроллера

В схеме мы использовали 8-битную связь (D0-D7) ЖК дисплея с микроконтроллером, хотя можно было ограничиться и 4-битной – но в этом случае код программы стал бы немного сложнее. Таким образом, мы использовали 10 контактов ЖК дисплея, 8 из которых будут использоваться для передачи данных и 2 для управления.

Первый переключатель в схеме используется для переключения между режимами часов и будильника. Если на контакте низкий уровень, мы можем настраивать время срабатывания будильника при помощи нажатия кнопок, присутствующих в схеме. Если на контакте высокий уровень, то с помощью кнопок мы настраиваем текущее время (время часов). Первая кнопка на схеме предназначена для инкрементирования минут, вторая – для декрементирования минут, третья – для инкрементирования часов, четвертая – для декрементирования часов.

Конденсаторы, включенные параллельно кнопкам, предназначены для устранения эффектов биений, возникающих при нажатии кнопок. Если их устранить, то однократное нажатие кнопок будут иногда распознаваться микроконтроллером как многократные. Резисторы, подсоединенные к выводам микроконтроллера, предназначены для ограничения тока при нажатии кнопок.

Если кнопка нажата, то на соответствующий контакт микроконтроллера подается «земля» и таким образом микроконтроллер распознает нажатие кнопки и предпринимает соответствующие действия

Перед началом написания программы для микроконтроллера мы должны правильным образом настроить регистры таймера для обеспечения точного подсчета временных интервалов. Частота кварцевого резонатора у нас 11059200 Гц, если мы разделим ее на 1024, то получим 10800. Таким образом, для каждой секунды мы будем иметь 10800 импульсов. Поэтому мы должны использовать коэффициент деления предделителя равный 1024 чтобы получить частоту счетного регистра равную 10800 Гц. Для подсчета времени мы будем использовать 16 битный таймер микроконтроллера ATmega32. Данный таймер способен использовать функцию сравнения, которая заключается в непрерывном (каждый машинный цикл) сравнении содержимого счетного регистра таймера/счетчика с числом, находящемся в регистре сравнения. При совпадении содержимого этих регистров устанавливается флаг соответствующего прерывания, а также могут выполняться другие действия.

Поскольку в регистр сравнения мы будем записывать число 10800 это значит что с высокой точностью у нас каждую секунду будет генерироваться прерывание от таймера – это обстоятельство мы можем использовать для точного подсчета времени.

Рассмотрим теперь необходимую нам конфигурацию регистров таймера.

Регистры таймера микроконтроллера AVR ATmega32

BROWN (коричневый, WGM10-WGM13): эти биты задают режим функционирования таймера в соответствии с нижеприведенной таблицей.

Биты для установки режима таймера микроконтроллера AVR ATmega32

Поскольку мы будем использовать режим сравнения (режим CTC — Clear Timer Counter) значения таймера с числом, находящимся в байте OCR1A, мы должны установить WGM12 в 1, а остальные эти биты не трогать (по умолчанию в них при инициализации микроконтроллера записывается 0).

RED (красный, CS10,CS11,CS12): эти биты используются для задания коэффициента деления предделителя и соответствующего конфигурирования счетного регистра (установки частоты его работы).

Биты для установки коэффициента деления предделителя таймера микроконтроллера AVR ATmega32

Поскольку мы будем использовать коэффициент деления предделителя равный 1024 мы должны установить CS12 и CS10 в 1.

Другой регистр, который потребуется нам для написания программы – это TIMSK (регистр маски прерываний от таймеров, осуществляет разрешение/запрещение прерываний от таймера).

Регистр маски прерываний таймера микроконтроллера AVR ATmega32

GREEN (зеленый, OCIE1A): этот бит должен быть установлен для разрешения прерывания при совпадении значения счетного регистра с числом, хранящимся в OCR1A (мы будем записывать туда число 10800).

Регистр сравнения микроконтроллера AVR ATmega32

Исходный код программы на языке С (Си) с пояснениями

Программа для рассматриваемой нами схемы будильника на микроконтроллере AVR ATmega32 представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

Теперь код программы без комментариев.

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
643 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *