2x16 lcd ile basit saat

Başlatan uardal, 28 Aralık 2007, 10:53:36

uardal

merhaba

2 haftadır pic basicle uğraşıyorum ve dün gece nasıl saat yapılır diye düşünürken aklıma bi fikir geldi :) ve kısa bi kodla çok hoş bi saat yazmayı başardım, pic basic i öğrenmek için kaynaklarından faydalandığım ETE hocamam teşekkürler. kaynak kodu ve proteus şeması aşağıdadır. daha ayarlarını eklemedim, bugün bi ara onlarıda koymayı düşünüyorum, yanlız benim bi konuda yardıma ihtiyacım var, bu çok satırlı lcd ler nasıl sürülür, birde devrede geri sayıcı devresi yada herhangi bir zaman devresi çalışırken, başka işlemler nasıl yaptırabiliriz? yardımcı olursanız sevinirim.


DownloadLink: http://rapidshare.com/files/79572350/lcd_saat.rar

ete

Ufuk,
Fiziksel olarak bir saat yapmış görünüyorsun. Ancak unutmaki bu tip saat ancak göstermelik olarak çalışır. En ufak bir yan işlem saatin bozulmasına yada yavaşlamasına sebep olacaktır.
Bu nedenle sana en azından saniye palslerini geri planda yani ana program satırlarından etkilenmeden sayabilecek bir sistem gerekir.
Bunun iki yolu var, ya bir harici saat (Real Time Clock) kullanmak yada kesme kullanarak saat palslerini geri planda oluşturmak.
BUnlardan en kalitelisi harici bir RTC kullanmak mesala DS1302 yada DS1307 gibi entegreler kullanmak ve her sn süreci içinde bu entegreden gerçek zamanı okumak. Çünki saat sayımını ve hesabını (takvim dahil) bu entegre kendi içinde halleder.

Kesme yöntemine gelince TMR0 kesmesi oluşturarak 1000 ms lik peryotlar elde etmen gerekiyor. Mademki derlerimden yararlandın dersler arasında bulunan TMR0 kesme si konusunu yeniden okumanı tavsiye ediyorum.
TMR0 yazdığın programdan hiç bir şekilde etkilenmeden geri planda çalışabilir. Onu da bölücüler kullanarak belirli değerlerde kesme oluşturacak şekilde ayarlayabilirsin.
Benim yaptığım örneklerde kullandığım gibi 1/64 bölme oranını kullanır isen TMR0  256 x 64 kadar saydıktan sonra bir kesme oluşturacak demektir. 4 MHz kristalde her bir komut çevrimi 1 us olduğuna göre 64x256=16384 us demek olacaktır.  Kesme kısmında SAYAC isimli ayrı bir değişkeni kullanarak 61 adet kesme oluşturmayı sayar isen 16384 x 61 = 999424 us lik bir süre elde etmiş olacaksın. Biliyorsun kesme kısmındaki program satırlarıda programda bir gecikme yaratır ve sonuçta yaklaşık olarak 1.000.000 us lik  bir gecikme süresi yakalayabilirsin. Bu ise 1 sn ye ye eş değerdir.
1 sn=1000 ms = 1.000.000 us dir.
İşte her 61 kesmede bir sende Saniye =Saniye+1    dersen arka planda çalışan bir saat elde etmiş olacaksın demektir. Artık gerisini yani dakika ve saat sayımlarınını buna paralel yürütmek çocuk oyuncağı olacaktır.
Bu durumda sormuş olduğun geri sayım işini kesmeye yada TMR0'a yaptırman gerekir. Böylece sen başka işler yaparken o geriden sayar ve durmasını istediğin noktada kesme oluşturabilirsen işini rahatlıkla yapmış olursun.

Pic ile kullanabileceğin karekter temelli enbüyük LCD  4 satır 20 karekterdir. Bu LCD ye satır bazında yazı yazdırmak için
LCDOUT $fe,$80  '1 satır başı
LCDOUT $fe,$c0  '2. satır başı
LCDOUT $fe,$94  '3. satır başı
LCDOUT $fe,$d4  '4.satır başı
komutlarını kullanabilirsin.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

uardal

çok teşekkürler, daha 2 -3 haftadır bu işlere daldığım için öğrenecek çok şeyim var, kesme konusunu tam olarak anlayabilmiş değilim sıra ona geldi, inş. o konuyu da kavrarasam tam olacak :)

arslan74

Merhaba,

TM0 kesmesini kullanarak cok net çalışan bir saat elde etmek cok zor. Microchip harici entegre kullanmadan saat pulsleri elte etmek için su yöntemi. Kullanmış. TM1 giriş bacağına 32.768 MHZ kristal bağlamış. Bu kristal TM1'e hariciden pulsler veriyor. PIC demo Plus2 boardunda buna benze bir uygulamasıda var. İçinde örnek yazlımda eklemişler. Hatta Proteus içinde bu demo boardun örnek simulasyonunuda yapmışlar, ordana daha net inceleyebilirsiniz.

