Sa proyektong ito ay magdidisenyo kami ng isang simpleng orasan ng Alarm gamit ang mga timer ng ATMEGA32. Ang ATmega32A microcontroller ay may 16 bit timer, at gagamitin namin ang timer na iyon upang mabilang ang mga segundo at bumuo ng isang digital na orasan.
Ang lahat ng mga digital na orasan ay may isang kristal sa loob ng mga ito na kung saan ay ang puso ng orasan. Ang kristal na ito ay hindi lamang naroroon sa orasan ngunit naroroon sa lahat ng mga computing real time system. Ang kristal na ito ay bumubuo ng mga pulso ng orasan, na kinakailangan para sa mga kalkulasyon ng tiyempo. Kahit na may ilang iba pang mga paraan upang makakuha ng pulso ng orasan ngunit para sa kawastuhan at mas mataas na dalas pinaka gusto ng orasan batay sa kristal. Ikonekta namin ang isang kristal sa ATMEGA32 para sa pagkuha ng tumpak na orasan.
Kinakailangan ang Mga Bahagi
Hardware: ATmega32 microcontroller, 11.0592MHz crystal, 22pF Capacitor (2 piraso), Power supply (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), 100uF capacitor (konektado sa buong power supply), mga pindutan (apat na piraso), 10KΩ resistor (anim na piraso), 100nF capacito r (apat na piraso), Tatlong pin switch (2 piraso), 2N2222 transistor, Buzzer, 200Ω risistor.
Software: Atmel studio 6.1, progisp o flash magic.
Circuit Diagram at Paggawa ng Paliwanag
Para sa tumpak na tiyempo, nakakonekta kami ng isang 11.0592MHz na kristal para sa orasan. Ngayon para sa hindi paganahin ang panloob na orasan ng ATMEGA kailangan naming baguhin ang LOW FUSE BITS nito. Tandaan na hindi namin hinahawakan ang mga mataas na piyus ng fuse upang ang JTAG na komunikasyon ay mapagagana pa rin.
Para sa pagsasabi sa ATMEGA na huwag paganahin ang panloob na orasan at upang gumana sa panlabas na kailangan naming itakda:
Mababang GAMIT NG BYTE = 0xFF o 0b11111111.
Sa circuit PORTB ng ATMEGA32 ay konektado sa data port LCD. Narito dapat tandaan na huwag paganahin ang komunikasyon ng JTAG sa PORTC ng ATMEGA sa pamamagitan ng pagbabago ng mataas na fuse bytes, kung nais na gamitin ang PORTC bilang isang normal na port ng komunikasyon. Sa 16x2 LCD mayroong 16 na pin sa lahat kung mayroong isang itim na ilaw, kung walang ilaw sa likod ay magkakaroon ng 14 na mga pin. Maaari ng isang tumakbo o iwanan ang mga light light pin. Ngayon sa 14 na pin mayroong 8 data pin (7-14 o D0-D7), 2 power supply pin (1 & 2 o VSS & VDD o gnd & + 5v), 3 rd pin para sa control ng kaibahan (kinokontrol ng VEE kung gaano dapat makapal ang mga character ipinakita), at 3 control pin (RS & RW & E)
Sa circuit, maaari mong obserbahan na kumuha lamang ako ng dalawang control pin. Nagbibigay ito ng kakayahang umangkop ng mas mahusay na pag-unawa, ang kaibahan ng kaunti at READ / WRITE ay hindi madalas ginagamit upang maaari silang maiksi sa lupa. Inilalagay nito ang LCD sa pinakamataas na kaibahan at mode na basahin. Kailangan lang naming makontrol ang Mga PIN na INABAYAHAN at RS upang magpadala ng mga character at data nang naaayon.
Ang mga koneksyon na tapos para sa LCD ay ibinibigay sa ibaba:
PIN1 o VSS sa lupa
Ang PIN2 o VDD o VCC sa + 5v na lakas
PIN3 o VEE sa lupa (nagbibigay ng pinakamataas na maximum na kaibahan para sa isang nagsisimula)
PIN4 o RS (Pagpili ng Rehistro) sa PD6 ng uC
Ang PIN5 o RW (Basahin / Isulat) sa ground (inilalagay ang LCD sa read mode ay pinapagaan ang komunikasyon para sa gumagamit)
PIN6 o E (Paganahin) sa PD5 ng uC
PIN7 o D0 hanggang PB0 ng uC
PIN8 o D1 hanggang PB1 ng uC
PIN9 o D2 hanggang PB2 ng uC
PIN10 o D3 hanggang PB3 ng uC
PIN11 o D4 hanggang PB4 ng uC
PIN12 o D5 hanggang PB5 ng uC
PIN13 o D6 hanggang PB6 ng uC
PIN14 o D7 hanggang PB7 ng uC
Sa circuit maaari mong makita na ginamit namin ang 8bit na komunikasyon (D0-D7) subalit hindi ito isang sapilitan, maaari naming gamitin ang 4bit na komunikasyon (D4-D7) ngunit sa 4 bit na programa sa komunikasyon ay medyo kumplikado. Kaya't tulad ng ipinakita sa talahanayan sa itaas ay kumokonekta kami ng 10 mga pin ng LCD sa controller kung saan ang 8 mga pin ay mga pin ng data at 2 mga pin para sa kontrol.
Ang switch ng isa ay para sa pagpapagana ng tampok na pagsasaayos sa pagitan ng alarma at oras. Kung mababa ang pin, maaari naming ayusin ang oras ng alarma sa pamamagitan ng pagpindot sa mga pindutan. Kung ang matataas na pindutan nito ay para sa pagsasaayos ng TIME lamang. Mayroong APAT na mga pindutan na naroroon dito, una ay para sa pagtaas ng MINUTES sa alarma o oras. Pangalawa ay para sa pagbawas ng MINUTES sa alarma o oras. Pangatlo ay para sa pagtaas ng HOUR sa alarma o oras. IKAAPAT ay para sa pagbawas ng ORAS sa alarma o oras.
Ang mga capacitor na naroroon dito ay para sa pagpapawalang bisa ng bouncing effect ng mga pindutan. Kung sila ay tinanggal ang controller ay maaaring bilangin ang higit sa isa sa bawat oras na ang pindutan ay pinindot. Ang mga resistor na konektado para sa mga pin ay para sa paglilimita sa kasalukuyang, kapag pinindot ang pindutan upang hilahin ang pin sa lupa.
Kailan man pinindot ang isang pindutan, Ang kaukulang pin ng controller ay mahihila pababa sa lupa at sa gayon makikilala ng tagapamahala na ang ilang pindutan ay pinindot at ang kaukulang aksyon ay kinuha.
Una sa lahat, ang orasan na pinili namin dito ay 11059200 Hz, ang paghahati nito sa 1024 ay nagbibigay sa 10800. Kaya't para sa bawat segundo nakakakuha kami ng 10800 pulso. Sa gayon sisimulan namin ang isang counter na may 1024 prescaler upang makuha ang counter na orasan bilang 10800 Hz. Pangalawa gagamitin namin ang mode na CTC (Clear Timer Counter) ng ATMEGA. Magkakaroon ng isang 16 bit na rehistro kung saan maaari kaming mag-imbak ng isang halaga (ihambing ang halaga), kapag ang counter ay binibilang hanggang sa ihambing na halaga na isang nakakagambala ay nakatakda upang makabuo.
Itatakda namin ang ihambing na halaga sa 10800, kaya karaniwang magkakaroon kami ng ISR (Nakagambala sa Karaniwang Serbisyo sa bawat paghahambing) para sa bawat segundo. Kaya gagamitin namin ang napapanahong gawain na ito upang makuha ang orasan na kailangan namin.
BROWN (WGM10-WGM13): Ang mga bit na ito ay para sa pagpili ng mode ng operasyon para sa timer.
Ngayon dahil nais namin ang CTC mode na may ihambing na halaga sa OCR1A byte, itatakda lamang namin ang WGM12 sa isa, ang natitira ay naiwan dahil ang mga ito ay zero bilang default.
RED (CS10, CS11, CS12): Ang tatlong mga piraso na ito ay para sa pagpili ng prescalar at sa gayon pagkuha ng naaangkop na counter orasan.
Dahil nais namin ang isang 1024 bilang prescaling, kailangan naming itakda ang parehong CS12 at CS10.
Ngayon ay may isa pang rehistro na dapat nating isaalang-alang:
GREEN (OCIE1A): Ang bit na ito ay dapat itakda para sa isang nakakagambala sa paghahambing ng tugma sa pagitan ng counter na halaga at halaga ng OCR1A (10800) na itinakda namin.
Ang halaga ng OCR1A (counter ihambing ang halaga), ay nakasulat sa itaas na pagrehistro.
Paliwanag sa Programming
Ang pagtatrabaho ng orasan ng Alarm ay ipinaliwanag nang sunud-sunod sa ibaba code:
#include // header upang paganahin ang kontrol ng daloy ng data sa mga pin # tukuyin ang F_CPU 1000000 // na nagsasabi sa dalas ng kristal na controller na nakakabit # isama