V tem projektu bomo zasnovali preprosto budilko z uporabo časovnikov ATMEGA32. Mikrokrmilnik ATmega32A ima 16-bitni časovnik in s tem časovnikom bomo šteli sekunde in razvijali digitalno uro.
Vse digitalne ure imajo v sebi kristal, ki je srce ure. Ta kristal ni prisoten samo v uri, temveč je prisoten v vseh računalniških sistemih v realnem času. Ta kristal generira urne impulze, ki so potrebni za izračun časa. Čeprav obstajajo nekateri drugi načini za pridobivanje urnih impulzov, vendar za natančnost in višjo frekvenco večina raje ima kristalno uro. Za natančno uro bomo na ATMEGA32 povezali kristal.
Potrebne komponente
Strojna oprema: Mikrokrmilnik ATmega32, kristal 11.0592MHz, kondenzator 22pF (2 kosa), napajalnik (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), kondenzator 100uF (priključen na napajalnik), gumbi (štirje kosi), upor 10KΩ (šest kosov), 100nF kondenzator (štirje kosi), tri-polna stikala (2 kosa), tranzistor 2N2222, zvočni signal, upor 200Ω.
Programska oprema: Atmel studio 6.1, progisp ali flash magic.
Shema vezja in delovna razlaga
Za natančno merjenje časa smo priklopili kristal 11.0592MHz za uro. Zdaj za onemogočanje notranje ure ATMEGA moramo spremeniti NJEGOVE BITKE. Ne pozabite, da se ne dotikamo visokih varovalk, zato bi bila komunikacija JTAG še vedno omogočena.
Če želite povedati ATMEGA, naj onemogoči notranjo uro in deluje na zunanji, moramo nastaviti:
BAJT ZA NIZKO UPORABO = 0xFF ali 0b11111111.
V vezju PORTB ATMEGA32 je priključen na podatkovni vhod LCD. Tu ne pozabite onemogočiti komunikacije JTAG v PORTC-ju ATMEGA s spreminjanjem bajtov z visokimi varovalkami, če želite uporabiti PORTC kot običajna komunikacijska vrata. V LCD 16x2 je 16 čepkov, če je črna luč, če ni zadnje luči, bo 14 nožic. Lahko napajate ali pustite zatiče zadnje luči. Sedaj v 14 zatiči obstaja 8 podatkovnih zatiči (7-14 ali D0-D7), 2 Mrežni zatiči (1 & 2 ali VSS in VDD ali gnd in +5), 3 rd pin za nadzor kontrasta (vee-kontrole kako debela mora biti znake prikazano) in 3 krmilne nožice (RS & RW & E)
V vezju lahko opazite, da sem vzel le dva kontrolna zatiča. To omogoča fleksibilnost boljšega razumevanja, kontrastni bit in READ / WRITE se ne uporabljata pogosto, zato jih je mogoče kratko skleniti na tla. To LCD zaslon postavi v najvišji kontrast in način branja. Samo nadzorovati moramo ENABLE in RS pin, da ustrezno pošljemo znake in podatke.
Povezave za LCD so podane spodaj:
PIN1 ali VSS na ozemljitev
PIN2 ali VDD ali VCC do + 5v moči
PIN3 ali VEE na tla (za začetnike daje največji kontrast)
PIN4 ali RS (Register Selection) na PD6 uC
PIN5 ali RW (branje / pisanje) na ozemljitev (LCD v načinu branja olajša komunikacijo za uporabnika)
PIN6 ali E (Omogoči) do PD5 uC
PIN7 ali D0 do PB0 uC
PIN8 ali D1 do PB1 uC
PIN9 ali D2 do PB2 uC
PIN10 ali D3 do PB3 uC
PIN11 ali D4 do PB4 uC
PIN12 ali D5 do PB5 uC
PIN13 ali D6 do PB6 uC
PIN14 ali D7 do PB7 uC
V vezju lahko vidite, da smo uporabili 8-bitno komunikacijo (D0-D7), vendar to ni obvezno, lahko uporabimo 4-bitno komunikacijo (D4-D7), vendar s 4-bitnim komunikacijskim programom postane nekoliko zapleten. Kot je prikazano v zgornji tabeli, na krmilnik povežemo 10 zatičev LCD, v katerih je 8 zatičev podatkovnih zatičev in 2 zatiča za nadzor.
Preklopite eno, da omogočite prilagoditev funkcije med alarmom in časom. Če je zatič nizek, lahko nastavimo čas alarma s pritiskom na gumbe. Če so njegovi visoki gumbi namenjeni samo nastavitvi ČASA. Tu so prisotni ŠTIRI gumbi, prvi je za prirast MINUT v alarmu ali času. Drugi je za zmanjšanje MINUTES v alarmu ali času. Tretji je za povečanje HOUR v alarmu ali času. ČETRTO je namenjeno zmanjšanju ur za alarm ali čas.
Tukaj prisotni kondenzatorji izničijo odskočni učinek gumbov. Če jih odstranite, lahko krmilnik vsakič, ko pritisnete gumb, šteje več kot eno. Upori, priključeni na nožice, so namenjeni omejevanju toka, ko pritisnete gumb, da zatič potegnete navzdol na tla.
Vsakič, ko pritisnete gumb, se ustrezni zatič krmilnika potegne navzdol in tako krmilnik prepozna, da je pritisnjen določen gumb, in se izvede ustrezen ukrep.
Najprej je ura, ki jo tukaj izberemo, 11059200 Hz, če jo delimo z 1024, dobimo 10800. Torej za vsako sekundo dobimo 10800 impulzov. Torej bomo začeli števec z 1024 prednamerjevalnikom, da bomo dobili uro števca 10800 Hz. Drugič bomo uporabili način CTC (Clear Timer Counter) načina ATMEGA. Na voljo bo 16-bitni register, kamor lahko shranimo vrednost (primerjamo vrednost), ko števec šteje do primerjalne vrednosti, ki jo nastavi prekinitev.
Vrednost primerjave bomo nastavili na 10800, tako da bomo v osnovi imeli vsako sekundo ISR (Interrupt Service Rutine za vsako primerjavo). Torej bomo uporabili to pravočasno rutino, da dobimo uro, ki smo jo potrebovali.
BROWN (WGM10-WGM13): Ti biti so namenjeni izbiri načina delovanja časovnika.
Ker zdaj želimo način CTC s primerjalno vrednostjo v bajtu OCR1A, moramo samo nastaviti WGM12 na eno, preostali pa ostanejo, saj so privzeto nič.
RDEČA (CS10, CS11, CS12): Ti trije biti so namenjeni izbiri predkalarja in tako pridobivanju ustrezne števce ure.
Ker želimo 1024 kot prednastavitev, moramo nastaviti tako CS12 kot CS10.
Zdaj obstaja še en register, ki bi ga morali upoštevati:
ZELENA (OCIE1A): Ta bit je treba nastaviti, da dobimo prekinitev na primerjalnem ujemanju med vrednostjo števca in vrednostjo OCR1A (10800), ki smo jo nastavili.
Vrednost OCR1A (vrednost primerjave števca) je zapisana v zgornjem registru.
Pojasnilo programiranja
Delovanje budilke je po korakih razloženo v spodnji kodi:
#include // glava za omogočanje nadzora pretoka podatkov nad zatiči #define F_CPU 1000000 // pripovedovanje frekvence kristalne frekvence priložene