В този проект ще проектираме прост будилник с помощта на таймери ATMEGA32. Микроконтролерът ATmega32A има 16-битов таймер и ние ще използваме този таймер, за да броим секундите и да разработваме цифров часовник.
Всички цифрови часовници имат кристал вътре в себе си, който е сърцето на часовника. Този кристал присъства не само в часовника, но и във всички изчислителни системи в реално време. Този кристал генерира тактови импулси, които са необходими за изчисленията на времето. Въпреки че има някои други начини за получаване на тактови импулси, но за точност и по-висока честота повечето предпочитат кристален часовник. Ще свържем кристал към ATMEGA32 за получаване на точен часовник.
Необходими компоненти
Хардуер: ATmega32 микроконтролер, кристал 11.0592MHz, кондензатор 22pF (2 броя), захранване (5v), AVR-ISP ПРОГРАММЕР, JHD_162ALCD (16x2 LCD), кондензатор 100uF (свързан през захранването), бутони (четири броя), 10KΩ резистор (шест броя), 100nF кондензатор (четири броя), три пинови превключвателя (2 броя), транзистор 2N2222, зумер, резистор 200Ω
Софтуер: Atmel studio 6.1, progisp или flash magic.
Електрическа схема и работно обяснение
За точно определяне на времето сме свързали 11.0592MHz кристал за часовник. Сега за деактивиране на вътрешния часовник на ATMEGA трябва да променим неговите НИСКИ БРОЙКИ. Не забравяйте, че не докосваме битовете с високи предпазители, така че комуникацията JTAG ще бъде активирана.
За да кажем на ATMEGA да деактивира вътрешния часовник и да работи на външен, трябва да настроим:
БАЙТ ЗА НИСКО ИЗПОЛЗВАНЕ = 0xFF или 0b11111111.
Във веригата PORTB на ATMEGA32 е свързан към порта за данни LCD. Тук трябва да запомните да деактивирате комуникацията JTAG в PORTC на ATMEGA, като промените байтовете с висок предпазител, ако искате да използвате PORTC като нормален комуникационен порт. В 16x2 LCD има 16 щифта, ако има черна светлина, ако няма задна светлина, ще има 14 щифта. Човек може да захранва или да оставя щифтовете на задното осветление. Сега в 14-те извода има 8 извода за данни (7-14 или D0-D7), 2 извода за захранване (1 & 2 или VSS & VDD или gnd & + 5v), 3 -ти извод за контрол на контраста (VEE - контролира колко дебели трябва да бъдат символите показани) и 3 контролни щифта (RS & RW & E)
Във веригата можете да забележите, че съм взел само два контролни щифта. Това дава гъвкавост на по-добро разбиране, контрастният бит и READ / WRITE не се използват често, така че могат да бъдат късо заземени. Това поставя LCD в най-висок контраст и режим на четене. Просто трябва да контролираме ENABLE и RS щифтовете, за да изпращаме символи и данни по съответния начин.
Връзките, които се правят за LCD са дадени по-долу:
PIN1 или VSS към земята
PIN2 или VDD или VCC до + 5v мощност
PIN3 или VEE към земята (дава максимален контраст най-добър за начинаещи)
PIN4 или RS (Регистрация за избор) към PD6 на uC
PIN5 или RW (четене / запис) към земята (поставя LCD в режим на четене, улеснява комуникацията за потребителя)
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 щифта LCD към контролер, в който 8 щифта са щифтове за данни и 2 щифта за управление.
Превключвателят е за активиране на функцията за настройка между аларма и час. Ако щифтът е нисък, можем да регулираме времето за аларма чрез натискане на бутони. Ако високите му бутони са за настройка само на ВРЕМЕ. Тук има ЧЕТИРИ бутона, първият е за увеличаване на МИНУТИ в аларма или време. Второто е за намаляване на MINUTES в аларма или време. Третото е за нарастване на HOUR в аларма или време. ЧЕТВЪРТО е за намаляване на ЧАСОВЕ в аларма или време.
Кондензаторите, присъстващи тук, са за обезсилване на подскачащия ефект на бутоните. Ако бъдат премахнати, контролерът може да брои повече от един при всяко натискане на бутона. Резисторите, свързани за щифтове, са за ограничаване на тока, когато бутонът е натиснат, за да издърпате щифта на земята.
При всяко натискане на бутон, съответният щифт на контролера се издърпва на земята и по този начин контролерът разпознава, че е натиснат определен бутон и се предприема съответното действие.
На първо място, часовникът, който избираме тук, е 11059200 Hz, разделяйки го на 1024 дава 10800. Така че за всяка секунда получаваме 10800 импулса. Така че ще започнем брояч с 1024 предскалер, за да получим брояча като 10800 Hz. Второ, ще използваме режима 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 // разказваща прикачена честота на кристала на контролера