Selamlar

elektromer

Alıntı yapılan: "arslan74"Merhaba,

TM0 kesmesini kullanarak cok net çalışan bir saat elde etmek cok zor...........

Selamlar
Merhaba arkadaşlar....

arslan74 arkadaşımın düşüncelerine hem katılıyorum, hemde katılmıyorum....

KATILMIYORUM ; Çünkü, TMR0 kesmesini kullanarak çok net çalışan bir saat (sapması çok düşük) elde etmek mümkün... Ama biraz zahmetlice....

Örneğin : Pic'de kullanacağınız kristali 3.2768 MHZ seçerseniz, bakınız neler oluyor...:)

Fosc= 3 276 800 Hz
Pic çalışma frekansının Fosc/4 olduğunu biliyorsunuz. Buradan PIC'in 819 200 Hz Frekansında çalıştığını bulabilirsiniz.

PIC'in periyoduda, 1/819 200  den
T(PIC için)= 0,000001220703125  Saniye.
T(PIC için)= 0,001220703125  Mili Saniye.
T(PIC için)= 1,220703125  Mikro Saniye olduğu bulunur.

TMR0'ın 256 adımdan oluştuğunu da biliyoruz. Bu durumda,

TMR0  256*1,220703125= 312,5 Mikro saniyede bir çevrimini tamam ladığını görürüz.

Ayrıca TMR0'ın prescaler değerininde 1/2 den başlayarak, 1/256 ya kadar gittiğini biliyoruz bu durumda da;

1/2    için       2*256*1,220703125 =    625 Mikro sn.
1/4    için       4*256*1,220703125 = 1 250 Mikro sn.
1/8    için       8*256*1,220703125 = 2 500 Mikro sn = 2.5 Mili Saniye
1/16   için     16*256*1,220703125 = 5 000 Mikro sn. = 5 Mili Saniye
1/32   için     32*256*1,220703125 = 10 000 Mikro sn. = 10 Mili Saniye
1/64   için     64*256*1,220703125 = 20 000 Mikro sn. = 20 Mili Saniye
1/128  için   128*256*1,220703125 = 40 000 Mikro sn. = 40 Mili Saniye
1/256  için   256*256*1,220703125 = 80 000 Mikro sn. = 80 Mili Saniye

İşte bu noktada ne yapmamız gerektiğine karar vereceğiz. Eğer TMR0 kesmeleri arasında yapacağımız işlemlerin tahminen ne kadar sürdüğünü hesap etmemiz gerekir. Hesapladık ve 8 Mili saniye civarında tuttuğunu varsayalım.
Bu durumda TMR0 prescaler değerini 1/32 alırsak, TMR0 her 10 mili saniyede bize kesme üretir.  Yapmayı düşündüğümüz saatimizde, Saniye ledi veya saniye için 2 nokta kullanacaksak, bizim 500 milisaniyelik adımlara ihtiyacımız olacak.
1 adet sayaç kullanır ve bunu desimal 50 değerinden geriye doğru her TMR0 kesmesinde azaltırsak 50 değerimiz sıfırlansığında 0.5 Saniye zaman geçmiş olur. bu noktada led vs'yi saniyenin yarısında aktif tutma şansımız olur.
Bir başka  geri sayıcımızıda bunun ardına ekler ve 2 değerini verirsek Saniye adımlarımız oluşmuş olur.
Artık bundan sonrasında, dakika, saat bilgilerinin hesaplanması ve 12/24 hangi saat sistemi kullanılacaksa gün hesabının yapılması gerekir.

Şimdi gelelim can alıcı noktaya.... Piyasadan edindiğimiz Kristalin ve kristal kapasitelerinin toleranslarıve çevre faktörleri nedeniyle sapma oluşacaktır. Bunuda, Kristal bacağında bulunan kondansatörlerden birinin (Hangisi olduğunu şimdi hatırlamıyorum..:)) Trimer kondansatör ile değiştirilerek ve Osilaskop yardımıyla Frekansı kalibre edilerek azami doğruluk elde edilebilir.

KATILIYORUM ; Kullanacağınız devrede veya tasarladığınız saatte gerçek zaman değeri önemli ise (Yani RTC) mutlaka bu tip işler için tasarlanmış modüller veya Entegreler (DS1302, DS 1307, DS 1629 vb) kullanmanız daha sağlıklıdır.

Yukarıda anlattığım TMR0 kullanımı %100 güvenilir olsaydı. RTC ürünlerine ihtiyaç kalmazdı.
Ama yinede yukarıda anlattığım yöntemle tasarlanacak saatin sapması bile günde 10-15 saniyeyi bile geçmez....

