W tym projekcie zamierzamy zaprojektować prosty budzik z wykorzystaniem timerów ATMEGA32. Mikrokontroler ATmega32A ma 16-bitowy zegar i będziemy go używać do liczenia sekund i opracowywania zegara cyfrowego.
Wszystkie zegary cyfrowe mają wewnątrz kryształ, który jest sercem zegara. Ten kryształ jest obecny nie tylko w zegarze, ale we wszystkich komputerowych systemach czasu rzeczywistego. Ten kryształ generuje impulsy zegarowe, które są potrzebne do obliczeń czasowych. Chociaż istnieją inne sposoby uzyskania impulsów zegara, ale ze względu na dokładność i wyższą częstotliwość większość preferuje zegar kryształowy. Zamierzamy podłączyć kryształ do ATMEGA32, aby uzyskać dokładny zegar.
Wymagane składniki
Sprzęt: mikrokontroler ATmega32, kryształ 11,0592MHz, kondensator 22pF (2 sztuki), zasilacz (5v), programator AVR-ISP, JHD_162ALCD (16x2 LCD), kondensator 100uF (podłączony przez zasilacz), przyciski (cztery sztuki), rezystor 10KΩ (sześć sztuk), 100nF kondensator (cztery sztuki), Trzy pinowe przełączniki (2 sztuki), tranzystor 2N2222, Buzzer, rezystor 200Ω.
Oprogramowanie: Atmel studio 6.1, progisp lub flash magic.
Schemat obwodu i objaśnienie robocze
Aby uzyskać dokładne taktowanie, podłączyliśmy kryształ 11,0592 MHz jako zegar. Teraz, aby wyłączyć wewnętrzny zegar ATMEGA, musimy zmienić jego LOW FUSE BITS. Pamiętaj, że nie dotykamy wysokich bitów bezpiecznika, więc komunikacja JTAG byłaby nadal włączona.
Aby nakazać ATMEGIE wyłączenie wewnętrznego zegara i pracę na zewnętrznym, musimy ustawić:
LOW USE BYTE = 0xFF lub 0b11111111.
W obwodzie PORTB ATMEGA32 jest podłączony do portu danych LCD. W tym miejscu należy pamiętać o wyłączeniu komunikacji JTAG w PORTC ATMEGA poprzez zmianę bajtów wysokiego bezpiecznika, jeśli chcemy używać PORTC jako normalnego portu komunikacyjnego. W LCD 16x2 jest 16 pinów, jeśli jest czarne światło, jeśli nie ma podświetlenia, będzie 14 pinów. Można zasilać lub pozostawić piny podświetlenia. Teraz w 14 szpilki są kołki 8 danych (7-14 lub D0-D7), 2 szpilki zasilacza (1 i 2 lub VSS i VDD i GND i +5 V), 3 rd pin regulacji kontrastu (VEE umożliwia sprawdzenie grubości znaki powinny pokazano) i 3 piny sterujące (RS i RW i E)
W obwodzie można zauważyć, że wziąłem tylko dwa piny sterujące. Daje to elastyczność lepszego zrozumienia, bit kontrastu i ODCZYT / ZAPIS nie są często używane, więc mogą być zwarte do masy. Dzięki temu wyświetlacz LCD ma najwyższy kontrast i tryb odczytu. Musimy tylko sterować pinami ENABLE i RS, aby odpowiednio wysyłać znaki i dane.
Poniżej przedstawiono połączenia wykonane dla LCD:
PIN1 lub VSS do masy
PIN2 lub VDD lub VCC do + 5 V.
PIN3 lub VEE do ziemi (daje maksymalny kontrast najlepszy dla początkującego)
PIN4 lub RS (wybór rejestru) do PD6 uC
PIN5 lub RW (odczyt / zapis) do masy (przełącza wyświetlacz LCD w tryb odczytu, ułatwiając komunikację użytkownikowi)
PIN6 lub E (Włącz) do PD5 uC
PIN7 lub D0 do PB0 z uC
PIN8 lub D1 do PB1 uC
PIN9 lub D2 do PB2 uC
PIN10 lub D3 do PB3 uC
PIN11 lub D4 do PB4 uC
PIN12 lub D5 do PB5 uC
PIN13 lub D6 do PB6 uC
PIN14 lub D7 do PB7 uC
W układzie widać, że użyliśmy komunikacji 8-bitowej (D0-D7), jednak nie jest to obowiązkowe, możemy użyć komunikacji 4-bitowej (D4-D7), ale przy 4-bitowej komunikacji program staje się nieco skomplikowany. Tak więc, jak pokazano w powyższej tabeli, podłączamy 10 pinów LCD do kontrolera, w których 8 pinów jest pinami danych i 2 pinami do sterowania.
Przełącznik pierwszy służy do włączania funkcji regulacji między alarmem a czasem. Jeśli pin jest niski, możemy ustawić czas alarmu za pomocą przycisków. Jeśli jego wysokie przyciski służą do regulacji tylko CZASU. Znajdują się tutaj CZTERY przyciski, pierwszy służy do zwiększania MINUT alarmu lub czasu. Drugi służy do zmniejszania MINUT w przypadku alarmu lub czasu. Trzeci służy do zwiększania GODZINY alarmu lub czasu. CZWARTA służy do dekrementacji GODZIN alarmu lub czasu.
Obecne tutaj kondensatory służą do niwelowania efektu odbijania przycisków. Jeśli zostaną usunięte, kontroler może policzyć więcej niż jeden przy każdym naciśnięciu przycisku. Rezystory podłączone do kołków służą do ograniczania prądu, gdy przycisk jest wciśnięty, aby pociągnąć kołek do ziemi.
Za każdym razem, gdy przycisk jest wciśnięty, odpowiedni pin kontrolera zostaje ściągnięty do masy, a tym samym kontroler rozpoznaje, że naciśnięty jest określony przycisk i zostaje podjęta odpowiednia akcja.
Przede wszystkim zegar, który tu wybieramy to 11059200 Hz, podzielenie go przez 1024 daje 10800. Czyli na każdą sekundę otrzymujemy 10800 impulsów. Więc uruchomimy licznik z 1024 preskalerem, aby uzyskać zegar licznika jako 10800 Hz. Po drugie, użyjemy trybu CTC (Clear Timer Counter) ATMEGA. Będzie 16-bitowy rejestr, w którym możemy przechowywać wartość (wartość porównawczą), gdy licznik zlicza do wartości porównawczej, które ma wygenerować przerwanie.
Ustawimy wartość porównania na 10800, więc w zasadzie będziemy mieli ISR (Interrupt Service Routine dla każdego porównania) dla każdej sekundy. Więc zamierzamy użyć tej rutynowej procedury, aby uzyskać zegar, którego potrzebowaliśmy.
BRĄZOWY (WGM10-WGM13): Te bity służą do wyboru trybu działania timera.
Teraz, ponieważ chcemy trybu CTC z wartością porównawczą w bajcie OCR1A, musimy tylko ustawić WGM12 na jeden, pozostałe są pozostawione, ponieważ domyślnie są zerowe.
CZERWONY (CS10, CS11, CS12): Te trzy bity służą do wyboru preskalara i uzyskania odpowiedniego licznika czasu.
Ponieważ chcemy mieć 1024 jako wstępne skalowanie, musimy ustawić zarówno CS12, jak i CS10.
Teraz jest inny rejestr, który powinniśmy rozważyć:
ZIELONY (OCIE1A): Ten bit musi być ustawiony, aby uzyskać przerwanie przy porównywaniu dopasowania między wartością licznika a wartością OCR1A (10800), które ustawiliśmy.
Wartość OCR1A (wartość porównawcza licznika) zapisywana jest w powyższym rejestrze.
Objaśnienie programowania
Działanie budzika jest wyjaśnione krok po kroku w poniższym kodzie:
#include // nagłówek umożliwiający kontrolę przepływu danych przez piny # zdefiniować F_CPU 1000000 // informowanie o częstotliwości kryształu kontrolera #include