Hazırlayan: Aytan ASLAN Emeği geçen Kişilere Teşekkürler Mikrodenetleyiciler Hakkında Genel BilgilerMikrodenetleyici: Bir yazılım yüklenmeden hiçbir anlam taşımayan bir elektronik elemandır.. Mikrodenetleyiciyi kontrol eden bir yazılım olduğundaysa neredeyse sınırsız bir uygulamaya sahiptir.
Mikrodenetleyicilerin mikroişlemcilere göre üstünlükleri oldukça fazladır. Örneğin mikroişlemcili bir sistem yapıldığında mikroişlemcinin yanı sıra hafızalar (RAM, ROM veya EPROM), I/O birimi ve buna benzer birçok sistem kullanılmaktadır. Bu karışık sistemin hem tasarlanması ve yapımı zordur, hem de maliyeti oldukça yüksektir. Mikrodenetleyicilerde de bir sistemin çalıştırılabilmesi için yalnızca bir mikrodenetleyici ve osilatör devresi yeterli olabilmektedir.Sistemde gerekli olan ön bellek ve I/O birimi mikrodenetleyiciler içinde bir yonga halindedir.
Mikroişlemci: Ön belleğine yazılan programı işleterek istenilen çıkışlara yönlendiren birimdir. Mikroişlemci veya sayısal bilgisayarlar üç temel kısımdan (CPU – Merkezi işlem ünitesi, I/O ve bellek) ve bunlara ek olarak bazı destek devrelerden oluşur. Her bir temel kısım en basitten en karmaşığa kadar çeşitlilik gösterir.
GİRİŞ / ÇIKIŞ (I/O): Sayısal, analog ve özel fonksiyonlardan oluşur. Mikroişlemcinin dış dünya ile ilişkisini sağlar. Mikroişlemciye verilen ve işlemlerden alınan veriler bu hat üzerinden sağlanır.
CPU (Central Proccesing Unit – Merkezi İşlem Birimi): Sistemin kalbidir. Birim hesapları yapmak ve verileri idare etmek için 4, 8 veya 16 bitlik veri formatında çalışır. Bir mikroişlemcide temelde kullanılan üç yol vardır;
1) Veri yolu: Bu yol, işlemci, bellek ve çevre birimleri arasında veri iletmek için kullanılır.
2) Adres yolu: Bu yol, işlemcinin program komutlarına ve veri saklama alanlarına erişimi sağlayan bellek adreslerini, ROM ve RAM belleklerine göndermek için kullanılır.
3) Denetim yolu: Bu yol, RAM belleğine veri yazıldığı veya ondan veri okunduğuna dair bilgi vermek gibi, denetim amaçları için kullanılır. Bu yol aynı zamanda kesmelerin kullanımına olanak tanıyan bağlantıları da içerir. Tipik bir mikroişlemci komutunun yürütülmesi her üç yolunda kullanımını gerektirebilir. Böylelikle kullanılan ek devreler artarak maliyet yükselir ve tasarım çok karmaşık bir hal alır.
İşlemci ilk olarak komuta, komut adresini adres yoluna koyarak erişir. İkili kodlardan oluşan bu adres, buna karşılık gelen bellek konumu tarafından tanınır ve bu konum istenen komutu veri yolundan işlemciye gönderir. Örneğin eğer bu komut, verinin işlemciden gönderilmesini ve bir RAM konumunda saklanmasını gerektiriyorsa işlemci, adres yolunu istenen konumu belirtmek, veri yoluna veriyi iletmek ve denetim yolunu da RAM’e yazıyor olduğunu belirtmek için kullanılır.
Mikrodenetleyici Mimari Özellikleri
Mikrodenetleyici mimarileri iki ayrı sınıfa ayrılmıştır:
- Bellek Organizasyonu Açısından
- Komut İşleme Tekniği Açısından
Bellek Organizasyonu Açısından Mimari Yapılar
Mikroişlemci ve denetleyiciler bellek kullanımı açısından Von Neuman ve Harvard olarak adlandırılan iki mimariden biri üzerine tasarlanırlar.Von Neuman mimarisi Princeton Üniversitesi tarafından diğeri de adından anlaşılacağı gibi Harvard Üniversitesi tarafından tasarlanmıştır.
O günkü teknolojiye uygun olan Von Neuman mimarisi tercih edilse de ilerideki yıllarda teknolojinin uygun hale gelmesi sonucu Harvard mimarisi 1970’li yılların sonlarında özellikle mikrodenetleyici tasarımında standart hale gelmiştir.Günümüzde her iki mimari yapının özelliklerini içeren mikrodenetleyiciler (MAXQ ailesi) de bulunmaktadır.Bu mikrodenetleyiciler karma mimariye sahip olup iki mimarinin üstün olan özelliklerini kullanarak performans artışı elde ederler.
8051’ in iç yapısı Harvard mimarisine uygun tasarlanmıştır.Von Neuman mimarisi ise PC olarak bilinen kişisel bilgisayarlar arasında standarttır.
Komut İşleme Tekniği Açısından Mimari Yapılar
Mikrodenetleyici yada mikroişlemciler genellikle komut işleme açısından iki grup mimari altında toplanabilir:
- CISC: Karmaşık Komut Kümeli Bilgisayar
- RISK: Azaltılmış Komut Kümeli Bilgisayar
CISC Çekirdekler
Bu mimaride mikroişlemci çok sayıda komut içerir ve her eylem için bir komut tanımlamıştır.Buradaki yaklaşım “donanım her zaman yazılımdan hızlıdır” gerçeğidir.CISC,karmaşık komut kümeli bilgisayarı anlamına gelmektedir.Böylece yüzlerce komutun arasından seçilen komutlarla yazılan bir program daha kısa olabilmektedir.
Her işlem için farklı bir komut kullanmak işlemleri hızlandırır;ancak donanımın yükünü arttırır.CISC mimarisinde oldukça çeşitli olan komutları çalıştırmak için mikro-kod kullanılmaktadır.Farklı uzunlukta olan bu komutların çözümünde oldukça karmaşık devrelere ihtiyaç vardır.
RISC çekirdekler
Hemen hemen hiç kimse bir CISC makinedeki karmaşık assembly dili komutlarının tamamını kullanmamaktadır.Günümüzde programcılar tüm karmaşık komut kümelerini neredeyse hiç kullanmayan yüksek-düzeyli dil derleyicilerini tercih etmektedirler. Bu yüzden daha az,basit ve hızlı komutlar,uzun,karmaşık ve daha yavaş CISC komutlarından daha verimlidir.
RISC mimari,daha basit komutlar kullanarak tümdevre karmaşıklığını azaltmaktadır.
Ancak RISC komutlarının daha kısa olması belirli bir görevin tamamlanabilmesi için daha fazla komuta gereksinim duyulmasına yol açabilir.Ayrıca RISC mimariler için üretilen derleyiciler daha önce CISC mimarisinde bulunan donanım birimlerinin görevini üstlenmek üzere ekstra komutlar kullanmaktadır.
Mikrodenetleyici Seçiminde Dikkat Edilmesi Gerekenler
Bir mikrodenetleyiciyi seçerken göz önünde tutulması gereken öncelikli hususları aşağıdaki gibi sıralayabiliriz.
• Maliyet ve Bulunma Kolaylığı: Ticari amaçlı olarak düşünülecek olursa,istenen öncelikli özellik,seçilecek mikrodenetleyicinin maliyetinin düşük olması ve piyasada yaygın olarak bulunmasıdır.Kullanıcı buna göre öncelikle hangi firmanın ürününü kullanacağını belirler.Daha sonra uygulamasına bağlı olarak aşağıda verilen özellikler göz önünde tutularak o ürünün ilgili serisi belirlenir.
• Mikrodenetleyicinin Çalışma Hızı: Zaman sınırlamalarının etkili olduğu uygulamalarda önemlidir.Mikrodenetleyicinin çalışma hızı,mikrodenetleyicinin çalışma frekansına(kristal frekansı),tek bir komutu işleme süresine (makine çevrimi) ve saklayıcı büyüklüklerine bağlıdır.
• Giriş/Çıkış Port Sayısı: Uygulamaların ihtiyacına göre tercih edilir.
• Bellek Büyüklüğü ve Türü: Uygulama için geliştirilecek olan programın yazımını doğrudan etkiler.Günümüzde program belleği olarak birçok kez yazılıp/silinme özelliğine sahip EEPROM(Electrically Erasable Programmable Read-Only Memory) veya Flash kullanılan denetleyiciler,program geliştirmeye büyük kolaylık sağladığından tercih edilmektedir.Özellikle belleği daha hızlı silinip,yazılabilen Flash belleğe sahip mikrodenetleyiciler öğrenmeye yeni başlayanlar için cazip olma-tadır.
• Zamanlayıcı/Sayıcı Adedi: Belirli aralıklarla yapılması gereken işlemler,harici girişe bağlı olan sinyallerin saydırılması,seri haberleşme veri iletim hızının(baud rate) ayarlanması,PWM sinyalinin üretilmesi vb daha birçok işlerde sıklıkla kullanmak için başvurduğunuz bu birim uygulamalar için oldukça önemlidir.
• Analog/Dijital Dönüştürücü: Artık uygulamaların çoğu analog/dijital dönüştürücüler gerektirmektedir.Bu dönüştürücünün mikrodenetleyici içerisinde ol-ması kolaylık sağlar.A/D çevirici seçiminde dikkat edilmesi gereken iki özellik,ölçüm hassasiyetini gösteren bit sayısı ve kaç farklı sayıda noktadan ölçüm yapabileceğini gösteren kanal sayısıdır.
• Enerji Sarfiyatı: Taşınabilir sistemler için üretilecek bir cihazın enerji sarfiyatının en az düzeyde olması istenir.Seçilecek mikrodenetleyicinin düşük-güç ve uyku modlarına sahip olması,istenilen enerji tasarrufunu sağlamaya yeterli olabilmektedir.
• Geliştirme Araçları: Mikrodenetleyici ile uygulama geliştirirken kullanılan assembler veya C derleyicilerinin kolay bulunması ve maliyetinin düşük olması mik-rodenetleyici seçiminde önemli ölçütler olarak karşımıza çıkmaktadır.
• Müşteri Desteği: Birçok üretici firma,devre ve program örneklerini kullanıcılara sunarak tasarımcıların işlerini önemli ölçüde kolaylaştırmaktadırlar.Bunun yanında üretici firmaların tasarımcıların karşılaşabilecekleri olası sorunlara çözüm üretebilmeleri yine mikrodenetleyici seçiminde önemli bir ölçüt olarak karşımıza çıkmaktadır.
8051 Mikrodenetleyicisinin Genel Yapısı
Günümüzde 8051 tabanlı mikrodenetleyiciler daha düşük güç tüketen CMOS teknolojisi ile ü-retilmektedir ve 80C51 şeklinde adlandırılırlar.8051 mikrodenetleyicisinin standart özellikleri şunlardır:
- Kontrol uygulamalarına yönelik 8 bit CPU
- Mantıksal işlemci(tek-bit lojik işlemler)
- 64 KB program bellek adres alanı
- 64 KB veri bellek adres alanı
- 4 K ROM,(0-64K)
- 128 Byte RAM,(256 Byte çıkabilir)
- 4 adet 8-bit Giriş/Çıkış portu(32 uç)
- 2 adet 16 bit-zamanlayıcı/sayıcı
- Çift yönlü UART
8051 Mikrodenetleyicisinin Uç Fonksiyonları
Çeşitli gereksinimleri karşılamak amacıyla 8051 mikrodenetleyicisinin hem iç hem de dış birimleri birçok amaca hizmet edecek şekilde düzenlenmiştir.
Standart 8051 mikrodenetleyicisinde 8-bitlik dört adet giriş/çıkış portu bulunmaktadır.Aynı şekilde 8051 in harici uçları birkaç fonksiyon gerçekleştirebilecek şekilde tasarlanmıştır.
Örneğin bütün portlardaki uçlar hem giriş hemde çıkış olarak kullanılabilirler.Hatta bunlara ilaveten bazı port uçları adresleme,programlama,kesme,algılama gibi daha birçok işleve sahip olabilirler.Bu esnek yapı sayesinde tasarımcılar endüstriyel uygulamalardaki gereksinimlere kolaylıkla cevap verebilmektedirler.Şimdi bu uçları kısaca anlatılacaktır:
8051 mikrodenetleyicisinin bacak bağlantıları
Besleme uçları : 8051 in 40 nolu ucu VDD,20 nolu ucu da VSS’dir.8051 mikrodenetleyicisi 5 voltluk bir kaynaktan beslenir.
Kontrol uçları: Kontrol hatları,mikrodenetleyicinin dışarıdaki bir durumu yada devreyi kontrol etmesini sağlar.
PSEN(Program Store Enable): harici program belleğini yetkilendirmek için kullanılır.
Düşük seviyede (lojik 0) aktif olan bu uç 8051’in 29 nolu ucudur. Genellikle EPROM ‘un okunmasına izin veren output enable (low active) bağlanır.
ALE(Adres Latch Enable): 8051’in 30 nolu ucu olan ALE,P0 portundaki bilginin veri ya da adres olup olmadığı seçimini yapmak için kullanılır.Adres bilgisi P0’a aktarıldığında ALE ucu aktif(lojik ‘1’) olur. ALE ucu adres ve veriyi birbirinden ayırmak için bir tutucu(latch) tümdevresinin kapı ucuna bağlanır.
EA(External Access): EA 8051’in 30 nolu bacağıdır ve düşük seviyede aktiftir.Eğer +5V a bağlanırsa programlar dahili ROM ‘dan, şaseye bağlanırsa sadece harici bellekten çalıştırılır.
RST(Reset): 8051’i yeniden başlatmak için kullanılan en öncelikli kesme işaretidir.
Mikrodenetleyicisinin İç Mimarisi
Aşağıdaki Şekilde 8051 mikrodenetleyicisini oluşturan fonksiyonel birimler ayrıntılı olarak gösterilmiştir.
8051 mikrodenetleyicisinin ayrıntılı blok diyagramı
[Alıntı:IC20:8051 Data Book,ATMEL]
Özet : Projemde 8051 mikrodenetleyicisini tercih sebebim bu mikrodenetleyicinin tüm dünya tarafından kabul görmüş ve bir endüstri standardı haline gelmiş olmasıdır.Elektronik ve yarı iletken sanayinin devleri olan Intel,Philips,Atmel ve Dallas gibi üreticiler 8051 mikrodenetle-yicisini üreten yirmiden fazla firmadan sadece bir kaçıdır.
8051 standart olarak en az 128 Byte’ı genel amaçlı ve 128 Byte’ı SFR olmak üzere 256 Byte’lık bir dahili RAM bellek birimine sahip olmalıdır.Program belleği için böyle bir varsayım doğru değildir.Endüstriyel kontrol düzeneklerinde sıkça ihtiyaç duyulan zamanlama ve sayma işlemleri için de 8051 ailesi en az iki adet dahili zamanlayıcı/sayıcı birimi bulundurur.
Reset işlemi ve saat darbesinin üretimi yine dahili birimler ile gerçekleştirildiğinden,fazladan harici bellek birimleri ile kullanılırken gerekli olacak arayüz uçlarına da sahiptir ve bu yönüyle,profesyonel tasarımların gerçekleştirilmesinde de kullanılabilir.
8051’in Bellek Organizasyonu
8051 mikrodenetleyicileri Harvard mimarisine uygun olarak tasarlanmıştır.Bu bellek mimarisinde program(kod) ve veri bellekleri fiziksel olarak ayrıdır.Uygulamalarda dahili kod ve veri belleğinin yetersiz kaldığı durumlarda,hariçten bağlanan bellek kullanmak da olasıdır.
Program (Code) Belleği
Program belleği mikrodenetleyicinin çalıştıracağı programın makine kodlarını bulunduran bellek birimidir.Standart 8051 mikrodenetleyicisinde 4 KByte kod bellek bulunmaktadır.Dahili kod belleğinin bulunmadığı yada yetersiz kaldığı durumlarda harici kod bellek kullanmak olasıdır.
Harici ya da dahili kod bellekten hangisinin kullanılacağını 8051 mikrodenetleyicisinin bir ucu olan EA(External Access) belirlemektedir. EA lojik “1” durumunda iken program komutları dahili kod bellekten okunurken bu uç lojik”0” durumunda harici program bellekten okunur.
Veri (Data) Belleği
8051 mikrodenetleyicisi dahili veri bellek birimi içermektedir.Standart 8051de 128 Byte olan bellek birimi bazı 8051 türevlerinde 256 Byte büyüklüğünde olabilmektedir.Dahili veri belleğinin yetmediği durumlarda harici veri belleği kullanmak mümkündür. Aşağıda iki farklı tür veri bellek birimleri hakkında ayrıntılı bilgi verilmektedir.
Dahili RAM Belleği
8051 tabanlı tüm mikrodenetleyicilerde program ve veri bellekleri birbirinden fiziksel olarak ayrı ve bağımsızdırlar. Bu özellik 8-bitlik bir MİB’in dahili program ve veri belleklerini kolay ve basit şekilde kullanmasına imkan tanır.8 bitlik adres,dahili RAM bellek üniteleri için yeterli ve oldukça verimlidir.
Ancak harici bellek erişimi için 16 bitlik DPTR (Data Pointer-Veri İşaretçisi) saklayıcısına ihtiyaç duyulur.Dahili RAM bellek 3 ana bölümden oluşmuştur.
- Alt RAM(Lower RAM)
- Üst RAM(Upper RAM)
- Özel İşlev Saklayıcıları(SFR-Special Function Register)
Alt RAM(Lower RAM)
İlk 128 Byte’ lık kısım Alt RAM olarak isimlendirilir ve tüm 8051 türevleri için ortak olan bu bölgeye doğrudan veya dolaylı adresleme yöntemleri ile erişilebilir.Alt RAM bölgesinde 4 adet saklayıcı grubu ,16 Byte lık alan ve 80 Byte’lık genel kullanıma açık veri belleği vardır.
Üst RAM(Upper RAM)
Alt RAM gibi birçok fonksiyona sahip olmayan Üst RAM bölgesi,bütün 8051 lerde mevcut olmayabilir.Bu bölge daha çok genel amaçlı olarak kullanılır ve 80h adresinden başlar FFh adresinde don bulur.Diğer önemli özelliği bu alana sadece dolaylı adresleme ile ulaşılmasıdır.
Özel Fonksiyon Saklayıcıları(SFR)
Dahili bellekte SFR saklayıcıları 80h-FFh adresleri arasında yer alırlar. SFR bellek alanı çekirdeğine,kesme birimine,giriş-çıkış portlarına,zamanlayıcı/sayıcı birimine,haberleşme birimlerine ve diğer tümdevre fonksiyon birimlerine ait saklayıcıları içerir.Bu saklayıcılar kullanılarak birimlerin başlangıç veya çalışma ayarları ,bilgi okuma ve yazma işlemleri ile diğer birimlere ait özel işlemler gerçekleştirilebilir.
REAL TIME CLOCK (RTC) Entegresinin Özellikleri
DS 1302 (RTC)Elemanının Üstten Görünüşü
- a) RTC(Real Time Clock) 2100 yılına kadar saat,dakika ,saat, ay , yıl bilgisini gösterir.Artık yıl uygulamasını ve ayların günlerini kendi otomatik olarak ayarlar.
- b) 31×8 byte Data depolama kapasitesi
- c) Seri I/O
- d) 2-5.5 V giriş seçeneği vardır.
- e) Clock ve Ram bilgisini okuma yazma için tekli yada çoklu (multiple) byte modunda çalışır.
- f) Basit 3-wire arayüzlüdür.
- g) TTL uyumludur(Vcc=+5V)
- h)-40 o C ile +85 o C arasında çalışır.
- DS 1302 (RTC) Elemanının Çalışma Mantığı
DS1302 entegresi gerçek zamanlı saat/tarih bilgisi ve 31 Byte’lık bir statik RAM içerir.Gerçek zamanlı saat/tarih bilgisi, bize saat, dakika, saniye,gün,ay ve yılı verir. Örneğin ayın sonunda tarihi otomatik olarak bir sonraki aya ayarlar.Aynı şekilde saat bilgisini de 24 saat formatında veya 12 saat AM/PM formatında üretir.
DS1302 mikrodenetleyiciyle senkron seri haberleşme yolu ile haberleşir. Haberleşmeyi sağlayan üç tane önemli pini vardır.
Bunlar CE (Chip enable), I/O ve SCLK (serial clock) pinleridir.Mikroişlemciyle haberleşmeyi de bu uçlar yapar. Seri clock (SCLK) ucu,seri ara yüzde senkronize olarak verileri taşır. I/O ucu, 3-kablo ara yüzü ile iki yönlü veri ucudur. CE (Chip enable) ucu, saat veya RAM’den veri okuma yada veri yazma için kullanılır.
Command Byte
DS1302 de adreslerden veri okuma veya adreslere veri yazma komut byte’ı ile gerçekleşir.
Komut Byte’ı data transferlerimi sağlar. 7.biti(MSB) her zaman için lojik “1” seviyesindedir.”0” olursa DS1302 ye veri yazamayız. 6.bit lojik”0” iken saat verisi ile ilgili işlemlerde lojik”1” iken de RAM verisi ile ilgili işlemlerde kullanılır.
5.bitten 1.bite kadar A4- A0 registerları I/O olarak düzenleyebiliriz. 0.bit veya LSB biti lojik ”0” iken DS1302 ye veri yazabiliriz, lojik”1” iken de veri okuma işlemi yapabiliriz.
DS1302 –Komut byte’ı
CE ve SAAT Kontrolü
CE ucu high iken yani lojik ”1” seviyesinde iken tüm data transferlerini başlatır.CE girişleri iki işlemi gerçekleştirir.Birincisi adres/komut ikilisi için registerlara erişimi sağladığından CE yön değiştirir.İkincisi CE single tek byte veya çoklu (multiple) byte data gönderimi sağlar.
DATA INPUT
SCLK palsinin yükselen kenarında 1 bytelık veri alınır.Bu işlem 8 clock palste tamamlanır.Bu durumda data girişi yapılabilmesi için komut byte’nın yazma (write) modunda olması gerekir.
DATA OUTPUT
SCLK palsinin düşen kenarında 1 bytelık data çıkışa aktarılır.Bu işkem 8 clock palste tamamlanır.0.bit ile data çıkışı başlar.
BURST MODE
Burst modu RAM kaydedicisi veya saat/tarih verilerini adreslemede kullanılır.Komut byte’daki 6.bit lojik “0” yapıldığında saat,lojik”1” olduğunda RAM kaydedicisi adresi için kurulur.Ayrıca komut byte’nın 0.biti lojik “1” iken DS1302 ‘nin adreslerini okur,lojik”0” DS1302 adreslerine veri yazabilmesini sağlar.Yani 0.bit çift ise veri okur,tek ise adreslerine veri yazılabilir.
Burst modunda saat kaydedicisi yazarken 0.adresin 0.biti ile başlar.Burst modunda saat kaydedicisine yazarken veriyi gönderebilmek için ilk sekiz kaydedici yazılmış olmalıdır.Burst modu RAM’e yazarken gerekli olmasa da 31 byte’lık verinin hepsini yazar. Statik RAM31x8 byte’lık adres aralığı vardır.
RAM BURST MODE
RAM komut byte’ı burst mod işlemlerinde kullanılır.Bu moda 31 RAM kaydedicisine 0.adresin 0.bitinden itibaren okunup yazılabilir.
SAAT/TARİH BURST MODE
Write-protect biti set edildiğinde saat/tarih burst modu seçilebilir.Saat burst modu okumaya başladığında, “gerçek zaman” registerları ikinci defa set edildiğinde gönderilir.Regıster data format özetini aşağıdaki tabloda görebiliriz.
Register Adres/Tanımlamalar
DS1302 (RTC) Elemanının Bağlantı Şekli
CE,ucu daha önce dendiği gibi Chip Enable DS1302 yani RTC nin aktif olmasını sağlıyor.
X1,X2 ,uçları buradan RTC ye 32khzllik bir kristal bağlayarak clock sinyal üretiyor.
DS1302( RTC) nin Bağlantı şekli
I/O , data girdi çıktısı ve SCLK okuma yazma durumuna göre serial clock gönderiyor. Burada tanımlanan CE,I/O ve SCLK uçları MCU programlanırken hangi portun hangi bitine işaret edilmişse o portun ilgili bitine bağlanmalıdır.
RTC Dijital Saat Devre Şeması
C Programlama Diliyle Yazılmış Program Kodları
LCD için Başlık Dosyası
/****************************************************************/ /* T_LCD.H */ /****************************************************************/ /* LCD'de kullanılan komutların tanımlanması */ #define Sil 1 // Ekranı temizler #define BasaDon 2 // İmleci sol üst köşeye getirir #define SolaYaz 4 // İmlecin belirttiği adres azalarak gider #define SagaYaz 6 // İmlecin belirttiği adres artarak gider #define ImlecGizle 12 // Göstergeyi aç, kursör görünmesin #define ImlecYanSon 15 // Yanıp sönen blok kursör #define ImlecGeri 16 // Kursörü bir karakter geri kaydır #define KaydirSaga 24 // Göstergeyi bir karakter sağa kaydır #define KaydirSola 28 // Göstergeyi bir karakter sola kaydır #define EkraniKapat 8 // Göstergeyi kapat (veriler silinmez) #define BirinciSatir 128 // LCD'nin ilk satir başlangıç adresi // (DDRAM adres) #define IkinciSatir 192 // İkinci satırın başlangıç adresi #define KarakUretAdres 64 // Karakter üreteci adresini belirle // (CGRAM adres) /* LCD'de Kullanılan Fonksiyon Seçimi */ #define CiftSatir8Bit 56 // 8 bit ara birim, 2 satır, 5*7 piksel #define CiftSatir4Bit 48 // 8 bit ara birim, 1 satır, 5*7 piksel #define TekSatir8Bit 40 // 4 bit ara birim, 2 satır, 5*7 piksel #define TekSatir4Bit 32 // 4 bit ara birim, 1 satır, 5*7 piksel /* LCD Girişlerinin Tanımlanması */ #define Data P1 // LCD Data girişleri için port ata #define RS P2_0 // Saklayıcı seçme girişi RS=0 komut, RS=1 veri #define RW P2_1 // Oku/Yaz girişi RW=0 yaz, RW=1 oku #define EN P2_2 // Yetki girişi /* LCD Gecikme Fonksiyonu */ void Gecikme (long int sure) { long int i; for (i=1;i<=sure;i++) {;} } /* LCD Hazır Olana Kadar Bekle Fonksiyonu */ void LcdHazir () { Data=0xFF; // LCD den veri almaya hazirlan RS = 0; // komut modu RW = 1; // LCDden okuma EN = 1; // yetki için düşen kenar ayarı Gecikme(200); // kısa bir bekleme süresi while(Data & 0x7F == 0x80); // mesgul bitini kontrol et. } /* LCD'ye Komut Yazdırma Fonksiyonu */ void Komut (int komut) { LcdHazir(); // LCD hazir olana kadar bekle RS=0; // RS komut modunda RW=0; // RW yaz modunda EN=1; // işlemin yetkilendirilmesi için düşen kenar ayarı Data=komut; // LCD data girişlerine komut bilgisini aktar EN=0; // yetki için düşen kenar sağlandı Gecikme(1000); // gecikme } /* LCD'ye Tek Bir Karakter Yazdırma Fonksiyonu */ void Veri (char veri, long int hiz) { LcdHazir(); // LCD hazir olana kadar bekle RS=1; // RS komut modunda RW=0; // RW yaz modunda EN=1; // yetki için düsen kenar ayar işlemi Data=veri; // LCD data girişlerine veri bilgisini aktar EN=0; // yetki için düşen kenar sağlandı Gecikme(hiz); // Ekranda karakterlerin görünmesi arasındaki süre } /* LCD'ye Karakter Dizisi (String) Yazdırma Fonksiyonu */ /*void VeriDizi (char veri[], long int hiz) { int i=0; while(veri[i]!=0) { LcdHazir(); // LCD hazir olana kadar bekle RS=1; // RS komut modunda RW=0; // RW yaz modunda EN=1; // yetki için düsen kenar ayar işlemi Data=veri[i]; // LCD data girişlerine veri bilgisini aktar EN=0; // yetki için düşen kenar sağlandı i++; // bir sonraki veri bitini almak için dizi'yi 1 arttır Gecikme(hiz); // karakterlerin görünmesi arasındaki süre } }*/ /* LCD Başlangıç Ayarlarını Yapan Fonksiyon */ void LcdAc(void) { Komut(ImlecGizle); Komut(CiftSatir8Bit); Komut(SagaYaz); }
DS1302 (RTC) Elemanı için Başlık Dosyası
#define RTC_SCLK P3_0 #define RTC_IO P3_1 #define RTC_RST P3_2 void delay_us(int tekrar) { int i; for(i=0;i<=tekrar;i++); } void bit_yaz(int c) { RTC_IO=c; RTC_SCLK=1; RTC_SCLK=0; RTC_IO=1; } int bit_oku() { int c; c=RTC_IO; RTC_SCLK=1; RTC_SCLK=0; return c; } void write_ds1302_byte(int cmd) { int i,simdiki_bit; for(i=0;i<=7;++i) { simdiki_bit=cmd>>i; simdiki_bit=simdiki_bit&1; bit_yaz(simdiki_bit); } } void write_ds1302(int cmd, int veri) { RTC_RST=1; write_ds1302_byte(cmd); write_ds1302_byte(veri); RTC_RST=0; } int read_ds1302(int cmd) { int i,veri=0; RTC_RST=1; write_ds1302_byte(cmd); for(i=0;i<=7;++i) veri=veri|(bit_oku()<>4)*10; veri=veri+(i<<4>>4); return veri; }*/ int rakam(int veri) { int i; i=veri; veri=((i>>4)&0x0F)*10; veri=veri+(i&0x0F); return veri; } void rtc_set_datetime(int day,int mth,int year,int dow,int hr,int min) { write_ds1302(0x86,get_bcd(day)); write_ds1302(0x88,get_bcd(mth)); write_ds1302(0x8c,get_bcd(year)); write_ds1302(0x8a,get_bcd(dow)); write_ds1302(0x84,get_bcd(hr)); write_ds1302(0x82,get_bcd(min)); write_ds1302(0x80,get_bcd(0)); } void rtc_get_date(int *day, int *mth, int *year, int *dow) { *day = rakam(read_ds1302(0x87)); *mth = rakam(read_ds1302(0x89)); *year = rakam(read_ds1302(0x8d)); *dow = rakam(read_ds1302(0x8b)); } void rtc_get_time(int *hr, int *min, int *sec) { *hr = rakam(read_ds1302(0x85)); *min = rakam(read_ds1302(0x83)); *sec = rakam(read_ds1302(0x81)); } /* void rtc_write_nvr(BYTE address, BYTE data) { write_ds1302(address|0xc0,data); } BYTE rtc_read_nvr(BYTE address) { return(read_ds1302(address|0xc1)); } */
ANA Program
#include <89c51rd2.H> #include#include "T_LCD.h" #include "rtc.h" #define program P3_5 #define azalt P3_6 #define arttir P3_7 code char sayi[10]={'0','1','2','3','4','5','6','7','8','9'}; //code char gunler[7][3]={"CTS","PZR","PZT","SAL","CAR","PER","CUM"}; int gun,ay,yil,dow; int saat,dakika,saniye; int a1=0,a2=0;g1=0,g2=0,y1=0,y2=0,hg1=0,hg2=0; int sa1=0,sa2=0,dkk1=0,dkk2=0,sn1=0,sn2=0; int i; int s=0; void main(void) { LcdAc(); rtc_init(); Komut(Sil); while(1) { Komut(BirinciSatir+4); rtc_get_time(&saat,&dakika,&saniye); if((saniye%10)!=0) { //Veri('-',0);Veri('-',0);Veri('-',0);Veri('-',0); sa1=saat/10; Veri(sayi[sa1],0); sa2=saat%10; Veri(sayi[sa2],0); Veri(':',0); dkk1=dakika/10; Veri(sayi[dkk1],0); dkk2=dakika%10; Veri(sayi[dkk2],0); Veri(':',0); sn1=saniye/10; Veri(sayi[sn1],0); sn2=saniye%10; Veri(sayi[sn2],0); Veri('-',0);Veri('-',0);Veri('-',0);Veri('-',0); } Komut(IkinciSatir+4); rtc_get_date(&gun,&ay,&yil,&dow); Veri('-',0);Veri('-',0);Veri('-',0);Veri('-',0); g1=gun/10; Veri(sayi[g1],0); g2=gun%10; Veri(sayi[g2],0); Veri('/',0); a1=ay/10; Veri(sayi[a1],0); a2=ay%10; Veri(sayi[a2],0); Veri('/',0); y1=yil/10; Veri(sayi[y1],0); y2=yil%10; Veri(sayi[y2],0); Veri('/',0); for(i=0;i<3;i++) Veri(gunler[dow][i],0); Veri('-',0);Veri('-',0);Veri('-',0);Veri('-',0); if(!(program))// buton kontrol s++; if(s==1) if(!(arttir)) { saat=read_ds1302(0x85); saat++; if((saat&(0x0F)==0x0A)) saat+=6; if((saat>=0x24)) saat=0x00; write_ds1302(0x84,saat); } else if(!(azalt)) {saat= read_ds1302(0x85); saat--; if((saat&(0x0F))==0x0F) saat-=6; if(saat<=0x00) saat=0x24; write_ds1302(0x84,saat); } if (s==2) if(!(arttir)) { dakika = read_ds1302(0x83); dakika++; if((dakika&0x0F)==0x0A) dakika+=6; if(dakika>=0x60) dakika=0x00; write_ds1302(0x82,dakika); } else if(!(azalt)) { dakika=read_ds1302(0x83); dakika--; if((dakika&0x0F)==0x0F) dakika-=6; if(dakika<=0x00) dakika=0x60; write_ds1302(0x82,dakika); } if(s==3) if(!(arttir)) { gun=read_ds1302(0x87); gun++; if((gun&(0x0F)==0x0A)) gun+=6; if((gun>=0x31)) gun=0x01; write_ds1302(0x86,gun); } else if(!(azalt)) {gun=read_ds1302(0x87); gun--; if((gun&(0x0F))==0x0F) gun-=6; if(gun<=0x01) gun=0x31; write_ds1302(0x86,gun); } if(s==4) if(!(arttir)) { ay=read_ds1302(0x89); ay++; if((ay&(0x0F)==0x0A)) ay+=6; if((ay>=0x12)) ay=0x01; write_ds1302(0x88,ay); } else if(!(azalt)) {ay=read_ds1302(0x89); ay--; if((ay&(0x0F))==0x0F) ay-=6; if(ay<=0x01) ay=0x12; write_ds1302(0x88,ay); } if(s==5) if(!(arttir)) { yil=read_ds1302(0x8D); yil++; if((yil&(0x0F)==0x0A)) yil+=6; write_ds1302(0x8C,yil); } else if(!(azalt)) {yil=read_ds1302(0x8D); yil--; if((yil&(0x0F))==0x0F) yil-=6; write_ds1302(0x8C,yil); } if(s==6) { s=0; } }
Şifre-Pass: 320volt.com
Yayım tarihi: 2008/12/24 Etiketler: 8051 proje, atmel avr projeleri, dijital saat devresi, DS1302, lcd devreleri, mikrodenetleyici, mikroişlemci, rtc
RTC dosyasında hata var..
veri=veri|(bit_oku()<<<4)|nibl); satırından kaynaklanıyor,sanırım..
kodlar yazıya eklenirken sorun olmuş olabilir yazının başında verilen dosyadaki kodları kullanın
arkadaşlar hex dosyası yok ve keil uvision4 de hex olusmuyor hata veriyor. Galiba c kodunda bir hata var. Yardımcı olursanız sevinirim.
Derleyip çalıştırdığınız dosyayı rar halinde [email protected] e-mail olarak atarsanız çok sevinirim
hex dosyasını oluşturamadım yardım edin arkadaşlar
HEX dosyasını oluşturamıyoruz büyük olduğu için, elinde olan avr ise paylaşsın lütfen.