Saygılarımla....
Her şey gönlünüzce olsun..

arslan74

Merhaba,

Bahs ettiğiniz yöntemi test edib denediniz mi?
Gercekte ne kadar geri kalıyor, yoksa olayı sadece formüllerle mi acıklıyorsunuz?

Direkt Kristalle Saat puls'i elde etmek için genelde 4.096 Mhz kristal kullanılıyor. Piyasada bulunma şansı daha yüksek.

Selamlar

elektromer

Alıntı yapılan: "arslan74"Merhaba,

Bahs ettiğiniz yöntemi test edib denediniz mi?
Gercekte ne kadar geri kalıyor, yoksa olayı sadece formüllerle mi acıklıyorsunuz?

Direkt Kristalle Saat puls'i elde etmek için genelde 4.096 Mhz kristal kullanılıyor. Piyasada bulunma şansı daha yüksek.

Selamlar

Merhaba arslan74,
Yukarıda anlattığım olayı bizzat denedim. 2 veya 3 yıl kadar önce...
Asli hedefim saat olmadığı için deneme şeklinde bıraktım. Gerçekte ne kadar geri kaldığına gelince, yanlış hatırlamıyorsam, 24 saatte 10-15 saniye kadar.

Ayrıca tüm yazılımlarımı ASM olarak yapıyorum ve TMR0 kesmesi kullanıyorum. Genelde 5 veya 10 Mili saniye ayarlı olarak. Yani yazılımda kontrol etmem gereken bölgeleri veya yapmam gereken işleri TMR0'a endeksli yapıyorum.

Sözünü ettiğim 3.2768 MHz Kristal, bir zamanlar Cine5 Ses Dekoder devresinde kullanıldığından piyasada bulmak oldukça kolay.

Saygılarımla...
Her şey gönlünüzce olsun..

camby

32.768 kHz kristal ile direk timer0'ı arttırsak ve ön bölücüyü de 1:128 yapsak , 256*128= 32768 puls ile kesmede , direk RTC'lerin hassasiyetinde zamanlama yapmış  olmaz mıyız? Üstelik sadece bir timer0 feda ederek..

Kullandığımız 4-20Mhz kristallerin real time konusunda yüzde 1 gibi ölümcül töleransları var deniyor , fakat bu 32768 lik kristallerin töleransı yok mudur?

Eğer bu kristalde de tölerans varsa yani tam 32.768kHz değilse hem RTC entegresi hem de yazılımla yaptığımız real time clock 'da zamanlamayı kaçırmış olmaz mıyız?

Not: soruların cevaplarını buldum

https://www.picproje.org/index.php/topic,26868&postdays=0&postorder=asc&highlight=rtc&start=20

Tagli

Bu kristali timer1 ile de kullanabilirsin (yani çift kristalli olarak), böylece PIC normal hızında çalışmaya devam eder. Ancak 1:1 oranıyla timer1 2 saniyede bir taşacaktır. Kesme sırasında en büyük bit 1 yapılarak bu durum düzeltilebilir. Asenkron modda timer1 PIC uyurken de çalışabilir, taşma olunca uyandırır. Bu şekilde enerji tasarrufu da sağlanır :). Elbette devrede çalışan bir gösterge olduğu sürece bunun pek bir anlamı yok, zaten en çok enerjiyi o tüketecektir.

DS1307'nin datasheet'inde en yüksek hassasiyet için kristalin PCB'ye bağlandığı yerde bir koruma çemberi (toprağa bağlı) önerilmiş.
Gökçe Tağlıoğlu

camby

Alıntı yapılan: "Tagli"Bu kristali timer1 ile de kullanabilirsin (yani çift kristalli olarak), böylece PIC normal hızında çalışmaya devam eder. Ancak 1:1 oranıyla timer1 2 saniyede bir taşacaktır. Kesme sırasında en büyük bit 1 yapılarak bu durum düzeltilebilir. Asenkron modda timer1 PIC uyurken de çalışabilir, taşma olunca uyandırır. Bu şekilde enerji tasarrufu da sağlanır :). Elbette devrede çalışan bir gösterge olduğu sürece bunun pek bir anlamı yok, zaten en çok enerjiyi o tüketecektir.

DS1307'nin datasheet'inde en yüksek hassasiyet için kristalin PCB'ye bağlandığı yerde bir koruma çemberi (toprağa bağlı) önerilmiş.

bu uyku nasıl kullanılıyor genelde , diyelim her 1 saniye 1ms normal mod , 999ms uyku şeklinde kullanılsa , bu oranda tasarruf yapmış olur muyuz enerjiden , yatarken kalkarken enerji harcamıyor mu hiç :)

Ayrıca o koruma çemberinde kristalin kılıfını şaseye deydirmek gerekir mi , gerekirse tutması için kristale 1 parça lehim atsak çok mu incitmiş oluruz: )