I det här projektet ska vi utforma en enkel väckarklocka med ATMEGA32-timers. ATmega32A mikrokontroller har en 16-bitars timer, och vi kommer att använda den timern för att räkna sekunderna och utveckla en digital klocka.
Alla digitala klockor har en kristall inuti som är hjärtat på klockan. Denna kristall finns inte bara i klockan utan i alla datorsystem i realtid. Denna kristall genererar klockpulser, vilket behövs för tidsberäkningar. Även om det finns några andra sätt att få klockpulser men för noggrannhet och högre frekvens föredrar de mest kristallbaserad klocka. Vi ska ansluta en kristall till ATMEGA32 för att få korrekt klocka.
Komponenter krävs
Hårdvara: ATmega32 mikrokontroller, 11.0592MHz kristall, 22pF kondensator (2 delar), strömförsörjning (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), 100uF kondensator (ansluten över strömförsörjning), knappar (fyra delar), 10KΩ motstånd (sex stycken), 100nF kondensator (fyra stycken), tre stiftomkopplare (2 stycken), 2N2222 transistor, summer, 200Ω motstånd.
Programvara: Atmel studio 6.1, progisp eller flash magi.
Kretsschema och arbetsförklaring
För korrekt timing har vi anslutit en 11.0592MHz kristall för klocka. För att inaktivera ATMEGAs interna klocka måste vi ändra dess LOW FUSE BITS. Kom ihåg att vi inte vidrör de höga säkringsbitarna så att JTAG-kommunikationen fortfarande är aktiverad.
För att berätta för ATMEGA att inaktivera intern klocka och att arbeta med extern måste vi ställa in:
BYTE MED LÅG ANVÄNDNING = 0xFF eller 0b11111111.
I kretsen är PORTB på ATMEGA32 ansluten till dataport LCD. Här bör man komma ihåg att inaktivera JTAG-kommunikationen i PORTC i ATMEGA genom att ändra höga säkringsbyte, om man vill använda PORTC som en normal kommunikationsport. I 16x2 LCD finns det 16 stift överallt om det finns ett svart ljus, om det inte finns något bakgrundsbelysning kommer det att finnas 14 stift. Man kan driva eller lämna bakljuset. Nu i de 14 stiften finns 8 datastift (7-14 eller D0-D7), 2 effektmatningsstiften (1 & 2 eller VSS & VDD eller GND & + 5v), 3 : e stift för kontrastreglering (VEE-styr hur tjock tecknen bör vara visas) och 3 kontrollstift (RS & RW & E)
I kretsen kan du se att jag bara har tagit två kontrollstift. Detta ger flexibiliteten för bättre förståelse, kontrastbiten och LÄS / SKRIV inte ofta så att de kan kortslutas till marken. Detta sätter LCD i högsta kontrast och läsläge. Vi behöver bara kontrollera ENABLE- och RS-stift för att skicka tecken och data i enlighet därmed.
De anslutningar som görs för LCD ges nedan:
PIN1 eller VSS till jord
PIN2 eller VDD eller VCC till + 5v ström
PIN3 eller VEE till marken (ger maximal kontrast bäst för en nybörjare)
PIN4 eller RS (Registrera val) till PD6 i uC
PIN5 eller RW (läs / skriv) till marken (sätter LCD i läsläge underlättar kommunikationen för användaren)
PIN6 eller E (Aktivera) till PD5 för uC
PIN7 eller D0 till PB0 för uC
PIN8 eller D1 till PB1 i uC
PIN9 eller D2 till PB2 i uC
PIN10 eller D3 till PB3 i uC
PIN11 eller D4 till PB4 i uC
PIN12 eller D5 till PB5 i uC
PIN13 eller D6 till PB6 i uC
PIN14 eller D7 till PB7 i uC
I kretsen kan du se att vi har använt 8-bitars kommunikation (D0-D7) men detta är inte obligatoriskt, vi kan använda 4-bitars kommunikation (D4-D7) men med 4-bitars kommunikationsprogram blir lite komplext. Så som visas i ovanstående tabell ansluter vi 10 stift LCD till styrenheten där 8 stift är datapinnar och 2 stift för kontroll.
Växla en är för att möjliggöra justeringsfunktion mellan larm och tid. Om stiftet är lågt kan vi justera alarmtiden genom att trycka på knapparna. Om dess höga knappar är för att justera bara TID. Det finns fyra knappar här, först är det att öka MINUTER i alarm eller tid. Andra är för minskning MINUTER i larm eller tid. Tredje är att öka HOUR i larm eller tid. FJÄRDE är för minskning av TIMMAR i larm eller tid.
Kondensatorerna som finns här är till för att upphäva knapparnas studsande effekt. Om de tas bort kan styrenheten räkna mer än en varje gång du trycker på knappen. Motstånden som är anslutna för stift är för att begränsa strömmen när du trycker på knappen för att dra ner stiften till marken.
Närhelst en knapp trycks ned dras motsvarande stift av styrenheten ner till marken och därmed känner styrenheten igen att en viss knapp trycks in och motsvarande åtgärder vidtas.
Först och främst är klockan vi väljer här 11059200 Hz, dividerar den med 1024 ger 10800. Så för varje sekund får vi 10800 pulser. Så vi ska starta en räknare med 1024 förskalare för att få räknaren till 10800 Hz. För det andra ska vi använda läget CTC (Clear Timer Counter) för ATMEGA. Det kommer att finnas ett 16-bitars register där vi kan lagra ett värde (jämför värde) när räknaren räknar upp till jämförelsevärdet som ett avbrott är inställt på att generera.
Vi kommer att ställa in jämförelsevärdet till 10800, så i princip kommer vi att ha en ISR (Interrupt Service Routine på varje jämförelse) för varje sekund. Så vi kommer att använda den här rutinen för att få den klocka vi behövde.
BRUN (WGM10-WGM13): Dessa bitar är för att välja driftläge för timer.
Nu eftersom vi vill ha CTC-läget med jämförvärdet i OCR1A-byte, måste vi bara ställa in WGM12 till en, återstående är kvar eftersom de är noll som standard.
RÖDT (CS10, CS11, CS12): Dessa tre bitar är för att välja prescalar och för att få lämplig motklocka.
Eftersom vi vill ha en 1024 som förskalning måste vi ställa in både CS12 och CS10.
Nu finns det ett annat register som vi bör överväga:
GRÖN (OCIE1A): Denna bit måste ställas in för att få ett avbrott vid jämförelsematch mellan räknarvärde och OCR1A-värde (10800) som vi ställer in.
OCR1A-värde (counter jämförvärde) skrivs i ovanstående register.
Programmeringsförklaring
Väckarklockans funktion förklaras steg för steg i nedanstående kod:
#include // header för att möjliggöra dataflödeskontroll över pins #define F_CPU 1000000 // berättar styrenhetens kristallfrekvens bifogad