DS1302 kullanılan saat bilgilerini değiştirmek

Başlatan teketek, 15 Mayıs 2006, 19:14:04

teketek

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:
Bilgi fark yaratır..

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

teketek

ete hocam çok sağol 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 ?
Bilgi fark yaratır..

ete

@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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

teketek

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.
Bilgi fark yaratır..