E

7 segment display ile saat devresi

Başlatan erciyes, 28 Nisan 2012, 23:11:23

erciyes

Hocam ben ds1307 entegresi ile saat tasarladım, saat LCD'de çok güzel çalışıyor fakat 7 seg displayde farklı görüntü alıyorum.
Dosyayı gönderiyorum bakabilir misiniz?

ete

#1
BU hali ile LCD de çalıştırıyorsan nasıl çalıştığını merak ettim doğrusu. Saati tasarladım demişsin ama henüz bitmemiş.

DS1307 bir RTC dir. Ayar gerektirir. Yapılan ayar önce DS1307 ye bir kereliğine yazılır daha sonra zaman sürekli okunur.
Sen yaptığın ayarı hiç RTC ye yazmamışsın.  İlkdeger diye bir etiketin var orada;
ilkdeger:
san=$50:dak=$38:saat=$17:hgun=$01:GUN=$02:AY=$04:yil=$12:CTRL=$10
I2cWrite dpin,cpin,$d0,$00,[san,dak,saat,hgun,gun,ay,yil,ctrl]
şeklinde birde komut olmalı dır.

Bunu yaparsan okumaların düzelecektir.

DS1307 kendi osilatörünü kullanarak saniye ve diğer zaman bilgilerini hesaplar ve içinde yer alan hafızaya kayıt eder sende oradan okursun. Peki sence DS1307 deki bilgilerin değişme peryodu nedir?. Yani hangi aralıkla okumam lazım bu entegreyi ?. Elbette 1 sn aralıkla okuman yeterlidir.
İŞlemciler yapılacak işleri çok hızlı yaparlar. BU nedenle daha 1 sn dolmadan sen DS1307 yi sürekli okumaya kalkarsan oda kendi işini yapamaz hale gelebilir. BU nedenle en azından okuma aralığı 600-800 ms aralıkla olması gerekir. Programındaki komut gecikmeleriile bu süre 1000 ms ye ye kadar çıkabilir.
Senin programda Goto Oku komutundan önce Pause 500 yazdım mükemmel uydu ve okumlar düzgün hale geldi.
Bunu son iki digitte saniye değerini göstererek anladım.

DS1307 hesapladığı zaman değerlerini hafızasına BCD binary Coded Desimal formatında yazar. Bu format hemen hemen bütün RTC lerde aynıdır. Aslında yazılan veya aokunan değer ile gerçek değer arasında belirgin fark vardır.
Örnekle açıklar isek,
SN=38 ise (desimal değer) BU RTC den şöyle okunur. %0011 1000 . BU sayıya bakarsanız desimal değeri 56 dır. Ama Hex olarak baktığınızda bu sayı $38 şeklinde görülür. Bu durumda okunan sayının önce desimale çevrilerek ekrana verilmesi gerekir ki sen bunu Lookup tablosu aracılığı ile yapmışsın. Ayarlanan saatinde DS1307 ye yazılırken tersi bir işlemle desimal değer BCD formatına çevrilerek yazılması gerekir. Pek çok kişi gibi sende kestirmeden gitmişsin ve Hex değerlerini kullanarak bu işten kurtulmaya çalışmışsın. Bu hali ile yaptığın tasarım gerçek bir tasarım olamayacak. Benden söylemesi.

Ete

erciyes

#2
Hocam dediklerinizi yaptım yine aynı.


san var byte
dak var byte
saat var byte
hgun var byte
gun var byte
ay var byte
yil var byte
ctrl var byte
sec var byte
dpin var portd.0
cpin var portd.1
SCLK VAR PORTC.0
SDATA VAR PORTC.1
LATCH VAR PORTC.2
RAKAM VAR BYTE
KARSILIK VAR BYTE


'lcdout $fe,$01,"ERCIYES"

read 0, sec:if sec=$38 then oku
gosub ilkdeger
oku:
i2cread dpin,cpin,$d0,$00,[san,dak,saat,hgun,gun,ay,yil,ctrl]
SAAT=((SAAT>>4) & $0F)*10+(SAAT & $0F)
DAK = ((DAK>>4) & $0F)*10+(Dak & $0F)

RAKAM=dak DIG 0:GOSUB CEVIR:GOSUB GOSTER
RAKAM=dak DIG 1:GOSUB CEVIR:GOSUB GOSTER
RAKAM=SAAT DIG 0:GOSUB CEVIR:GOSUB GOSTER
RAKAM=SAAT DIG 1:GOSUB CEVIR:GOSUB GOSTER
'lcdout $fe,$c0, hex2 saat,":",hex2 dak,":",hex2 san
'lcdout $fe,$94, hex2 gun,".",hex2 ay,".20",hex2 yil
pause 500
goto oku


ilkdeger:
san=$50:dak=$38:saat=$17:hgun=$01:GUN=$02:AY=$04:yil=$12:CTRL=$10
I2cWrite dpin,cpin,$d0,$00,[san,dak,saat,hgun,gun,ay,yil,ctrl]
write 0,$38
return

CEVIR:
LOOKUP RAKAM,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],KARSILIK
RETURN

GOSTER:
SHIFTOUT SDATA,SCLK,1,[KARSILIK]
LOW LATCH:HIGH LATCH
RETURN

mitec

hocam konuyla ilgili benimde bir sorum olacaktı başka bir başlık açmadan buradan sorayım dedim.ds 1307 ile bir çalışmada ben yapıyorum saati dakikayı ayıngününü ve ayı displaylerde gösteriyorum fakat displayde yıl göstermiyorum. ds1307 ye ilk bilgiyi gönderirken yıl göstermeyeceğim için yıl bilgisini göndermedim.bu durumda ds 1307 yılı 0 olarak mı kabul eder eğer öyleyse 29 çeken şubat ayında sorun yaşarmıyım yada ne yapmalıyım

ete

#4
Erciyes,
Displaylerin ne göstermesini bekliyorsun. Aynı derken ne ayarlamış isen o çıkıyor ekrana. Ben deniyorum.Doğru çalışıyor.  Bak bakalım ne ayar veriyorsun saate;

san=$50:dak=$38:saat=$17:hgun=$01:GUN=$02:AY=$04:yil=$12:CTRL=$10

Saat değeri $17 bu binary olarak %00010111 şeklinde görülür. Bu BCD formatıdır. Desimal karşılığı ise 23 dür. Sen bunu desimal formata çevirmediğin için 23 olarak görüyorsun. Halbuki 17 olarak görmek istediğini biliyorum.
O halde ne yapman lazım;
SAAT=((SAAT>>4) & $0F)*10+(SAAT & $0F)
DAK = ((DAK>>4) & $0F)*10+(Dak & $0F)
şeklinde iki komut satırını   OKU etiketinin altında yer alan I2CRead komut satırından hemen sonra yerleştirmen lazım.
BU çevirme işini mesajımda yazmıştım ama okumadın sanırım.

Ben senin kodalarına bunu yerleştirdim. Kendi mesajına bak.

@Mitec,
Senin soruna gelince, yıl değeri sıfırdan başlıyor. Sıfır aslında 2000 yılına denk gelmektedir. Yıl değerini doğru girmez isen saat Şubat aylarını doğru hesaplayamaz.

Ete


Powered by EzPortal