avatar_xoom

DS1302

Başlatan xoom, 30 Nisan 2015, 20:12:16

xoom

arkadaşlar 7 segment bir displayde sadece saati Gösteren bir saat Yaptım.. Fakat saat 10 veya 12 saat normal Çalışıyor..bir düzende oluyormu pek emin Değilim sabah kalktıktan sonra bir ara baktığımda değiştiğini görüyorum. Saat birden bire geri kalıyor.. Günün değişimine göre kurduğum bir değişken sayısında artıyor..(displayde yansıtıyorum) yani saat uzun süre normal Çalışıyor salise veya saniye Farkları belki oluyordur ama 1-2 saat ara vermeden kontrol ediyorum neredeyse pc ile Eş Zamanlı ilerliyor saat ama birden bire ne oluyor ne bitiyor bilmiyorum saat birden geri kalıyor

POWER

keşke proğramı verseydin,bu şekilde çözüm bulabilmen zor.

xoom


rodyum

#3
RTC  okuma ve yazma sırasında kesmeleri kapatman gerekir. aynı şey EEPROM hafıza için de geçerli.
birde, besleme için ne tür bir regülasyon kullandın? etrafdan parazit sinyaller geliyorsa yada smps devresi varsa onun ürettiği parazit RTC entegresini etkileyebilir. ayrıca, display tarama sırasında 5v besleme üzerinde parazit sinyal oluşuyor. istersen RTC'nin beslemesini bir diyotla ayırıp kondansatörle flitrele.

aklıma gelmişken, yaptığın devreyi proteusta .cof dosyası ile debug yaparak incele. değişkenlerde anormal değişimler oluyorsa kolay farkedersin.

xoom

#4
Alıntı yapılan: rodyum - 01 Mayıs 2015, 03:13:27
RTC  okuma ve yazma sırasında kesmeleri kapatman gerekir. aynı şey EEPROM hafıza için de geçerli.
birde, besleme için ne tür bir regülasyon kullandın? etrafdan parazit sinyaller geliyorsa yada smps devresi varsa onun ürettiği parazit RTC entegresini etkileyebilir. ayrıca, display tarama sırasında 5v besleme üzerinde parazit sinyal oluşuyor. istersen RTC'nin beslemesini bir diyotla ayırıp kondansatörle flitrele.

aklıma gelmişken, yaptığın devreyi proteusta .cof dosyası ile debug yaparak incele. değişenlerde anormal değişimler oluyorsa kolay farkedersin.

Rtc okuma yaparken kesmeleri kapatmam konusunu ilk defa duyuyorum. Belki ds1302.c kütüphanesi bunu kendi içinde yapıyorsa olabilir-emin Değilim-
Fakat kafama yatmayan Kısım şurası saat 10 saat şaşmadan Çalışıyor sonra olan oluyor.. Ve 1 haftadır çözemedim.
Rtf okuma işlemini timer0 ile 500ms de okuma yapacak şekilde değiştirdim ama sonucun pek değişeceğinden emin Değilim.

ete

Kesme aralığı çok kısa ise ve tam RTC den bilgi okur iken kesme gelirse okuma işi sekteye uğrayabilir.
Bu tür sorunları yaşamamak için ben genelde bir bit değişkenini set ederim ve o değişkeni kesme içinde reset ederim.
Set ettiğim yerde ise reset oluncaya kadar bekler ondan sonra RTC okumaya (yada sensör okumaya) giderim.
Bu yöntem epeyce faydalı olmaktadır.

Senin sorunun daha başka bir şey gibi geliyor bana. Ama ortada mantığa uymayan bir açıklama var. 10 saat hiç şaşmasın sonra şaşsın böyle bir şey olamaz. Zaman zaman RTC li sistemleri simule ederken ekrandaki saatin garip rakamlar yazdığına şahit oluyorum. Bunun sebebini henüz bulabilmiş değilim. Ama tahmin edebiliyorum. SOnuçta RTC denilen şey zamanı sayıyor ve zaman değerlerinide içindeki registerlerine yerleştiriyor ve sende oradan alıyorsun. Bu aşamada şöyle düşün ,normal şartlarde register değerleri her 1000 ms de bir yapılıyor. Şayet bir zamanlayıcın olabilse ve her zaman değişimini algılayabilsen ve ondan 1 ms sonra RTC yi okusan hiç bir sorunun olmayacak. Ama bir zaman tutmayıp sürekli olarak RTC yi okumaya çalışıp değiştimi bakmak zorunda kalıyor isen ve tam sen bakarken register değeride değişiyor ise ortaya garip sonuçlar çıkabiliyor. Bu nedenle RTC nin mutlaka 1000ms lik peryotlarla okunması en doğrusudur. Son yazdığım programlarda artık TMR1 sayacını kullanarak (4Mhzde) 500ms lik bir süre yaratıyorum. Bunuda PIR1.0 registeri ile kontrol ediyorum. süre 500 ms yi aşar aşmaz PIR1.0=1 oluyor. While wend kullanarak PIR1.0 sıfır olduğu sürece yapılacak işleri yapıyor sonra tekrar sayacı çalıştırıp 1000 ms olmasını bekliyorum. Olduğu zaman gidip RTC yi okuyorum.
Bu şekilde çalışan programlar hem daha iyi hemde daha iyi bir RTC kontrolü sağlamaktadır.

