DS1307 + EPROM. SAAT DEĞİŞİYOR

Başlatan Yazilim, 24 Ağustos 2024, 01:42:47

Yazilim

Merhaba arkadaşlar.
Bir projemde DS1307 ve 24C02 eprom kullandım.
Devre sorunsuz çalışıyor ama müşterilere verdiğimde bazı cihazlarda saat değişti diye şikayetler geldi
kontrol ettiğimde saat pili dolu devrede herhangi bir sorun görünmüyor.
Saat niye değişti anlayamadım aklıma gelen tek şey şu. DS1307 ve EPROM dataları birbirlerini etkileyebilirmi acaba?
IC lerin adresleri farklı tabi ama mesala eprom okunurken okunan datalar arasında DS1307'nin adresi olurda saati bozabilirmi acaba diye aklıma uçuk bir düşünce geldi. sizce bu mümkün olabilirmi?.
yazılımda hiçbir sorun yok bundan eminim.

arci03

Merhaba değişmeyi tarif etmemişsin burada verinin bozuldugu ve normalde saat değerlerinden fazla geldiğini tajmin ederek soyleyeceğim şey rtc nin besleme voltajını düşürmen faydalı olacaktır kendim için rtc beslemesini 4v civarı çözüm uyguluyorum.
eğer hatanız zaman kayması ise ds3231 kullanmanı tavsiye ederim.

yas

Değişimden kastınız zaman kayması ise durum farklı. Kayma değilde bir anda okunan değerlerin sapıtması ise muhtemelen veri hatalı işleniyor. Çünkü bu saat entegresi mesela decimal "15" degerini hexadecimal formatta "F" olarak değil "15" olarak veriyor. Bu veri program içerisinde işlenirken yada eproma alınırken hatalı işleniyor olabilir.

Yazilim

Zaman kayması değil saat değişiyor. Yazılım aynı. sadece sonradan 24c02 eklendi. o yuzden bu ıc ler okunurken birbirinden etkileniyormu diye düşündüm.
böyle bir durum olabilirmi acaba daha önce başına gelen oldumu.

Yazilim

Alıntı yapılan: arci03 - 24 Ağustos 2024, 06:30:30Merhaba değişmeyi tarif etmemişsin burada verinin bozuldugu ve normalde saat değerlerinden fazla geldiğini tajmin ederek soyleyeceğim şey rtc nin besleme voltajını düşürmen faydalı olacaktır kendim için rtc beslemesini 4v civarı çözüm uyguluyorum.
eğer hatanız zaman kayması ise ds3231 kullanmanı tavsiye ederim.

Hocam sizde de saat'mı değişiyordu?

ete

Hem DS1307 hemde 24C02 eprom I2C ile haberleşmektedir. Normal şartlarda bu iki eleman aynı Data ve CLK hattına bağlanabilir ve kiminle iletişim kurulacağı Cihaz Adresi ile belirlenir.
Burada ne bir şema verilmiş neden bir yazılım örneği. Bize ancak havadan yorum yapmak kalıyor.
Ortada bir kusur olduğuna göre bir yerlerde bir hata var demektir. Olası kusurları aşağıda sıralıyorum;
- Aynı hattan haberleşen bu iki eleman için yanlış cihaz numarası ile işlem yapılma ihtimali
- Çok sık bir şekilde (100ms de daha kısa sürede) RTC den saat bilgisi okuması yapılması.
Yeri gelmişken bu ihtimalin neye sebep olabileceğinide açıklayayım. RTC hem zamanı sayar hemde saydığı zamanı değiştikçe kendi içindeki registerlere kayıt eder. Bu işlemi yapabilmesi için RTC ye gereken zamanı vermek gerekir. Aksi taktirde bir karmaşa yada bilgi değişimi gibi şeyler yaşanabilir. RTC yi en düşük 500ms de bir en fazla ise 1000ms de bir okumaya çalışın lütfen. Daha kısa sürelerde yapılan okumalar süreye bağlı olarak sorun yaratmayabilir ama sorun yaratma ihtimali daha fazladır.

- RTC daima bir noktadan okunmalı. Format çevrimleri yapılarak okunan bilgi işlenip gösterilmeye hazır hale getirilmelidir. Birden fazla noktadan yapılan okumalarda format değişikliği konusunda hatalar yapılabilir. RTC ye bilgi BCD (Binary Coded Desimal) formatında yazılır. Okunan bilgi bu formattan direk desimal formata dönüştürülmelidir. Sık yapılan hatalardan biriside bu çevrimin her hangi bir saat biriminde (sn-dak-saat vs.)yapılmamış olmasıdır. Bunun için Yazılım iyice kontrol edilmelidir.
Bu tür hatalardan kaçınmak için ben genellikle okuma ve yazma bilgilerini ayrı değişkende , ekranda kullandığım dönüştürülmüş gerçek saat bilgilerinide farklı değişkenlerde tutarım. Böylece iki bilginin bir birinin yerine kullanılma ihtimali ortadan kalkmış olur.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Yazilim

