I dette prosjektet skal vi designe en enkel vekkerklokke ved hjelp av ATMEGA32 timere. ATmega32A mikrokontroller har en 16-bits tidtaker, og vi vil bruke den tidtakeren til å telle sekunder og utvikle en digital klokke.
Alle de digitale klokkene har en krystall inni seg som er hjertet til klokken. Denne krystallet er ikke bare til stede i klokken, men til stede i alle sanntidssystemer for databehandling. Denne krystallen genererer klokkepulser, noe som er nødvendig for tidsberegninger. Selv om det er noen andre måter å få klokkepulser på, men for nøyaktighet og høyere frekvens, foretrekker de mest krystallbasert klokke. Vi skal koble en krystall til ATMEGA32 for å få nøyaktig klokke.
Komponenter kreves
Maskinvare: ATmega32 mikrokontroller, 11.0592MHz krystall, 22pF kondensator (2 stk), Strømforsyning (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), 100uF kondensator (koblet over strømforsyning), knapper (fire deler), 10KΩ motstand (seks stykker), 100nF kondensator (fire deler), Tre pinners brytere (2 stk), 2N2222 transistor, summer, 200Ω motstand.
Programvare: Atmel studio 6.1, progisp eller flash magi.
Kretsdiagram og arbeidsforklaring
For nøyaktig timing har vi koblet en 11.0592MHz krystall for klokke. Nå for å deaktivere den interne klokken til ATMEGA, må vi endre dens LOW FUSE BITS. Husk at vi ikke berører de høye sikringsbitene, slik at JTAG-kommunikasjonen fortsatt er aktivert.
For å fortelle ATMEGA å deaktivere intern klokke og å jobbe med ekstern, må vi stille:
LAV BRUK BYTE = 0xFF eller 0b11111111.
I kretsen er PORTB på ATMEGA32 koblet til dataport LCD. Her bør man huske å deaktivere JTAG-kommunikasjonen i PORTC for ATMEGA ved å endre høye sikringsbyte, hvis man vil bruke PORTC som en vanlig kommunikasjonsport. I 16x2 LCD er det 16 pinner overalt hvis det er svart lys, hvis det ikke er noe bakgrunnslys, vil det være 14 pinner. Man kan drive eller la baklyspinnene ligge. Nå i de 14 pinnene er det 8 datapinner (7-14 eller D0-D7), 2 strømforsyningspinner (1 & 2 eller VSS & VDD eller GND & + 5V), 3. pinne for kontrastkontroll (VEE-styrer hvor tykke tegnene skal være vist), og 3 kontrollpinner (RS & RW & E)
I kretsen kan du observere at jeg bare har tatt to kontrollpinner. Dette gir fleksibiliteten til bedre forståelse, kontrastbiten og LES / SKRIV brukes ikke ofte slik at de kan kortsluttes til bakken. Dette setter LCD i høyest kontrast og lesemodus. Vi trenger bare å kontrollere ENABLE- og RS-pinner for å sende tegn og data tilsvarende.
Tilkoblingene som gjøres for LCD er gitt nedenfor:
PIN1 eller VSS til bakken
PIN2 eller VDD eller VCC til + 5v strøm
PIN3 eller VEE til jord (gir maksimal kontrast best for en nybegynner)
PIN4 eller RS (Register Selection) til PD6 i uC
PIN5 eller RW (lese / skrive) til bakken (setter LCD i lesemodus letter kommunikasjonen for brukeren)
PIN6 eller E (Aktiver) til PD5 på uC
PIN7 eller D0 til PB0 av uC
PIN8 eller D1 til PB1 av uC
PIN9 eller D2 til PB2 av uC
PIN10 eller D3 til PB3 av uC
PIN11 eller D4 til PB4 i uC
PIN12 eller D5 til PB5 av uC
PIN13 eller D6 til PB6 av uC
PIN14 eller D7 til PB7 i uC
I kretsen kan du se at vi har brukt 8bit kommunikasjon (D0-D7) men dette er ikke obligatorisk, vi kan bruke 4bit kommunikasjon (D4-D7), men med 4 bit kommunikasjonsprogram blir det litt komplisert. Så som vist i tabellen ovenfor kobler vi 10 pinner på LCD til kontrolleren der 8 pinner er datapinner og 2 pinner for kontroll.
Bryter en er for å aktivere justeringsfunksjonen mellom alarm og tid. Hvis pinnen er lav, kan vi justere alarmtiden ved å trykke på knappene. Hvis de høye knappene er for å justere bare TID. Det er fire knapper til stede her, først er det å øke MINUTTER i alarm eller tid. Andre er for reduksjon MINUTTER i alarm eller tid. Tredje er for økning HOUR i alarm eller tid. FJERDE er for avtakelse HOURS i alarm eller tid.
Kondensatorene som er tilstede her, er for å oppheve den hoppende effekten av knapper. Hvis de fjernes, kan kontrolleren telle mer enn én hver gang du trykker på knappen. Motstandene som er koblet til pinner, er for å begrense strømmen når du trykker på knappen for å trekke ned pinnen til bakken.
Hver gang du trykker på en knapp, blir den korresponderende kontrollpinnen trukket ned til bakken, og dermed gjenkjenner kontrolleren at det trykkes på en bestemt knapp, og tilsvarende handling utføres.
Først og fremst er klokken vi velger her 11059200 Hz, og deler den med 1024 gir 10800. Så for hvert sekund får vi 10800 pulser. Så vi skal starte en teller med 1024 prescaler for å få telleren til 10800 Hz. For det andre skal vi bruke CTC (Clear Timer Counter) -modus for ATMEGA. Det vil være et 16-biters register hvor vi kan lagre en verdi (sammenligne verdi) når telleren teller opp til sammenligningsverdien et avbrudd er satt til å generere.
Vi skal sette sammenligningsverdien til 10800, så i utgangspunktet vil vi ha en ISR (Interrupt Service Routine på hver sammenligning) for hvert sekund. Så vi skal bruke denne tidlige rutinen for å få klokken vi trengte.
BRUN (WGM10-WGM13): Disse bitene er for å velge driftsmodus for timer.
Nå siden vi vil ha CTC-modus med sammenligningsverdi i OCR1A-byte, må vi bare sette WGM12 til en, de gjenværende blir igjen som de er som standard null.
RØD (CS10, CS11, CS12): Disse tre bitene er for å velge prescalar og for å få passende motklokke.
Siden vi vil ha en 1024 som forhåndsskalering, må vi stille inn både CS12 og CS10.
Nå er det et annet register som vi bør vurdere:
GRØNN (OCIE1A): Denne biten må settes for å få et avbrudd i sammenligningskampen mellom tellerverdien og OCR1A-verdien (10800) som vi setter.
OCR1A-verdi (mot sammenligningsverdi), er skrevet i registeret ovenfor.
Programmering Forklaring
Arbeidet med vekkerklokke forklares trinn for trinn i koden nedenfor:
#include // header for å aktivere datastrømskontroll over pins #define F_CPU 1000000 // fortelle kontrollerens krystallfrekvens knyttet #include