DS1307 nin 1Hz lik bir çıkışı var Bu çıkışı aslında kesme yaratacak şekilde kurup kesme oluştuğunda zaman okumak belkide daha akıllıca olabilir.

Ete

xoom

#6
Alıntı yapılan: ete - 01 Mayıs 2015, 11:35:26
Kesme aralığı çok kısa ise ve tam RTC den bilgi okur iken kesme gelirse okuma işi sekteye uğrayabilir.
Bu tür sorunları yaşamamak için ben genelde bir bit değişkenini set ederim ve o değişkeni kesme içinde reset ederim.
Set ettiğim yerde ise reset oluncaya kadar bekler ondan sonra RTC okumaya (yada sensör okumaya) giderim.
Bu yöntem epeyce faydalı olmaktadır.

Senin sorunun daha başka bir şey gibi geliyor bana. Ama ortada mantığa uymayan bir açıklama var. 10 saat hiç şaşmasın sonra şaşsın böyle bir şey olamaz. Zaman zaman RTC li sistemleri simule ederken ekrandaki saatin garip rakamlar yazdığına şahit oluyorum. Bunun sebebini henüz bulabilmiş değilim. Ama tahmin edebiliyorum. SOnuçta RTC denilen şey zamanı sayıyor ve zaman değerlerinide içindeki registerlerine yerleştiriyor ve sende oradan alıyorsun. Bu aşamada şöyle düşün ,normal şartlarde register değerleri her 1000 ms de bir yapılıyor. Şayet bir zamanlayıcın olabilse ve her zaman değişimini algılayabilsen ve ondan 1 ms sonra RTC yi okusan hiç bir sorunun olmayacak. Ama bir zaman tutmayıp sürekli olarak RTC yi okumaya çalışıp değiştimi bakmak zorunda kalıyor isen ve tam sen bakarken register değeride değişiyor ise ortaya garip sonuçlar çıkabiliyor. Bu nedenle RTC nin mutlaka 1000ms lik peryotlarla okunması en doğrusudur. Son yazdığım programlarda artık TMR1 sayacını kullanarak (4Mhzde) 500ms lik bir süre yaratıyorum. Bunuda PIR1.0 registeri ile kontrol ediyorum. süre 500 ms yi aşar aşmaz PIR1.0=1 oluyor. While wend kullanarak PIR1.0 sıfır olduğu sürece yapılacak işleri yapıyor sonra tekrar sayacı çalıştırıp 1000 ms olmasını bekliyorum. Olduğu zaman gidip RTC yi okuyorum.
Bu şekilde çalışan programlar hem daha iyi hemde daha iyi bir RTC kontrolü sağlamaktadır.

DS1307 nin 1Hz lik bir çıkışı var Bu çıkışı aslında kesme yaratacak şekilde kurup kesme oluştuğunda zaman okumak belkide daha akıllıca olabilir.

Ete

Alıntı YapBu nedenle RTC nin mutlaka 1000ms lik peryotlarla okunması en doğrusudur. Son yazdığım programlarda artık TMR1 sayacını kullanarak (4Mhzde) 500ms lik bir süre yaratıyorum. Bunuda PIR1.0 registeri ile kontrol ediyorum. süre 500 ms yi aşar aşmaz PIR1.0=1 oluyor. While wend kullanarak PIR1.0 sıfır olduğu sürece yapılacak işleri yapıyor sonra tekrar sayacı çalıştırıp 1000 ms olmasını bekliyorum. Olduğu zaman gidip RTC yi okuyorum
.
yukarıdakine benzer bir programlama Yaptım
Mainde sonsuz döngüye girmeden evvel rtc okuyup displaylerde yansıtıyorum.
Timer0 kurup 500ms olunca xx değişkeni 1 yapıyorum 500ms sonra 0 çekiyorum..
Sonsuz döngüye girip xx 1 iken rtc okuyorum (500ms) bu 1000ms de yapılabilir tabi.
Ama gel gelelim cevizler karışıyor..
Birde şöyle bir durum yaşıyorum.. Rtc den gün bilgisini alıyorum K değişkenine atıyorum gün!=K sorgusu ile gün K 'dan farklı ise Sayı değişkenini bir arttırıyorum.. Neden yazdım bunları çünkü saat belli bir süre çok güzel Çalışıyor sonra cevizler karıştığı zaman bi bakıyorum sayi değişekenim gün değişmeden 1 artmış oluyor ve saat geri kalmaya Başlıyor..
Bu rtc okurken 500ms kesmelere denk geldiğinden cevizlerim karışıyor gibi..

