У цьому проекті ми плануємо розробити простий будильник з використанням таймерів ATMEGA32. Мікроконтролер ATmega32A має 16-бітний таймер, і ми будемо використовувати цей таймер для підрахунку секунд і розробки цифрового годинника.
Всі цифрові годинники мають кристал всередині, який є серцем годинника. Цей кристал присутній не тільки в годиннику, але й у всіх обчислювальних системах реального часу. Цей кристал генерує тактові імпульси, необхідні для розрахунків часу. Хоча існують і інші способи отримання тактових імпульсів, але для точності та більш високої частоти більшість воліють кристалічні годинники. Ми збираємось підключити кристал до ATMEGA32 для отримання точних годин.
Потрібні компоненти
Апаратне забезпечення: мікроконтролер ATmega32, кристал 11.0592 МГц, конденсатор 22pF (2 штуки), джерело живлення (5 в), ПРОГРАММЕР AVR-ISP, JHD_162ALCD (16x2 LCD), конденсатор 100 мкФ (підключений через блок живлення), кнопки (чотири штуки), резистор 10 кОм (шість штук), ємнісний конденсатор 100 нФ (чотири частини), три штифтові перемикачі (2 штуки), транзистор 2N2222, зумер, резистор 200 Ом
Програмне забезпечення: Atmel studio 6.1, progisp або flash magic.
Принципова схема та робоче пояснення
Для точного хронометражу ми підключили кристал 11.0592 МГц для годинника. Тепер, щоб вимкнути внутрішній годинник ATMEGA, нам доведеться змінити його БІЛЬКІ ЗАБЕЗПЕЧЕННЯ. Пам'ятайте, що ми не торкаємося бітів із високим запобіжником, тому зв'язок JTAG все ще буде ввімкнено.
Щоб сказати ATMEGA вимкнути внутрішній годинник і працювати на зовнішніх, нам потрібно встановити:
БАЙТ НИЗЬКОГО ВИКОРИСТАННЯ = 0xFF або 0b11111111.
У схемі PORTB ATMEGA32 підключений до РК-порту даних. Тут слід пам’ятати про вимкнення зв'язку 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)
У схемі ви можете помітити, що я взяв лише два керуючі штифти. Це надає гнучкість для кращого розуміння, біт контрасту та READ / WRITE не часто використовуються, тому їх можна закоротити на землю. Це дає РК-дисплею найвищий контраст і режим читання. Нам просто потрібно контролювати 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 uC
PIN9 або D2 до PB2 uC
PIN10 або D3 до PB3 uC
PIN11 або D4 до PB4 uC
PIN12 або D5 до PB5 uC
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 (переривання служби перерв при кожному порівнянні) для кожної секунди. Отже, ми збираємося використовувати цю своєчасну процедуру, щоб отримати годинник, який нам потрібен.
BROWN (WGM10-WGM13): Ці біти призначені для вибору режиму роботи таймера.
Тепер, оскільки нам потрібен режим CTC зі значенням порівняння в байті OCR1A, нам просто потрібно встановити WGM12 на одиницю, а решта залишаються, оскільки вони за замовчуванням дорівнюють нулю.
ЧЕРВОНИЙ (CS10, CS11, CS12): Ці три біти призначені для вибору прескаляра та отримання відповідного годинника лічильника.
Оскільки ми хочемо 1024 як попереднє масштабування, ми повинні встановити як CS12, так і CS10.
Зараз є ще один реєстр, який ми повинні розглянути:
ЗЕЛЕНИЙ (OCIE1A): Цей біт повинен бути встановлений для отримання переривання на порівняння збігу між значенням лічильника та значенням OCR1A (10800), яке ми встановили.
Значення OCR1A (значення порівняння лічильника) записано у верхньому регістрі.
Пояснення програмування
Робота будильника пояснюється поетапно в наведеному нижче коді:
#include // заголовок, щоб увімкнути управління потоком даних над висновками #define F_CPU 1000000 // повідомляє контролер про частоту кристала, прикріплений