Bu projede ATMEGA32 zamanlayıcıları kullanarak basit bir Çalar saat tasarlayacağız. ATmega32A mikrodenetleyicisinin 16 bitlik bir zamanlayıcısı vardır ve bu zamanlayıcıyı saniyeleri saymak ve dijital bir saat geliştirmek için kullanacağız.
Tüm dijital saatlerin içinde saatin kalbi olan bir kristal bulunur. Bu kristal yalnızca saatte değil, tüm gerçek zamanlı hesaplama sistemlerinde de mevcuttur. Bu kristal, zamanlama hesaplamaları için gerekli olan saat darbeleri üretir. Saat darbelerini almanın başka yolları olsa da, doğruluk ve daha yüksek frekans için çoğu kristal tabanlı saati tercih eder. Doğru saati elde etmek için ATMEGA32'ye bir kristal bağlayacağız.
Gerekli Bileşenler
Donanım: ATmega32 mikro denetleyici, 11.0592MHz kristal, 22pF Kapasitör (2 adet), Güç kaynağı (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), 100uF kapasitör (güç kaynağına bağlı), düğmeler (dört adet), 10KΩ direnç (altı adet), 100nF kapasitör (dört adet), Üç pinli anahtar (2 adet), 2N2222 transistör, Buzzer, 200Ω direnç.
Yazılım: Atmel studio 6.1, progisp veya flash magic.
Devre Şeması ve Çalışma Açıklaması
Doğru zamanlama için saat için 11.0592MHz kristal bağladık. Şimdi ATMEGA'nın dahili saatini devre dışı bırakmak için DÜŞÜK SİGORTA BİTLERİNİ değiştirmemiz gerekiyor. JTAG iletişiminin hala etkin olması için yüksek sigorta bitlerine dokunmadığımızı unutmayın.
ATMEGA'ya dahili saati devre dışı bırakmasını ve harici üzerinde çalışması için şunu ayarlamamız gerekir:
DÜŞÜK BYTE KULLANIMI = 0xFF veya 0b11111111.
ATMEGA32'nin PORTB devresinde veri portu LCD'sine bağlanır. Burada, eğer biri PORTC'yi normal bir iletişim portu olarak kullanmak istiyorsa, yüksek sigorta baytlarını değiştirerek ATMEGA'nın PORTC'sindeki JTAG iletişimini devre dışı bırakmayı unutmamalıdır. 16x2 LCD'de siyah ışık varsa 16 pim vardır, arka ışık yoksa 14 pim vardır. Arka ışık pimlerine güç verebilir veya bırakabilirsiniz. Şimdi 14 pimde 8 veri pini (7-14 veya D0-D7), 2 güç kaynağı pini (1 ve 2 veya VSS ve VDD veya gnd ve + 5v), kontrast kontrolü için 3. pin (VEE-karakterlerin ne kadar kalın olması gerektiğini kontrol eder) gösterilen) ve 3 kontrol pini (RS & RW & E)
Devrede sadece iki kontrol pini aldığımı gözlemleyebilirsiniz. Bu, daha iyi anlama esnekliği sağlar, kontrast biti ve READ / WRITE sık kullanılmadığından toprağa kısa devre yapılabilir. Bu, LCD'yi en yüksek kontrast ve okuma moduna getirir. Karakterleri ve verileri buna göre göndermek için sadece ENABLE ve RS pinlerini kontrol etmemiz gerekiyor.
LCD için yapılan bağlantılar aşağıda verilmiştir:
PIN1 veya VSS toprağa
PIN2 veya VDD veya VCC ila + 5v güç
Zemine PIN3 veya VEE (yeni başlayanlar için en iyi maksimum kontrastı verir)
PIN4 veya RS (Kayıt Seçimi) uC'nin PD6'sına
PIN5 veya RW (Okuma / Yazma) zemine (LCD'yi okuma moduna geçirerek kullanıcı için iletişimi kolaylaştırır)
UC'nin PD5'ine PIN6 veya E (Etkinleştir)
UC'nin PIN7 veya D0 ila PB0'ı
UC'nin PIN8 veya D1 ila PB1'i
UC'nin PIN9 veya D2 ila PB2'si
UC'nin PIN10 veya D3 ila PB3'ü
UC'nin PIN11 veya D4 ila PB4'ü
UC'nin PIN12 veya D5 ila PB5'i
UC'nin PIN13 veya D6 ila PB6'sı
UC'nin PIN14 veya D7 ila PB7'si
Devrede 8 bit iletişim (D0-D7) kullandığımızı görebilirsiniz ancak bu zorunlu değildir, 4 bit iletişim (D4-D7) kullanabiliriz ancak 4 bit iletişim programı ile biraz karmaşık hale gelir. Yukarıdaki tabloda gösterildiği gibi, kontrol için 8 pin ve 2 pin olmak üzere 10 pin LCD'yi kontrolöre bağlıyoruz.
Birinci geçiş, alarm ve saat arasında ayarlama özelliğini etkinleştirmek içindir. Pin düşükse, tuşlara basarak alarm zamanını ayarlayabiliriz. Yüksek düğmeleri sadece TIME ayarlamak içinse. Burada DÖRT düğme vardır, ilki alarmda veya zamanda DAKİKALARI artırmak içindir. İkincisi, alarm veya zamandaki DAKİKALARI azaltmak içindir. Üçüncüsü, alarm veya zamandaki HOUR değerini artırmak içindir. DÖRDÜNCÜ alarm veya zamanda SAAT azaltmak içindir.
Burada bulunan kapasitörler, düğmelerin sıçrama etkisini geçersiz kılmak içindir. Çıkarılırlarsa, düğmeye her basıldığında denetleyici birden fazla sayabilir. Pimler için bağlanan dirençler, pimi yere çekmek için düğmeye basıldığında akımı sınırlamak içindir.
Bir düğmeye her basıldığında, denetleyicinin karşılık gelen pimi yere çekilir ve böylece denetleyici, belirli bir düğmeye basıldığını ve karşılık gelen eylemin yapıldığını tanır.
Öncelikle burada seçtiğimiz saat 11059200 Hz, onu 1024'e bölersek 10800 veriyor. Yani her saniye için 10800 darbe alıyoruz. Bu yüzden sayacı saati 10800 Hz olarak almak için 1024 ön ölçekleyicili bir sayaç başlatacağız. İkinci olarak ATMEGA'nın CTC (Clear Timer Counter) modunu kullanacağız. Sayaç, bir interrupt oluşturmak üzere ayarlanmış karşılaştırma değerine kadar saydığında, bir değeri saklayabileceğimiz (karşılaştırma değeri) 16 bitlik bir kayıt olacaktır.
Karşılaştırma değerini 10800 olarak ayarlayacağız, bu nedenle temelde her saniye için bir ISR'ye (her karşılaştırmada Interrupt Service Routine) sahip olacağız. Bu yüzden, ihtiyacımız olan saati elde etmek için bu zamanlı rutini kullanacağız.
BROWN (WGM10-WGM13): Bu bitler, zamanlayıcı için çalışma modunu seçmek içindir.
Şimdi CTC modunu OCR1A baytında karşılaştırma değeri ile istediğimiz için, sadece WGM12'yi bire ayarlamamız gerekiyor, geri kalanlar varsayılan olarak sıfır olarak bırakılıyor.
KIRMIZI (CS10, CS11, CS12): Bu üç bit, ön sayıyı seçmek ve böylece uygun sayaç saati elde etmek içindir.
Ön ölçekleme olarak 1024 istediğimiz için, hem CS12 hem de CS10'u ayarlamamız gerekiyor.
Şimdi dikkate almamız gereken başka bir kayıt var:
YEŞİL (OCIE1A): Bu bit, bizim ayarladığımız sayaç değeri ile OCR1A değeri (10800) arasındaki karşılaştırma eşleşmesinde bir kesinti elde etmek için ayarlanmalıdır.
OCR1A değeri (sayaç karşılaştırma değeri), yukarıdaki register'a yazılır.
Programlama Açıklaması
Çalar saatin çalışması aşağıdaki kodda adım adım açıklanmaktadır:
#include // pinler üzerinde veri akışı kontrolünü etkinleştirmek için başlık #define F_CPU 1000000 // denetleyiciye kristal frekansı takılı #include