Ebben a projektben egy egyszerű ébresztőórát fogunk megtervezni ATMEGA32 időzítők segítségével. Az ATmega32A mikrovezérlő 16 bites időzítővel rendelkezik, és ezt az időzítőt használjuk a másodpercek számolásához és egy digitális óra fejlesztéséhez.
Az összes digitális órában van egy kristály, amely az óra szíve. Ez a kristály nemcsak az órában van jelen, hanem minden számítástechnikai valós idejű rendszerben. Ez a kristály óraimpulzusokat generál, amelyekre az időzítés számításához van szükség. Bár van néhány más módszer is az óraimpulzusok megszerzésére, de a pontosság és a magasabb frekvencia érdekében a kristályalapú órát részesítik előnyben. Csatlakoztatunk egy kristályt az ATMEGA32-hez a pontos óra érdekében.
Szükséges alkatrészek
Hardver: ATmega32 mikrovezérlő, 11.0592MHz kristály, 22pF kondenzátor (2 db), tápegység (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), 100uF kondenzátor (a tápegységen keresztül csatlakoztatva), gombok (négy darab), 10KΩ ellenállás (hat darab), 100nF kapacitású r (négy darab), három tűs kapcsoló (2 db), 2N2222 tranzisztor, hangjelző, 200Ω ellenállás.
Szoftver: Atmel studio 6.1, progisp vagy flash magic.
Áramköri ábra és működési magyarázat
A pontos időzítés érdekében egy 11,0592 MHz-es kristályt csatlakoztattunk az órához. Az ATMEGA belső órájának kikapcsolásához meg kell változtatnunk a LOW FUSE BIT-eket. Ne feledje, hogy nem nyúlunk a magas biztosíték bitekhez, így a JTAG kommunikáció továbbra is engedélyezve lenne.
Be kell állítanunk az ATMEGA-t, hogy kapcsolja ki a belső órát, és működjön a külsőn:
ALACSONY HASZNÁLAT BYTE = 0xFF vagy 0b11111111.
Az ATMEGA32 PORTB áramkörében az LCD adatátviteli port csatlakozik. Itt nem szabad elfelejteni letiltani a JTAG kommunikációt az ATMEGA PORTC-jában a nagy biztosítékú bájtok megváltoztatásával, ha a PORTC-ot normál kommunikációs portként akarja használni. A 16x2 LCD-ben 16 érintkező van, ha fekete a fény, ha nincs háttérvilágítás, akkor 14 tű lesz. A hátsó lámpa csapjai bekapcsolhatók, vagy elhagyhatók. Most a 14 csapok vannak 8 adatok csapok (7-14 vagy D0-D7), 2 tápegység csapok (1 & 2 vagy VSS & VDD vagy GND & + 5V), 3 rd pin kontraszt vezérlő (VEE-kontrollok milyen vastag a karaktereket kell lennie ábra), és 3 vezérlőcsap (RS & RW & E)
Az áramkörben megfigyelheti, hogy csak két vezérlőtűt vettem. Ez rugalmasságot biztosít a jobb megértéshez, a kontrasztbitet és a READ / WRITE-t nem használják gyakran, így testzárlat lehet. Ez az LCD-t a legnagyobb kontrasztú és olvasási módba helyezi. Csak az ENABLE és RS csapokat kell vezérelnünk, hogy a karaktereket és az adatokat ennek megfelelően küldhessük el.
Az LCD-hez kapcsolódó csatlakozások az alábbiak:
PIN1 vagy VSS a földre
PIN2 vagy VDD vagy VCC + 5v teljesítményig
PIN3 vagy VEE földelés (a legjobb kontrasztot nyújtja a kezdőknek)
PIN4 vagy RS (Register Selection) az uC PD6-jához
PIN5 vagy RW (olvasás / írás) a földre (az LCD-t olvasási módba állítja, megkönnyíti a kommunikációt a felhasználó számára)
PIN6 vagy E (engedélyezés) az uC PD5-ére
PIN7 vagy D0 - PB0 az uC-nél
PIN8 vagy D1 - PB1 az uC-nél
PIN9 vagy D2 - PB2 az uC-től
Az uC PIN10 vagy D3 - PB3
PIN11 vagy D4 - PB4 az uC-nél
PIN12 vagy D5 - PB5 az uC-től
PIN13 vagy D6 - PB6 az uC-től
PIN14 vagy D7 - PB7 az uC-től
Az áramkörben látható, hogy 8 bites kommunikációt (D0-D7) használtunk, de ez nem kötelező, használhatunk 4 bites kommunikációt (D4-D7), de a 4 bites kommunikációs program kissé összetetté válik. Tehát, amint a fenti táblázat mutatja, 10 érintkezõ LCD-t csatlakoztatunk a vezérlõhöz, amelyben 8 érintkezõ adat és 2 érintkezõ a vezérléshez.
Az egyik kapcsoló a riasztás és az idő közötti beállítási funkció engedélyezésére szolgál. Ha a tű alacsony, a gombok megnyomásával beállíthatjuk a riasztási időt. Ha a magas gombjai csak a TIME beállítására szolgálnak. NÉGY gomb van itt, először MINUTES lépésenként, riasztás vagy idő esetén. A második a percek csökkentése riasztás vagy idő esetén. A harmadik a HOUR növelésére szolgál riasztásban vagy időben. A NEGYEDIK a HOURS csökkentésére szolgál riasztás vagy idő szerint.
Az itt található kondenzátorok a gombok pattogó hatásának semmissé tételére szolgálnak. Ha eltávolítják őket, akkor a vezérlő a gomb minden egyes megnyomásakor többet is számlálhat. A csapokhoz kapcsolt ellenállások az áram korlátozására szolgálnak, amikor a gombot megnyomják a csap földre húzásához.
Amikor egy gombot megnyomnak, a vezérlő megfelelő csapja lehúzódik a földre, és így a vezérlő felismeri, hogy bizonyos gombot megnyomtak és a megfelelő műveletet végrehajtották.
Először is, az itt választott óra 11059200 Hz, 1024-vel elosztva 10800-at kapunk. Tehát minden másodpercre 10800 impulzust kapunk. Tehát elindítunk egy számlálót egy 1024 előmérővel, hogy a számláló órája 10800 Hz legyen. Másodszor az ATMEGA CTC (Clear Timer Counter) módját fogjuk használni. Lesz egy 16 bites regiszter, ahol tárolhatunk egy értéket (összehasonlító érték), amikor a számláló az összehasonlítás értékéig számít, amelyet egy megszakítás generál.
Az összehasonlítási értéket 10800-ra fogjuk állítani, így alapvetően minden másodpercben lesz egy ISR (Interrupt Service Routine minden összehasonlításban). Tehát ezt az időszerű rutint fogjuk használni a kívánt óra megszerzéséhez.
BARNA (WGM10-WGM13): Ezek a bitek az időzítő működési módjának kiválasztására szolgálnak.
Mivel az OCR1A bájtban a CTC módot akarjuk összehasonlítani, csak a WGM12-et kell beállítanunk, a maradék marad, mivel alapértelmezés szerint nulla.
VÖRÖS (CS10, CS11, CS12): Ez a három bit az előkalar kiválasztására és a megfelelő számlálóóra megszerzésére szolgál.
Mivel egy 1024-et akarunk előskálázni, be kell állítanunk mind a CS12, mind a CS10 értéket.
Most van egy másik regiszter, amelyet figyelembe kell vennünk:
ZÖLD (OCIE1A): Ezt a bitet be kell állítani, hogy megszakítást kapjunk a számláló és az általunk beállított OCR1A érték (10800) közötti összehasonlításhoz.
Az OCR1A érték (számláló összehasonlító értéke) a fenti regiszterbe van írva.
Programozási magyarázat
Az ébresztőóra működését lépésről lépésre magyarázzák az alábbi kódban:
#include // fejléc az adatáramlás vezérlésének engedélyezéséhez a csapok felett #define F_CPU 1000000 // megmondja a vezérlő kristály frekvenciáját