Šiame projekte mes suprojektuosime paprastą žadintuvą, naudodami ATMEGA32 laikmačius. „ATmega32A“ mikrovaldiklis turi 16 bitų laikmatį, kurį naudosime skaičiuodami sekundes ir kurdami skaitmeninį laikrodį.
Visuose skaitmeniniuose laikrodžiuose yra kristalas, kuris yra laikrodžio širdis. Šis kristalas yra ne tik laikrodyje, bet ir visose skaičiuojamose realaus laiko sistemose. Šis kristalas generuoja laikrodžio impulsus, kurie reikalingi skaičiuojant laiką. Nors yra keletas kitų būdų gauti laikrodžio impulsus, tačiau tikslumui ir aukštesniam dažniui labiausiai patinka kristalinis laikrodis. Norėdami gauti tikslų laikrodį, prie ATMEGA32 prijungsime kristalą.
Būtini komponentai
Aparatūra: mikrovaldiklis ATmega32, 11.0592MHz kristalas, 22pF kondensatorius (2 vnt.), Maitinimo šaltinis (5v), AVR-ISP PROGRAMMERIS, JHD_162ALCD (16x2 LCD), 100uF kondensatorius (prijungtas prie maitinimo šaltinio), mygtukai (keturi elementai), 10KΩ rezistorius (šeši vnt.), 100nF talpos (keturi vnt.), trijų kontaktų jungikliai (2 vnt.), 2N2222 tranzistorius, „Buzzer“, 200Ω rezistorius
Programinė įranga: „ Atmel studio 6.1“, „progisp“ arba „flash magic“.
Grandinės schema ir darbo paaiškinimas
Norėdami tiksliai nustatyti laiką, laikrodžiui prijungėme 11,0592 MHz kristalą. Dabar, norėdami išjungti vidinį ATMEGA laikrodį, turime pakeisti jo LOW FUSE BITS. Atminkite, kad neliečiame aukštų saugiklių antgalių, todėl JTAG ryšys vis tiek bus įjungtas.
Norėdami pasakyti ATMEGA išjungti vidinį laikrodį ir dirbti su išoriniu, turime nustatyti:
MAŽAS NAUDOJIMAS BYTE = 0xFF arba 0b11111111.
ATMEGA32 PORTB grandinėje yra prijungtas prie duomenų prievado LCD. Čia reikia nepamiršti išjungti JTAG ryšio ATMEGA PORTC, keičiant aukšto saugiklio baitus, jei norite naudoti PORTC kaip įprastą ryšio prievadą. 16x2 LCD ekrane yra 16 kontaktų, jei šviečia juoda lemputė, jei nėra užpakalinės šviesos, bus 14 kontaktų. Galima maitinti arba palikti galinio apšvietimo kaiščius. Dabar 14 kaiščių yra 8 duomenų kaiščiai (7-14 arba D0-D7), 2 elektros tiekimo kaiščių (1 & 2 arba Vss & VDD arba GND & + 5V), 3 -oji kaištis kontrasto valdymas (V formos,-kontroliuoja, kaip storio simboliai turėtų būti ir 3 valdymo kaiščiai (RS & RW & E)
Grandinėje galite pastebėti, kad aš paėmiau tik du valdymo kaiščius. Tai suteikia lankstumo geriau suprasti, kontrasto bitai ir READ / WRITE nėra dažnai naudojami, todėl juos galima sutrumpinti. Tai padidina LCD kontrasto ir skaitymo režimą. Mes tiesiog turime valdyti ENABLE ir RS smeigtukus, kad galėtume atitinkamai siųsti simbolius ir duomenis.
LCD jungtys pateikiamos žemiau:
PIN1 arba VSS į žemę
PIN2 arba VDD arba VCC iki + 5v maitinimo
PIN3 arba VEE į žemę (suteikia maksimalų kontrastą pradedantiesiems)
PIN4 arba RS (registracijos pasirinkimas) į uC PD6
PIN5 arba RW (skaitymas / rašymas) į žemę (įjungus skystųjų kristalų ekraną skaitymo režimu, palengvinamas ryšys vartotojui)
PIN6 arba E (įjungti) į uC PD5
PIN7 arba D0 - PB0 iš uC
UC PIN8 arba D1 – PB1
PIN9 arba D2 – PB2 iš uC
U10 PIN10 arba D3 – PB3
PIN11 arba D4 – PB4 iš uC
U12 PIN12 arba D5 – PB5
U13 PIN13 arba D6 – PB6
U14 PIN14 arba D7 – PB7
Grandinėje matote, kad mes naudojome 8 bitų ryšį (D0-D7), tačiau tai nėra privaloma, mes galime naudoti 4 bitų ryšį (D4-D7), tačiau su 4 bitų ryšio programa tampa šiek tiek sudėtinga. Taigi, kaip parodyta aukščiau pateiktoje lentelėje, mes prijungiame 10 LCD kontaktų su valdikliu, kuriame 8 kontaktai yra duomenų kaiščiai ir 2 valdikliai.
Jungiklis vienas skirtas įjungti reguliavimo funkciją tarp žadintuvo ir laiko. Jei kaištis yra žemas, mes galime reguliuoti aliarmo laiką paspausdami mygtukus. Jei jo aukšti mygtukai skirti tik TIME koregavimui. Čia yra KETURI mygtukai. Pirmiausia tai yra MINUTES žingsnis po žadintuvo ar laiko. Antra - sumažinant MINUTES žadintuvo ar laiko. Trečia, tai yra HOUR prieaugis po žadintuvo ar laiko. KETVIRTA yra sumažinus HOURS pavojaus signalą arba laiką.
Čia esantys kondensatoriai skirti panaikinti mygtukų atšokimo efektą. Jei jie bus pašalinti, valdiklis kiekvieną kartą paspaudus mygtuką gali suskaičiuoti daugiau nei vieną. Smeigtukams prijungti rezistoriai yra skirti srovei riboti, kai mygtukas paspaudžiamas kaiščiui žemyn nuleisti.
Kai tik paspaudžiamas mygtukas, atitinkamas valdiklio kaištis nusileidžia ant žemės, taigi valdiklis atpažįsta, kad paspaudžiamas tam tikras mygtukas ir imamasi atitinkamų veiksmų.
Pirmiausia, mūsų pasirinktas laikrodis yra 11059200 Hz, padalijus jį iš 1024, gaunama 10800. Taigi už kiekvieną sekundę gauname 10800 impulsų. Taigi mes pradėsime skaitiklį su 1024 preskaleriu, kad gautume skaitiklio laikrodį kaip 10800 Hz. Antra, mes naudosime ATMEGA CTC (Clear Timer Counter) režimą. Bus 16 bitų registras, kuriame galėsime išsaugoti vertę (palyginti vertę), kai skaitiklis suskaičiuos iki palyginimo vertės, kurią generuos pertraukimas.
Palyginamąją vertę nustatysime į 10800, taigi iš esmės kiekvieną sekundę turėsime ISR („Interrupt Service Routine“ kiekviename palyginime). Taigi naudosimės šia laiku, kad gautume reikalingą laikrodį.
BROWN (WGM10-WGM13): Šie bitai skirti laikmačio veikimo režimui pasirinkti.
Kadangi norime, kad CTC režimas būtų lyginamas su OCR1A baito verte, mes tiesiog turime nustatyti WGM12 į vieną, likę likę, nes pagal numatytuosius nustatymus jie yra nulis.
RAUDONA (CS10, CS11, CS12): Šie trys bitai skirti pasirinkti išankstinį skalę ir taip gauti tinkamą skaitiklį.
Kadangi norime, kad išankstinis skalės dydis būtų 1024, turime nustatyti ir CS12, ir CS10.
Dabar yra dar vienas registras, kurį turėtume apsvarstyti:
ŽALIA (OCIE1A): Šis bitas turi būti nustatytas norint gauti pertrauką palyginant mūsų skaitiklio vertės ir OCR1A vertės (10800) atitiktį.
OCR1A vertė (skaitiklio palyginimo vertė), įrašyta aukščiau esančiame registre.
Programavimo paaiškinimas
Žadintuvo veikimas žingsnis po žingsnio paaiškinamas žemiau esančiame kode:
#include // antraštė, kad būtų galima valdyti duomenų srautą per kaiščius #define F_CPU 1000000 // pridedamas valdiklio kristalo dažnis