Düzeltme: gün değişmeden Say'ı değişkenim bir artmış diyorum ama 24 saat geçmeden Sayın'ın 1 artmasından dolayı böyle diyorum yoksa rtc içinde gün değişmemesi gerekirken değişiyormu bilemiyorum.

rodyum

bişey soracam.
kesme döngüsü içinde hangi işlemleri yapıyorsun? display tarama mı?

xoom

Alıntı yapılan: rodyum - 01 Mayıs 2015, 15:18:03
bişey soracam.
kesme döngüsü içinde hangi işlemleri yapıyorsun? display tarama mı?
hiçbirşey yapmıyorum.. sadece bir değikeni 500ms de bir 1 yapıyorum 500ms sonra 0 yapıyorum..
tpic6b595 kullanıyorum tarama yapmıyorum.

xoom

Mucit23 bana sen yardım edersin.. Şu işi en stabil nasıl çözebilirim ccs  c olarak bana yardım Edermisin. Tpic ve ds1302 ile çalışan kullandığın bir program varsa çok makbule geçer veya sadece ete hocamın bahsettiği gibi bir algoritma veya kendin kullandığın algoritmaya göre bir yardım Edermisin..yanlız gerçek devrede kullandığın bir kodlama olursa deneme yapmak isterim. Bi yerde hata yapıyorum ama nerede.. Çünkü ete hocamın kendi saatlerinde kodu attığım zaman sorunsuz Çalışıyor. Yazılım hatası yapıyorum kesin.

Mucit23

Kodların tümünü buraya eklermisin

Senin verdiklerini ben ekleyeyim
void main()
{

   delay_ms(100);
   rtc_init();
   Delay_ms(10);
   Set_Tris_A(0x0F);
   Set_Tris_B(0x10);
   Output_A(0x00);
   Output_B(0x00);
   

   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);
   set_timer0(60);                             
   enable_interrupts(INT_timer0);               
   enable_interrupts(GLOBAL);                   
   
    rtc_get_date(gun,ay,yil,haftanin_gunu);
    x=read_int16_eeprom(5);
    sayi=read_int16_eeprom(0);
       
   while(TRUE)
   { 
      rtc_get_time(saat,dakika,saniye);
      delay_ms(100);
     
      saat1=saat%10;
      saat10=saat/10;   
      dakika1= dakika%10;
      dakika10=dakika/10;

      TPIC595(digit[dakika1]);
      TPIC595(digit[dakika10]);
      TPIC595(digit[saat1]);
      TPIC595(digit[saat10]);
      output_high(LOAD);
      output_low(LOAD);
           
         if(input(pin_A5)==1){while(input(pin_A5));set_degeri=1;ayarmod();write_int16_eeprom(0,sayi);}
         x=gun;
         rtc_get_date(gun,ay,yil,haftanin_gunu);
         delay_ms(100);
         if(x!=gun){sayi++;delay_ms(5); write_int16_eeprom(0,sayi);write_int16_eeprom(5,x);}
     
   }

}


Bu kod eksik. Burada gördüğüm tek bir hata var
rtc_get_time(saat,dakika,saniye);
Bu kodda saat dakika ve saniye değerlerinin adreslerini fonksiyona göndermen gerekir. Pointer kullanıyorsun çünkü.
doğrusu aşağıdaki gibi olmalı.
rtc_get_time(&saat,&dakika,&saniye);

aynısı rtc_get_data içinde geçerli
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

xoom

Bahsertigin kullanımlar yanlış olmaması gerekiyor. O şekilde kullaniliyor olsa idi saatin hiç çalışmaması gerekmezmiydi.

Mucit23

#12
Pointer kullanılıyor diye algıladım. Tabi kodun tümünü görmeden yorum yapmak zor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal