CCS + PROTON ds1307 saat takvim okuması ve 10'luk tabana çevrilmesi

Başlatan omereliusuk, 10 Kasım 2010, 23:52:33

omereliusuk

saatoku:'
Repeat
    I2CIN SDA,SCL,$D0,$00,[Str ZAMANY\7,KONTROL]'ds1307'den gelen veriyi oku ayrıca kontrol bilgisini oku
                                                                                   '
    Until KONTROL=%10010001 'eğer kontrol byte hatalı ise yani bilginin tamamı okunmadıysa okununcaya kadar tekrarla
gosub cevir
goto saatoku
end
CEVIR:
VSANIYE10=(ZAMANY[0]>>4)*10    :VSANIYE1=  ZAMANY[0]//16        :ZAMANV[0]=VSANIYE10+VSANIYE1   'saniye 10 tabanına çevrildi
VDAKIKA10=(ZAMANY[1]>>4)*10    :VDAKIKA1= ZAMANY[1]//16         :ZAMANV[1]=VDAKIKA10+VDAKIKA1  'dakika 10 tabanına çevrildi
VSAAT10=(ZAMANY[2]>>4) *10     :VSAAT1= ZAMANY[2]//16           :ZAMANV[2]=VSAAT10+VSAAT1             'saat 10 tabanına çevrildi
                                                                                                                                                                       'haftanın günü aynı mantıkla çevrildi.
VTARIH10=(ZAMANY[4]>>4)*10     :VTARIH1= ZAMANY[4]//16          :ZAMANV[4]=VTARIH10+VTARIH1          'gün 10 tabanına çevrildi
VAY10=(ZAMANY[5]>>4)*10        :VAY1=  ZAMANY[5]//16            :ZAMANV[5]=VAY10+VAY1                          'ay  10 tabanına çevrildi
VYIL10=(ZAMANY[6]>>4)*10    'bcd olan sayının yüksek 4 biti 4 birim sağa kaydırıldı. ve 10 ile çarpıldı.  onlar basamağı     
:VYIL1= ZAMANY[6]//16             'bcd olan sayının düşük 4 biti 'bit0,bit1,bit2,bit3" 16'ya bölümünden kalan değer bulundu. birler basamağı
:ZAMANV[6]=VYIL10+VYIL1               '  onlar basamağı ile birler basamağı toplanarak onluk tabana çevrimi yapıldı.
        Return

aynı mantıkla ters işlem yapılarak 10'luk tabandaki veri bcd formatına çevrilebilir.
bu konuyu çözmeye zamanında çok uğraşmıştım. o yüzden ilk bunu gönderiyorum.


TEKRAR DÜZENLENDİ:
DIM W AS BYTE
DIM OKUTIME[7] AS BYTE
DIM OKUTIME1[7] AS BYTE
DIM OKUTIME10[7] AS BYTE
DIM TIME[7] AS BYTE
DIM Z_AYAR10[7] AS BYTE
DIM Z_AYAR1[7] AS BYTE
DIM Z_AYAR_C[7] AS BYTE



For W=0 To 6
I2CIN SDA,SCL,$D0,w,[ OKUTIME[w]]
OKUTIME10[W]=(OKUTIME[W]>>4)*10 
OKUTIME1[W]=  OKUTIME[W]//16
TIME[W]=OKUTIME10[W]+OKUTIME1[W]
Next

BCD FORMATA ÇEVİRMEK İÇİN İSE

For W=0 To 6
Z_AYAR10[W]=(ZAYAR[W]/10)<<4
Z_AYAR1[W]=ZAYAR[W]//10
Z_AYAR_C[W]=Z_AYAR10[W]+Z_AYAR1[W]
Next


CCS KÜTÜPHANESİ;
#ifndef SDA_1307
#define SCL_1307  PIN_C3
#define SDA_1307  PIN_C4
//#use i2c(master, sda=SDA_1307, scl=SCL_1307,100000)
#endif


//

#define EEPROM_ADRES BYTE
#define EEPROM_SIZE    64

void init_ext_eeprom() {
   output_float(SCL_1307);
   output_float(SDA_1307);
}

BOOLEAN ext_eeprom_ready() {
   int1 ack;
   i2c_start();            // If the write command is acknowledged,
   ack = i2c_write(0xd0);  // then the device is ready.
   i2c_stop();
   return !ack;
}

void ds1307_yaz(BYTE ADRES, BYTE data)

{
BYTE I10;
BYTE I1;
while(!ext_eeprom_ready());
I10=((DATA/10)<<4);
I1=(DATA%10) ;
DATA=I10+I1;

   i2c_start();
   i2c_write(0xd0);
   i2c_write(ADRES);
   i2c_write(data);
   i2c_stop();
}


BYTE ds1307_oku(BYTE ADRES) 
{
   BYTE I;
      BYTE data;
   while(!ext_eeprom_ready());
   i2c_start();
   i2c_write(0xd0);
   i2c_write(ADRES);
   i2c_start();
   i2c_write(0xd1);
   data=i2c_read(0);
   i2c_stop();
   i=data;
   data=(i>>4)*10;
   data=data+(i<<4>>4);
   return(data);
}

erdogan2734

Alıntı yapılan: omereliusuk - 10 Kasım 2010, 23:52:33
saatoku:'
Repeat
    I2CIN SDA,SCL,$D0,$00,[Str ZAMANY\7,KONTROL]'ds1307'den gelen veriyi oku ayrıca kontrol bilgisini oku
                                                                                   '
    Until KONTROL=%10010001 'eğer kontrol byte hatalı ise yani bilginin tamamı okunmadıysa okununcaya kadar tekrarla
gosub cevir
goto saatoku
end
CEVIR:
VSANIYE10=(ZAMANY[0]>>4)*10    :VSANIYE1=  ZAMANY[0]//16        :ZAMANV[0]=VSANIYE10+VSANIYE1   'saniye 10 tabanına çevrildi
VDAKIKA10=(ZAMANY[1]>>4)*10    :VDAKIKA1= ZAMANY[1]//16         :ZAMANV[1]=VDAKIKA10+VDAKIKA1  'dakika 10 tabanına çevrildi
VSAAT10=(ZAMANY[2]>>4) *10     :VSAAT1= ZAMANY[2]//16           :ZAMANV[2]=VSAAT10+VSAAT1             'saat 10 tabanına çevrildi
                                                                                                                                                                       'haftanın günü aynı mantıkla çevrildi.
VTARIH10=(ZAMANY[4]>>4)*10     :VTARIH1= ZAMANY[4]//16          :ZAMANV[4]=VTARIH10+VTARIH1          'gün 10 tabanına çevrildi
VAY10=(ZAMANY[5]>>4)*10        :VAY1=  ZAMANY[5]//16            :ZAMANV[5]=VAY10+VAY1                          'ay  10 tabanına çevrildi
VYIL10=(ZAMANY[6]>>4)*10    'bcd olan sayının yüksek 4 biti 4 birim sağa kaydırıldı. ve 10 ile çarpıldı.  onlar basamağı     
:VYIL1= ZAMANY[6]//16             'bcd olan sayının düşük 4 biti 'bit0,bit1,bit2,bit3" 16'ya bölümünden kalan değer bulundu. birler basamağı
:ZAMANV[6]=VYIL10+VYIL1               '  onlar basamağı ile birler basamağı toplanarak onluk tabana çevrimi yapıldı.
        Return

aynı mantıkla ters işlem yapılarak 10'luk tabandaki veri bcd formatına çevrilebilir.
bu konuyu çözmeye zamanında çok uğraşmıştım. o yüzden ilk bunu gönderiyorum.

Ömer hocam mail lede görüştük ds1307 yi picbasic programında kullanmak istiyorum...
bana yardım edermisin?
Bildiğim tek şey henüz hiç bir şey bilmediğim...

omereliusuk

#2
"I2CIN" YERİNE I2CREAD GERİSİ AYNI
"I2COUT" YERİNE I2CWRITE GERİSİ AYNI

erdogan2734