#6
Hocam yazılım daha önce kullandığım yazılım hiç değiştirmedim sorunsuz çalışıyor sadece 24c02 eklendikten sonra bu sorun ortaya çıktı.

Aşağıdaki bağlantıya göre 24c02 i2c haberleşme adresi nedir?.



kütüphaneye baktığımda tek adres yazılmamış kütüphanede adresi arıyor sorun bu olabilir. aşağıya ekliyorum.

Direk adresi yazsam sorun çözülür gibime geliyor.
i2c_write((0xa0|(BYTE)(address1>>7))&0xfe);



#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)

#define EEPROM_ADDRESS unsigned int16
#define EEPROM_SIZE    1024

void init_ext_eeprom() {
   output_float(RTC_SCL);
   output_float(RTC_SDA);
}

int1 ext_eeprom_ready() {

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

void write_ext_eeprom(EEPROM_ADDRESS address1, BYTE data) {
   while(!ext_eeprom_ready());
   i2c_start();
   i2c_write((0xa0|(BYTE)(address1>>7))&0xfe);
   i2c_write(address1);
   i2c_write(data);
   i2c_stop();
}


BYTE read_ext_eeprom(EEPROM_ADDRESS address1) {
   BYTE data;

   while(!ext_eeprom_ready());
   i2c_start();
   i2c_write((0xa0|(BYTE)(address1>>7))&0xfe);
   i2c_write(address1);
   i2c_start();
   i2c_write((0xa0|(BYTE)(address1>>7))|1);
   data=i2c_read(0);
   i2c_stop();
   return(data);
}

ete

#7
Harici adres bacakları hepsi LOW da olduğuna göre Eprom Haberleşme adresi ;
Okuma yaparken %10100001 ($A1)
Yazma yaparken %10100000 ($A0)
şeklindedir.
Verdiğin kod parçasında adresi, $A0 olarak kullanmışlar zaten.
DTA ve CLK hatlarında Pullup direnci de bağlı olması gerekir. Direnç değerini 4K7 olarak kullanabilirsin. Normalde 10K yeterlidir. İki eleman aynı hatta bağlı ise değeri küçültmek işe yarayabilir.


Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Yazilim

Bu satır ne yapıyor?
i2c_write((0xa0|(BYTE)(address1>>7))&0xfe);

arci03

Alıntı yapılan: Yazilim - 24 Ağustos 2024, 11:03:49Hocam sizde de saat'mı değişiyordu?
Merhaba sanide 1 defa okama yaparken bazen ilk enerji vermede bazen günler sonrasında saat versini yanlış alıyordum 26 - 46 gibi saat değerleri geliyordu devreyi 4v civarında beslediğimde ise bu problemi yaşamamaya başladım hep bana debk geliyor sanmıştım bu konuda tek değilmişim :)5v den 4v ye 2 yada 3 diod ile düşürebilirsiniz.

Yazilim

@arci03
Onuda denerim hocam. DS1307 leri aliepress den almıştım belkide sorunlu olabilirler bilemiyorum. devre eski herşeyi aynı sadece 24c02 eklendikten sonra böyle yapınca epromdan şüpelendim.

En büyük sorun bu hatayı hemen vermemesi günlerce deniyorum sorun yok müşteriye verince ortaya cıkıyor ilginç bir durum.


arci03

Rtc olarak ds3231 yanında 24c32 kullanıyorum nerdeyse her zaman ikisi beraber aynı hattan haberleştirirm. hazır modullerdede zaten beraber kullanılmaktalar. saat oku mayıda ete hocanın dediği gibi en az 1aniye aralaıklarla hatta biraz daha gec okuturum. besleme ile ilgili değişikliği yaptıktan sonra rtc okuma hatası almamaya başladım.denemeden zarar gelmez

Okan AKÇA

Pisayadan aldığıniz ds3231 sahte ürün olma ihtimali çok yüksek

Yazilim

Benim kullandığım DS1307. Belkide sahtelerdir.

yas

Epromu sökün eski uygulamanızı yükleyip test edin. Eski uygulamanın sorunsuz olduğunu söylemiştiniz. Eğer ds1307 de bir sıkıntı varsa bunda da ortaya çıkacaktır.