В этом проекте мы собираемся разработать простой будильник с использованием таймеров ATMEGA32. Микроконтроллер ATmega32A имеет 16-битный таймер, и мы будем использовать этот таймер для подсчета секунд и разработки цифровых часов.
Внутри всех цифровых часов есть кристалл, который является сердцем часов. Этот кристалл присутствует не только в часах, но и во всех вычислительных системах реального времени. Этот кристалл генерирует тактовые импульсы, необходимые для расчетов времени. Хотя есть и другие способы получения тактовых импульсов, но для точности и более высокой частоты большинство предпочитают тактовые импульсы на кристалле. Мы собираемся подключить кристалл к ATMEGA32 для получения точных часов.
Необходимые компоненты
Аппаратное обеспечение: микроконтроллер ATmega32, кристалл 11,0592 МГц, конденсатор 22 пФ (2 шт.), Источник питания (5 В), ПРОГРАММАТОР AVR-ISP, JHD_162ALCD (ЖК-дисплей 16x2), конденсатор 100 мкФ (подключенный к источнику питания), кнопки (четыре шт.), Резистор 10 кОм (шесть штук), конденсатор 100 нФ (четыре штуки), трехконтактные переключатели (2 штуки), транзистор 2N2222, зуммер, резистор 200 Ом.
Софт: Atmel studio 6.1, прогисп или flash magic.
Принципиальная схема и объяснение работы
Для точной синхронизации мы подключили кристалл 11,0592 МГц для синхронизации. Теперь, чтобы отключить внутренние часы ATMEGA, нам нужно изменить его LOW FUSE BITS. Помните, что мы не касаемся высоких битов предохранителя, поэтому связь JTAG все еще будет включена.
Чтобы сообщить ATMEGA отключить внутренние часы и работать с внешними, нам необходимо установить:
НИЗКИЙ ИСПОЛЬЗУЕМЫЙ БАЙТ = 0xFF или 0b11111111.
В схеме PORTB ATMEGA32 подключен к LCD порту данных. Здесь следует не забыть отключить связь JTAG в PORTC ATMEGA, изменив старшие байты предохранителя, если вы хотите использовать PORTC в качестве обычного порта связи. В ЖК-дисплее 16x2 всего 16 контактов, если есть черный свет, если нет подсветки, будет 14 контактов. Можно включить или оставить контакты подсветки. Теперь в 14 контактах 8 контактов данных (7-14 или D0-D7), 2 контакта источника питания (1 и 2 или VSS и VDD или gnd & + 5v), 3- й контакт для контроля контрастности (VEE-контролирует толщину символов. показаны) и 3 управляющих контакта (RS, RW и E)
В схеме вы можете заметить, что я взял только два контрольных контакта. Это дает гибкость для лучшего понимания, бит контраста и ЧТЕНИЕ / ЗАПИСЬ не часто используются, поэтому их можно замкнуть на землю. Это переводит ЖК-дисплей в режим максимальной контрастности и чтения. Нам просто нужно управлять контактами ENABLE и RS, чтобы отправлять символы и данные соответственно.
Подключения, которые выполняются для ЖК-дисплея, приведены ниже:
PIN1 или VSS на землю
PIN2 или VDD или VCC на питание +5 В
PIN3 или VEE на землю (дает максимальный контраст для новичков)
PIN4 или RS (выбор регистра) к PD6 uC
PIN5 или RW (чтение / запись) на землю (перевод ЖК-дисплея в режим чтения упрощает взаимодействие для пользователя)
PIN6 или E (включить) к PD5 uC
PIN7 или D0 - PB0 uC
PIN8 или D1 - PB1 микроконтроллера
PIN9 или D2 - PB2 uC
PIN10 или D3 - PB3 uC
PIN11 или D4 - PB4 uC
PIN12 или D5 - PB5 микроконтроллера
PIN13 или D6 - PB6 uC
PIN14 или D7 - PB7 uC
В схеме вы можете видеть, что мы использовали 8-битную связь (D0-D7), однако это не обязательно, мы можем использовать 4-битную связь (D4-D7), но с 4-битной коммуникационной программой становится немного сложнее. Итак, как показано в приведенной выше таблице, мы подключаем 10 контактов ЖК-дисплея к контроллеру, из которых 8 контактов - это контакты данных, а 2 контакта - для управления.
Первый переключатель предназначен для включения функции регулировки между будильником и временем. Если контакт низкий, мы можем настроить время будильника, нажимая кнопки. Если его высокие кнопки предназначены только для регулировки ВРЕМЕНИ. Здесь присутствуют ЧЕТЫРЕ кнопки, первая предназначена для увеличения МИНУТ будильника или времени. Второй - для уменьшения на МИНУТЫ будильника или времени. Третий - для увеличения ЧАСА будильника или времени. ЧЕТВЕРТАЯ предназначена для уменьшения ЧАСОВ будильника или времени.
Конденсаторы, представленные здесь, предназначены для того, чтобы нейтрализовать эффект отскока кнопок. Если их удалить, контроллер может считать больше одного при каждом нажатии кнопки. Резисторы, подключенные к контактам, предназначены для ограничения тока, когда кнопка нажата, чтобы опустить контакт к земле.
Всякий раз, когда нажимается кнопка, соответствующий вывод контроллера опускается на землю, и, таким образом, контроллер распознает, что определенная кнопка нажата, и предпринимается соответствующее действие.
Во-первых, частота, которую мы выбираем, составляет 11059200 Гц, деление ее на 1024 дает 10800. Таким образом, на каждую секунду мы получаем 10800 импульсов. Итак, мы собираемся запустить счетчик с предварительным делителем 1024, чтобы получить частоту счетчика как 10800 Гц. Во-вторых, мы собираемся использовать режим CTC (Clear Timer Counter) ATMEGA. Будет 16-битный регистр, в котором мы можем хранить значение (значение сравнения), когда счетчик подсчитывает до значения сравнения, которое создается прерыванием.
Мы собираемся установить значение сравнения на 10800, поэтому в основном у нас будет ISR (процедура обслуживания прерывания при каждом сравнении) для каждой секунды. Итак, мы собираемся использовать эту своевременную процедуру, чтобы получить нужные нам часы.
КОРИЧНЕВЫЙ (WGM10-WGM13): эти биты предназначены для выбора режима работы таймера.
Теперь, поскольку нам нужен режим CTC со значением сравнения в байте OCR1A, нам просто нужно установить WGM12 в единицу, оставшиеся оставлены, поскольку по умолчанию они равны нулю.
КРАСНЫЙ (CS10, CS11, CS12): эти три бита предназначены для выбора предскалярной функции и, таким образом, получения соответствующей тактовой частоты счетчика.
Поскольку мы хотим, чтобы предварительное масштабирование было равно 1024, мы должны установить и CS12, и CS10.
Теперь есть еще один регистр, который мы должны рассмотреть:
ЗЕЛЕНЫЙ (OCIE1A): этот бит должен быть установлен для получения прерывания при сравнении значения счетчика и значения OCR1A (10800), которое мы установили.
Значение OCR1A (значение сравнения счетчика) записывается в регистр выше.
Объяснение программирования
Работа будильника объясняется шаг за шагом в приведенном ниже коде:
#include // заголовок для включения управления потоком данных на выводах #define F_CPU 1000000 // сообщающая частота кристалла контроллера прикреплена #include