Alıntı yapılan: omereliusuk - 29 Kasım 2010, 16:07:49
"I2CIN" YERİNE I2CREAD GERİSİ AYNI
"I2COUT" YERİNE I2CWRITE GERİSİ AYNI


ÖMER BEY bit olarak tanımlama yapıcakmıyız acaba nereye giriyor diye..
bide bu programı direk attığım zaman pic basicte hata veriyor...
Bildiğim tek şey henüz hiç bir şey bilmediğim...

omereliusuk

e normal
direkt atarsanız çalışmaz. çünkü orada tanımlamalar yapılmadı. siz yapacaksınız. mesela
zamany var byte[ 7]'zamany 'de 7 byte bilgi tanımlandı. saniye dakika saat hgün gün ay yıl
gibi proton veya pbp  bunun ne olduğunu anlayamaz.
birde başlangıçta i2cwrite şeklinde bir başlangıç yapmalısınız. zamanı ve configuration bilgisini göndermek için. aksi halde çalışmaz çünkü config byte ona göre ayarlandı. yani önce zamanı saniye dakika saat hgün gün ay yıl ve kontrol byte olarak göndereceksiniz. arkasından 1307 bunu anlayacak zamanı ayarlayacak.  daha sonra çalışmaya başlayacak ha hiçbirşey yapmadan çalışmasını istiyorsanız
I2CIN SDA,SCL,$D0,$00,[Str ZAMANY\7] şeklinde başlarsınız.
herşey sıfırdan yani saniye 0 dakika 0 saat 0 haftanın günü 1 gün 1 ay 1 yıl ise 2000 den başlar.

erdogan2734

#5
Alıntı yapılan: omereliusuk - 07 Aralık 2010, 23:28:43
e normal
direkt atarsanız çalışmaz. çünkü orada tanımlamalar yapılmadı. siz yapacaksınız. mesela
zamany var byte[ 7]'zamany 'de 7 byte bilgi tanımlandı. saniye dakika saat hgün gün ay yıl
gibi proton veya pbp  bunun ne olduğunu anlayamaz.
birde başlangıçta i2cwrite şeklinde bir başlangıç yapmalısınız. zamanı ve configuration bilgisini göndermek için. aksi halde çalışmaz çünkü config byte ona göre ayarlandı. yani önce zamanı saniye dakika saat hgün gün ay yıl ve kontrol byte olarak göndereceksiniz. arkasından 1307 bunu anlayacak zamanı ayarlayacak.  daha sonra çalışmaya başlayacak ha hiçbirşey yapmadan çalışmasını istiyorsanız
I2CIN SDA,SCL,$D0,$00,[Str ZAMANY\7] şeklinde başlarsınız.
herşey sıfırdan yani saniye 0 dakika 0 saat 0 haftanın günü 1 gün 1 ay 1 yıl ise 2000 den başlar.

ömer bey tanımlamaları yaptım. orda sorun yok ben gerçek zamanı versin istiyorum oyuzden sıfırdan başlamasın..
zamanı tanımladıktan sonra[7] yaparak 8 lık bir dizi oluşturacagım değilmi?
birde tanımlama yaparken ds1307 yı hangı porta bagladımı nasıl belırtecegım...
mesela bir girde bircıktı olacak ya bundan bahsedıyorum..

önce wirete sonra read menusumu yapayım yada yer farkedermı... birde okumayı  wrmıssınız yazmayı da aynısını yazıp sadece baslık mı koayacagım??
tesekkur ederım..



Bildiğim tek şey henüz hiç bir şey bilmediğim...

omereliusuk

SDA var portc.3
SCL var portc.4
tabii ki önce ayar yapmak istiyorsanız teker teker ayarlamaları yapacaksınız. yani menü oluşturacaksınız. en sonunda i2cwrite şeklinde başlayan zaman ayarını tamamlayacaksınız. bu biraz zaman alır ama yavaş yavaş öğrenirsiniz. kolay gelsin. normal kol saati gibi düşünün orada ne yapıyorsanız aynısını siz de yapacaksınız.