I dette projekt skal vi designe et simpelt vækkeur ved hjælp af ATMEGA32-timere. ATmega32A mikrocontroller har en 16 bit timer, og vi vil bruge denne timer til at tælle sekunder og udvikle et digitalt ur.
Alle de digitale ure har en krystal indeni, hvilket er hjertet i uret. Denne krystal er ikke kun til stede i uret, men til stede i alle computere i realtidssystemer. Denne krystal genererer urimpulser, hvilket er nødvendigt til timingberegninger. Selvom der er nogle andre måder at få urimpulser på, men for nøjagtighed og højere frekvens foretrækker de mest krystalbaseret ur. Vi skal forbinde en krystal til ATMEGA32 for at få nøjagtigt ur.
Komponenter, der kræves
Hardware: ATmega32 mikrokontroller, 11.0592MHz krystal, 22pF kondensator (2 stk.), Strømforsyning (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), 100uF kondensator (tilsluttet på tværs af strømforsyning), knapper (fire stykker), 10KΩ modstand (seks stykker), 100nF kondensator (fire stykker), Tre pin-afbrydere (2 stykker), 2N2222 transistor, summer, 200Ω modstand.
Software: Atmel studio 6.1, progisp eller flash-magi.
Kredsløbsdiagram og arbejdsforklaring
For nøjagtig timing har vi tilsluttet en 11.0592MHz krystal til uret. Nu for at deaktivere ATMEGAs interne ur er vi nødt til at ændre dets LAVE SIKRINGSBIT. Husk, at vi ikke rører ved de høje sikringsbits, så JTAG-kommunikationen stadig er aktiveret.
For at fortælle ATMEGA at deaktivere internt ur og arbejde på eksternt skal vi indstille:
BYTE MED LAV BRUG = 0xFF eller 0b11111111.
I kredsløb er PORTB på ATMEGA32 forbundet til dataport LCD. Her skal man huske at deaktivere JTAG-kommunikationen i PORTC i ATMEGA ved at ændre de høje sikringsbyte, hvis man vil bruge PORTC som en normal kommunikationsport. I 16x2 LCD er der overalt 16 ben, hvis der er et sort lys, hvis der ikke er noget baglys, vil der være 14 ben. Man kan tænde eller lade bagbelysningsstifterne stå. Nu i de 14 stifter er der 8 data stifter (7-14 eller D0-D7), 2 Strømforsyning stifter (1 & 2 eller VSS & VDD eller gnd & + 5V), 3 rd pin for kontraststyring (VEE-styringer, hvor tyk tegnene bør være vist) og 3 kontrolben (RS & RW & E)
I kredsløbet kan du se, at jeg kun har taget to kontrolben. Dette giver fleksibiliteten med bedre forståelse, kontrastbit og LÆS / SKRIV bruges ikke ofte, så de kan kortsluttes til jorden. Dette sætter LCD i højeste kontrast og læsetilstand. Vi skal bare kontrollere ENABLE og RS-ben for at sende tegn og data i overensstemmelse hermed.
Forbindelserne, der foretages for LCD, er angivet nedenfor:
PIN1 eller VSS til jord
PIN2 eller VDD eller VCC til + 5v strøm
PIN3 eller VEE til jorden (giver maksimal kontrast bedst for en nybegynder)
PIN4 eller RS (Registrer valg) til PD6 i uC
PIN5 eller RW (læse / skrive) til jorden (sætter LCD i læsefunktion letter kommunikationen for brugeren)
PIN6 eller E (Aktivér) til PD5 i uC
PIN7 eller D0 til PB0 i uC
PIN8 eller D1 til PB1 i uC
PIN9 eller D2 til PB2 i uC
PIN10 eller D3 til PB3 af uC
PIN11 eller D4 til PB4 i uC
PIN12 eller D5 til PB5 af uC
PIN13 eller D6 til PB6 i uC
PIN14 eller D7 til PB7 i uC
I kredsløbet kan du se, at vi har brugt 8bit kommunikation (D0-D7), men dette er ikke obligatorisk, vi kan bruge 4bit kommunikation (D4-D7), men med 4 bit kommunikationsprogram bliver lidt komplekst. Så som vist i ovenstående tabel forbinder vi 10 ben på LCD til controller, hvor 8 ben er datapinde og 2 ben til kontrol.
Skift et er til aktivering af justeringsfunktion mellem alarm og tid. Hvis stiften er lav, kan vi justere alarmtiden ved at trykke på knapperne. Hvis de høje knapper kun er til justering af TID. Der er fire knapper til stede her, den første er til forøgelse af MINUTTER i alarm eller tid. Andet er for mindskelse MINUTTER i alarm eller tid. Tredje er til forøgelse af HOUR i alarm eller tid. FJERDE er til formindskelse af TIMER i alarm eller tid.
De kondensatorer, der er til stede her, er til at annullere knappernes hoppende effekt. Hvis de fjernes, tæller controlleren muligvis mere end en hver gang der trykkes på knappen. Modstandene, der er forbundet til stifter, er til at begrænse strømmen, når der trykkes på knappen for at trække stiften ned til jorden.
Hver gang der trykkes på en knap, trækkes den tilsvarende kontrolpind ned til jorden, og controlleren genkender således, at der trykkes på en bestemt knap, og den tilsvarende handling udføres.
Først og fremmest er uret, vi vælger her, 11059200 Hz, divideret med 1024 giver 10800. Så for hvert sekund får vi 10800 impulser. Så vi skal starte en tæller med 1024 prescaler for at få tælleruret til 10800 Hz. For det andet skal vi bruge CTC (Clear Timer Counter) -tilstanden til ATMEGA. Der vil være et 16-bit register, hvor vi kan gemme en værdi (sammenligne værdi), når tælleren tæller op til sammenligningsværdien, en afbrydelse er indstillet til at generere.
Vi vil indstille sammenligningsværdien til 10800, så dybest set har vi en ISR (Interrupt Service Routine på hver sammenligning) for hvert sekund. Så vi vil bruge denne rettidige rutine til at få det ur, vi havde brug for.
BRUN (WGM10-WGM13): Disse bits er til valg af driftstilstand for timer.
Nu da vi vil have CTC-tilstand med sammenligningsværdi i OCR1A-byte, er vi bare nødt til at indstille WGM12 til en, de resterende er tilbage, da de er nul som standard.
RØD (CS10, CS11, CS12): Disse tre bits er til valg af prescalar og for at få passende mod ur.
Da vi vil have en 1024 som prescaling, er vi nødt til at indstille både CS12 og CS10.
Nu er der et andet register, som vi skal overveje:
GRØN (OCIE1A): Denne bit skal indstilles for at få en afbrydelse i sammenligningskamp mellem tællerværdi og OCR1A-værdi (10800), som vi indstiller.
OCR1A-værdi (tællersammenligningsværdi) er skrevet i ovenstående register.
Programmering Forklaring
Funktionen af vækkeur forklares trin for trin i nedenstående kode:
#include // header for at aktivere datastrømskontrol over pins #define F_CPU 1000000 // fortæller controller krystalfrekvens vedhæftet #include