Рубрики
Схемы на AVR

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

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

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

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

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

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

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158

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

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

Работа схемы

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

Для точного подсчета интервалов времени мы подсоединили к микроконтроллеру кварцевый резонатор на 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 это значит что с высокой точностью у нас каждую секунду будет генерироваться прерывание от таймера – это обстоятельство мы можем использовать для точного подсчета времени.

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

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

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

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

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

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

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

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

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

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

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

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

Здравствуйте. Не имеется ли платы данного устройства, желательно в программе spring-layout, для дальнейшей ее печати?

Здравствуйте, можете объяснить как идет ток по схеме и что за чем идёт?

Добрый вечер, ток от чего к чему? На схеме просто достаточно много цепей прохождения тока

Какую программу можно использовать для программирования микроконтроллера?

Здравствуйте, Конденсатор 47 мкФ с чем должен соединяться и для чего он нужен в схеме?

Добрый вечер. Это просто фильтрующий конденсатор по питанию, фильтрует/сглаживает нежелательные выбросы напряжения. Одним концом подключается к питанию, а другим — к общему проводу

Скажите пожалуйста, как я могу транслировать из языка с в язык ассемблера, какую программу использовать?

Да, питание 5В, а в какой части схемы вы такой огромный ток ожидаете увидеть? Микроконтроллер от такого тока просто сгорит. Максимальный ток здесь может только через транзистор течь если зуммер мощный поставить, но, согласно ТТХ, максимальный ток через транзистор 2N2222 может составлять 0.6 A, но никак не 1-1,5А

И еще один вопрос(не злитесь), куда писать это LOW USE BYTE = 0xFF или 0b11111111.

Вначале функции int main(void) можно написать, в месте где задается направление работы портов ввода/вывода

Здравствуйте. А где видно, что Showsec, Showmin, Showhou и т. д. равны Sec, Min, How? Как в этом выражении: «itoa(HOU/10,SHOWHOU,10);» одно заменяется на другое и выводится на LCD? У меня вообще ничего в Протеусе не выводится.

Ну, смотрите, там же в программе ниже после команды itoa(HOU/10,SHOWHOU,10) есть и команды itoa(MIN/10,SHOWMIN,10), itoa(SEC/10,SHOWSEC,10). Или вы что то другое имели ввиду? Если программа целиком не запускается, то следует применить известный прием — пытаться запускать и отлаживать работу программы по частям. Эту программу достаточно просто же разбить на части, которые можно по отдельности протестировать

Нет, я имел в виду, что после первой скобки в выражении «itoa(min/…», а выводятся данные в виде массива showmin. Где происходит их замена? Или формула для itoa имеет какую-то стандартную запись и замена происходит автоматически?

Так функция itoa как раз и преобразует число min в массив символов showmin, которые затем выводятся на экран ЖК дисплея. Вы же число сами по себе просто так на ЖК дисплее не отобразите

Здравствуйте, а можно ли этот механизм поставить внутарь ламповых часов, а если нет, то какой можно?

Добрый вечер. Я думаю в чистом виде его внутрь ламповых часов не удастся поставить поскольку у выводов микроконтроллера не хватит тока чтобы управлять лампами. Нужно между выводами микроконтроллера и лампами поставить какие-нибудь переключатели, например, реле или транзисторы

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

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