Merhaba,
Şekildeki devre ile ds1302 den saat bilgisini alıyor ve ekrana verebiliyorum.Ancak bunu kullanırken saati ayarlamam gerekebilir(Mesela hersene saatler ileri ve geri alınıyor). Bu ayarı yapmak için saat-dakika kısmında sağ-sol tuşları ile kursörü gezdirip aşağı-yukarı tuşları ile artırma eksiltme yapmayı düşünüyorum.
.
.
.
POZ=113
LCDOUT $FE,1
LCDOUT $FE,$84, HEX2 SAAT,":",HEX2 DAKIKA
IF POZ=113 AND SOL=0 THEN GERI
IF POZ=113 AND YUKARI=0 THEN SAAT=SAAT+1
IF POZ=113 AND ASAGI=0 THEN SAAT=-1
GOSUB GETTIME
IF SAAT>24 THEN SAAT=00
IF SAAT<00 THEN SAAT=24
.
.
.
böyle bir kod yazdım olmadı.Sizce ne yapmam gerekiyor?
Devrenin Şekli:
(http://img506.imageshack.us/img506/359/saatayar1jp.th.jpg) (http://img506.imageshack.us/my.php?image=saatayar1jp.jpg)
Bazı hataların var,
Birincisi
IF SAAT>24 THEN SAAT=00 yerine
IF SAAT=24 then SAAT=0 demen gerekir.
İkincisi, IF SAAT<00 THEN SAAT=24 yerine
IF SAAT=255 then saat=23 demen gerekir
Sen hiç saatlerin 24:32 şeklinde gösterdiğini gördünmü?
Bunun yerine 00:32 şeklinde gösterir.
Tam ve eksi sayıların olmadığı bir sistemde sayılar sıfırdan küçük olamaz. Bu nedenle saat<00 ifadeside yanlış. Birde neden çift sıfır koyuyorsun onuda anlamadım. Teki yeterli. Bir sayıyı sürekli azaltırsan önce sıfıra ulaşır ardındanda 255 'e dönersin. Tabiiki değişkenin BYTE cinsinden ise. Word cinsinden ise 65535'e dönersin.
Aynı şekilde BYTE cinsinden bir sayıyı sürekli artırırsan önce 255'e ardından 0 rı bulursun.
Saat ayarının nasıl yapıldığı konusunda bir çalışmayı aşağıdaki linke koymuş idim. Oradan bak.
http://www.hemenpaylas.com/download/466454/SAAT_AYAR.bas.html
Ete
ete hocam çok sağol(http://img151.imageshack.us/img151/9500/dilimdilim2ge7ak5.jpg) (http://imageshack.us) un,
şöyle bir kod yazdım ve çalıştırdım:
.
.
.
SAATAYAR:
WHILE SEC=0
WEND
LCDOUT $FE,1
GOSUB EKRAN
DD: POZ=111
'LCDOUT $FE,$C1
IF POZ=111 AND SEC=0 THEN S_AYAR
IF POZ=111 AND SOL=0 THEN MENU2_1
GOTO DD
EKRAN:
GOSUB GETTIME
LCDOUT $FE,$80,"SAAT AYAR"
LCDOUT $FE,$C0,HEX2 SAAT,":", HEX2 DAKIKA :RETURN
EKRAN0:
LCDOUT $FE,$C0,HEX2 SAAT,":", HEX2 DAKIKA :RETURN
EKRAN1:
GOSUB SETTIME
LCDOUT $FE,$80,"TARiH AYAR"
E11:LCDOUT $FE,$C0,HEX2 GUN,"/", HEX2 AY,"/", HEX2 YIL:RETURN
S_AYAR:
LCDOUT $FE,$C1
LCDOUT $FE,$0E 'ÇİZGİLİ KURSOR AÇIK
PP: POZ=112
PAUSE 250
GOSUB EKRAN0
IF POZ=112 AND SAG=0 THEN D_AYAR
IF POZ=112 AND YUKARI=0 THEN SAR
IF POZ=112 AND ASAGI=0 THEN SAZ
IF POZ=112 AND SOL=0 THEN MENU2_1
GOTO S_AYAR
SAR:SAAT=SAAT+1
IF SAAT>23 THEN
SAAT=0
ENDIF
GOTO S_AYAR
SAZ:SAAT=SAAT-1
IF SAAT=0 THEN
SAAT=23
ENDIF
GOTO S_AYAR
D_AYAR:
LCDOUT $FE,$0C
LCDOUT $FE,$C4
LCDOUT $FE,$0E 'ÇİZGİLİ KURSOR AÇIK
POZ=113
PAUSE 250
GOSUB EKRAN0
IF POZ=113 AND SOL=0 THEN S_AYAR
IF POZ=113 AND YUKARI=0 THEN DAR
IF POZ=113 AND ASAGI=0 THEN DAZ
GOTO D_AYAR
DAR:DAKIKA=DAKIKA+1
IF DAKIKA>59 THEN
DAKIKA=0
ENDIF
GOTO D_AYAR
DAZ:DAKIKA=DAKIKA-1
IF DAKIKA<0 THEN
DAKIKA=59
ENDIF
GOTO D_AYAR
.
.
.
ancak saati ayarlarken (mesela saati 1 artırdığımda) ekran bilgisini şöyle güncelliyorum:
E11:LCDOUT $FE,$C0,HEX2 GUN,"/", HEX2 AY,"/", HEX2 YIL:RETURN
burdaki hex2 yerine dec2 yazmam lazım biliyorum ama dec2 yazdığımda saat bilgisi eger "10" sa kendiliğinden hex karşılığı olan 16 ya dönüşüyor.kullandığım ds1302 rutini şu şekilde:
SETTIME:
high RST
SHIFTOUT IO, SCLK, LSBFIRST, [$8E, 0]
SHIFTOUT IO, SCLK, LSBFIRST, [$BE, SANIYE, DAKIKA, SAAT,GUN , AY, GUNADI, YIL, 0]
low RST
PAUSE 100
GETTIME:
High RST
SHIFTOUT IO, SCLK, LSBFIRST, [$BF ]
SHIFTIN IO, SCLK, LSBPRE, [SANIYE, DAKIKA, SAAT,GUN , AY, GUNADI, YIL, CONTROL]
LOW RST ' RESET RTC
RETURN
acaba kullandığım bu rutinle ilgili bir değişiklik mi yapmam gerekiyor ?
@teketek,
DS1302 nin data sheetini hiç okumadığın belli oluyor. Yada lisan sorunu nedeni okuyamıyorsun sanırım. Sorularının tamamının cevabı orada var aslında.
Herneyse , DS1302nin 8 bitlik registerleri genelde 4'er bitlik iki ayrı bilgi halinde kullanılmaktadır. Bu nedenle desimal olarak bu bilgilerin çevrilmesi gerekir. Konuyla ilgili olarak bayağı detaylı bir açıklama verdim bu forumda . Başlığı hatırlamıyorum. Burasıda olabilir. Araştırırsan bulursun sanırım. Benda arayacağım.
Ete
nerde hata yaptığımı bulabildim sonunda.SETTIME rutini şu şekilde olmalıymış:
SETTIME:
high RST
SHIFTOUT IO, SCLK, LSBFIRST, [$8E, 0]
LOW RST
HIGH RST
SHIFTOUT IO, SCLK, LSBFIRST, [$BE, SANIYE, DAKIKA, SAAT,GUN , AY, GUNADI, YIL, 0]
low RST
PAUSE 100
RETURN
aynı sorunla karşılaşabilecek arkadaşlara kolaylık olsun diye yazdım.iyi çalışmalar herkeze.