DS1307 değişken e aktarma

Başlatan fofo, 08 Ocak 2014, 14:15:59

fofo

Merhaba ETE hocam DS1307 nin her saniye veya dakika artışını en pratik şekilde bir değişkene nasıl aktarırım.

ete

#1
Çok sade bir soru olmuş anlamadım doğrusu. Aslında anladım ama anladığım bana çok basit geldi. Basitlik verdiğim cevaptan da anlaşılır. İşte cevabım.
I2CRead SDA,SCL,$D0,$00,[SN,DAK,SAAT,HAFGUN,GUN,AY,YIL,TEMP]
komutu ile saat bilgilerini okursun. Okuduğun bilgi zaten bir değişkene aktarılmış bilg değilmidir?
Saniye bilgisi SN içinde Dakika bilgisi DAK içinde yer alıyor zaten. Dahada başka değişkene aktarmak için,
TEMP=SN yada TEMP=SAAT demen yeterli.

Bunu soru olarak sordun ise işte cevabın. Değilse ne olduğunu detay vererek açıklaman lazımki anlayabileyim.

Birde sanki her SN yi ayrı bir değişkene atacakmışsın gibi bir his var içimde yada ne bileyim her dakika değerini başka bir değişkene mesela,
Dak=0 ise Dak[0]=0 , Dak=1 ise Dak [1]=1   şeklinde bir şey. Onunda kolayı her bir kayıt edilecek bilgi için 60 adet dizi değişkeni oluşturursun. Bunuda kendi değeri ile indexlersin. Örnek veriyorum, SN bilgisini kayıt altında tutacağız.
SN[SN]=SN  şeklinde bir sistemle kendini yine kendisine indexlemiş olursun. Ama ne işine yarayacak bu onu anlamam gerek çünki zaten SN[0]=0 olacak SN[15]=15 olacaktır daima. Farklılık yok anlayacağın.
Aynı şeyi dakika için ve saat içinde kullanabilirsin.

Ete


fofo

Soruyu biraz açayım, DS1307 nin her saniye artışında değişkenimizide buna bağlı olarak +1 artırmak ve değişken istediğimiz sayıya gelince sıfırlamak. Yani DS 1307 den aldığımız zaman bilgisiyle peryodik olarak örneğin her 45 dakikada bir 50 saniye çalış gibi.

ete

Bu gibi işlerde ikinci bir değişkeni paralel çalıştırmayız. Yalnızca karşılaştırma yaparız. Mesela;
IF SN=>45 then GOTO IKAZ
Yada IKAZ=45 ise
IF SN=>IKAZ THEN ALARM
gibi.
Paralel değişken kullanmak hem zahmetli hemde boşuna işlemciyi yoran bir uygulama olur bence

Ete

fofo

Sanırım en sağlıklı yol DS1307 nin SQW/OUT çıkışını kullanarak darbe saymak.

ete

Gerçekten ne yapmak istediğini anlamadım. Bu nedenle yanlış yönlendirmiş olabilirim.
Biraz açarsan belki daha faydalı bir öneride bulunabilirim.

Ama diğer yandan da doğru anladığımı düşünüyorum. Saat bilgisine paralel 45 dakika 35 sn sonra bir şeyi açacak yada kapatacak isen O andaki saat bilgisini dak ve sn olarak alırsın.
Diyelimki saat o anda 13:55:23 olsun.
Şimdi işin dakika kısmına bakarsak 45 dakika sonrası 14:40 olur sanırım. Saniyeyide hesaba katarsak 13:40:02 de sistem ne yapacak ise onu yapmalıdır. Peki bunu nasıl hesapla yaparız onu düşünmek lazım.
O andaki dakika değeri 55 olduğu için durma zamanı dakika değerini buna eklersek 55+45=100 bulunur. Bu değer 60 dan büyük olduğu için içinde 1 saat var demektir. O halde bu saati yani 60 dakikayı ondan çıkartırız (55+45)-60=40 bulunur. Demekki dakika değeri 40 olunca sistem duracak ama saniyeyide hesaba katmak gerekir değilmi. Aynı şeyi saniye içinde yaparız (23+35)=58  bulunan değer 60 dan küçük olduğu için direk kullanacağız. Büyük olsa idi 60 çıkartacak idik.
Şimdi ne olup bittiğine tekrar bakalım.
13:55:23 den 45 dakika 35 sn sonrası 14:40:58 olur o halde verilen sürede saati de dikkate almak gerekiyor bunu unutmamak lazım.
Bu işlemi hesap yolu ile yapacak olursak;
Dakika hesabı ;
TEMP=(DAK+SUREDAK)=(55+45)=100
EKSAAT=TEMP/60
IF Temp>60 then
   TEMP=ABS(60-TEMP)   
ENDIF
DAKSON=TEMP
SAATSON=SAAT+EKSAAT

TEMP=(SN+SURESN)=(23+35)=58
EKDAK=TEMP/60
IF TEMP>60 then
   TEMP=ABS(60-temp)
endif
   SNSON=TEMP
   DAKSON=DAK+EKDAK
Bütün bu işlemlerin sonucunda programa;
IF DAK=DAKSON AND SN=SNSON THEN GOTO ALARM  gibi bir satır ilave etmen yeterli olacaktır.

Bir başka yolu da bütün saat bilgisini sn formatına çevirmektir.
45:35 bilgisini saniyeye çevirelim. SURE=45*60+45=2.735 sn.
O andaki saat bilgisini sn formatına çevirelim; 13:55:23 ,
OAN=46800+55*60+23=50.123
Sureyi buna eklersek; 51123+2735=52858 sn
O halde her sn değiştiğinde sürekli olarak OAN hesaplarsan ve programada,
IF OAN=52858 THEN GOTO ALARM dersen işin yine görülmüş olacaktır.

Ete

Powered by EzPortal