Ds1302 düzgün çalışmıyor. Yardım

Başlatan ghistmanzero, 12 Mart 2017, 18:29:46

ghistmanzero

Merhaba arkadaşlar. Ds1302 ile bir uygulama yapmam gerekiyor. Proteusta çalıştı. Saate göre çıkış filan veriyorum pwm olarak. Her şey iyi hoş derken devreyi kurdum. Lehimleme filan bitti. Çalıştirinca ekrana bu ilginç sonuç çıkıyor. Ds1302 nin io ve reset uçlarına elimle dokununca degerler değişiyor. Bazen bi anlık da olsa doğru gösteriyor. Sonra donuyor. Yine bu şekilde kalıyor. Ds1302 değiştirdim ise yaramadi. Yolları komple lehimle kapladım. Yine olmadı. Defalarca yolları kontrol ettim multimetre ile. Kısa devre yok. Bu durumla karşılaşan  var mı daha önce?
Kodlar bunlar
#include <16f877A.h>            //Kullanılacak pic 

#FUSES NOWDT                    //No Watch Dog Timer 
#FUSES NOBROWNOUT               //No brownout reset 
#FUSES NOLVP 
#FUSES   XT 
#use delay(crystal=4MHz) 
  
     #define LCD_ENABLE_PIN  PIN_B0 
     #define LCD_RS_PIN      PIN_B1 
     #define LCD_RW_PIN      PIN_B2                              
     #define LCD_DATA4       PIN_B4                                
     #define LCD_DATA5       PIN_B5                              
     #define LCD_DATA6       PIN_B6                                    
     #define LCD_DATA7       PIN_B7  

     #define d1      PIN_A0                              
     #define d2      PIN_A1                          
     #define d3      PIN_A2                              
     #define d4      PIN_A3                                
     #define d5      PIN_A5                              
     #define d6      PIN_E0                                    
    



#define b_sabah   PIN_c1 
#define b_aksam   PIN_d0 
#define f_t PIN_d1 


#include "lcd.c" //lcd ait fonksiyonlar programa eklenir 

#include "ds1302.C" 


int8 s_saat1;
int8 s_saat2;
int8 a_saat1;
int8 a_saat2;
int8 saniye,dakika,saat,gun,ay,hafta,yil=0; 
int16 a; 
int16 b; 




  
 void lcd() 
{ 
   lcd_gotoxy(1,1); 
   printf(lcd_putc,"%02d/%02d/%02d",gun,ay,yil);  
   lcd_gotoxy(1,2); 
   printf(lcd_putc,"%02d:%02d:%02d",saat,dakika,saniye); 
   lcd_gotoxy(11,1); 
   switch(hafta)  
      {                      
         case 1: printf(lcd_putc,"Pzts"); break; 
         case 2: printf(lcd_putc,"SALI"); break; 
         case 3: printf(lcd_putc,"CARS"); break; 
         case 4: printf(lcd_putc,"PERS"); break; 
         case 5: printf(lcd_putc,"CUMA"); break; 
         case 6: printf(lcd_putc,"Cmts"); break; 
         case 7: printf(lcd_putc,"Pzar"); break; 
      } 
  
} 
  
     int yandi1=0; 
     int yandi2=0; 
     int turn1=0; 
     int turn2=0; 
     int ayar1=1; 
     int ayar2=1; 
     int anahtar=0;  
      
      
void main() 
{ 
    

    
     lcd_init(); 
     lcd_putc("\f"); 
  
    


   rtc_init();       //saat entegresini hazırla 
   delay_ms(5); 

 //  rtc_set_datetime(24,02,17,05,15,59);  //rtc_set_datetime(gun,ay,yil,hafta,saat,dakika);    //değişkenleri saat entegresine aktar. 
   delay_ms(20); 
    
    setup_ccp1(CCP_PWM); 
      
    setup_timer_2(T2_DIV_BY_16,170,1); 
    

  
while (1) 
{   if(input(pin_e2) && anahtar==0){  set_pwm1_duty(0); anahtar=1;  } 

  

rtc_get_time(saat,dakika,saniye);   rtc_get_date(gun,ay,yil,hafta); 


  

  lcd(); 
  

  if(input(b_sabah)) 
  { while(input(b_sabah)) {} 
    ayar1++; 
    if(ayar1>3){ayar1=1;} 
    
    write_eeprom(1,ayar1); 
    
  } 
   ayar1=read_eeprom(1); 
    
   if(ayar1==1){s_saat1=4; s_saat2=7;output_high(d6);output_low(d5);output_low(d4);}
   if(ayar1==2){s_saat1=6; s_saat2=8;output_high(d6);output_high(d5);output_low(d4);}
   if(ayar1==3){s_saat1=5; s_saat2=8;output_high(d6);output_high(d5);output_high(d4);}
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////  
    
  
  
  
  if(input(b_aksam)) 
    { 
    
       while(input(b_aksam)) {} 
       ayar2++; 
       if(ayar2>3){ayar2=1;} 
        
        write_eeprom(2,ayar2); 
    } 
        ayar2=read_eeprom(2); 
  
   if(ayar2==1){a_saat1=16; a_saat2=18;output_high(d3);output_low(d2);output_low(d1);}
   if(ayar2==2){a_saat1=18; a_saat2=20;output_high(d3);output_high(d2);output_low(d1);}  
   if(ayar2==3){a_saat1=17; a_saat2=19;output_high(d3);output_high(d2);output_high(d1);}
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    

  if ((saat>a_saat2 && saat<=24)  || (saat>=0 && saat<s_saat1)){ if(read_eeprom(4)==1){  set_pwm1_duty(170); } if(read_eeprom(4)==0){goto seviyeli_yak;} } 
  
  
  

  if (saat>s_saat2 && saat<a_saat1){if(read_eeprom(3)==1){  set_pwm1_duty(0); } if(read_eeprom(3)==0){goto seviyeli_sondur;} } 
 //////////////////////////////////////////////////////////////////////////// 
  
  if(turn2==0 && saat==s_saat2){goto seviyeli_sondur;} 
  if(turn1==0 && saat==a_saat2){goto seviyeli_yak;} 
  

  
 if(!input(f_t) && saat>=a_saat1 && saat<=a_saat2 && turn1==0) 
 { 
 seviyeli_yak:  
  
for(int i=0;i<=170;i+=3 ){//pwm1 ayarları for döngüsü ile arttırılacak 


set_pwm1_duty(i); 
delay_ms(100); 
if(i>165){set_pwm1_duty(170);  
turn1 =1; 
  turn2=0; 
  yandi1=1; 
  yandi2=0; 
  write_eeprom(4,yandi1); 
  break;} 

} 

 } 
  
 //////////////////////////////////////////////////////////////////// 

  
 if(input(f_t) && saat>=s_saat1 && saat<=s_saat2 && turn2==0) 
 { 
 seviyeli_sondur:    
for(int i=170;i>=0;i-=5){//pwm1 ayarları for döngüsü ile arttırılacak 


  
set_pwm1_duty(i); 
delay_ms(100); 
if(i<=5){set_pwm1_duty(0); 
  turn1=0; 
  turn2=1; 
  yandi2=1; 
  yandi1=0; 
  write_eeprom(3,yandi2);    
  break;} 


} 

 } 
  

 /////////////////////////////////////////////////////////////////////// 
  
  
  
 } 
}







mehmet

"int" yerine unsigned int olarak tanımlayıp deneyiniz...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

ghistmanzero

Alıntı yapılan: mehmet - 12 Mart 2017, 18:55:24
"int" yerine unsigned int olarak tanımlayıp deneyiniz...

Değiştirdim ama olmadı :/ hala aynı durum. Başka bir program atıp çıkışları filan da kontrol ettim. Hiçbir sıkıntı yok. Ama dediğim gibi rst ve io uçlarına elimle dokununca ekran hafif geliyor yazı. Mesela "Pzar" yazısı görünüyor ama sonra ctesi de oluyor diğer günler de. Hani anlık olarak değişiyor. Diğer rakamlar ise kafasına göre değişiyor. Elbetteki bu durum olağan. Hani elimle kisa devre etmiş oluyorum. Neden böyle ilginç şeyler benim başıma geliyor anlamıyorum :D

mehmet

#3
DS1302 data yolları pull-up değil mi yoksa?

"rst", "sclk" ve "io" pinlerini 4,7K - 10K arasında birer
direnç ile +5V. 'a bağlayınız...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

ghistmanzero

Alıntı yapılan: mehmet - 12 Mart 2017, 19:12:10
DS1302 data yolları pull-up değil mi yoksa?
Vala yollar direk bağlı. Aynı proteus simulasyonundaki gibi. İo rst ve sclk pinlerini 4. 7 k öle pull up mi yapmam lazım?  Daha önce böyle bi örneğe denk gelmedim ama

ghistmanzero

#5
Alıntı yapılan: mehmet - 12 Mart 2017, 19:12:10
DS1302 data yolları pull-up değil mi yoksa?

"rst", "sclk" ve "io" pinlerini 4,7K - 10K arasında birer
direnç ile +5V. 'a bağlayınız...

Dediğiniz gibi yaptım. Artık elimi dokundurunca hiç tepki vermiyor.  Ekran yine aynı şekilde.
- 91/-91/-91
-91:-91:-91
:((   bunun dışında herşey çalışıyor. Eprom, Ledler falan. Herşey tamam ama ds1302 sıkıntı çıkarıyor. iki üç tane denedim ama yine aynı

ete

Bana göre ds1302 de pullup direnci gerekmez. Aksine data sheet'e bakarsanız (Sayfa-3)  o pinlerde 40 Kohm dahili Pull-Down direnci bağlı olduğu yazılıdır.
Çok gerekiyor ise harici pull-down direnci bağlanabilir. Pullup olursa dahada kararsız kalacaktır o pinler.
Sorunun şekline bakılırsa o pinler kararsız konumda (high ile low arasında) kalıyorlar yada bir etkilenme durumu var veya baskılı devrede o pinlerin bağlantıları osilasyon yapıyordur. Skop ile bakmak gerekir. Entgere besleme bacaklarına 10Mf + 100nf Kondansatör bağlamak çözüm olabilir.

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

ghistmanzero

Alıntı yapılan: mehmet - 12 Mart 2017, 19:12:10
DS1302 data yolları pull-up değil mi yoksa?

"rst", "sclk" ve "io" pinlerini 4,7K - 10K arasında birer
direnç ile +5V. 'a bağlayınız...

ediğiniz gibi yaptım. Artık elimi dokundurunca hiç tepki vermiyor.  Ekran yine aynı şekilde.
- 91/-91/-91
-91:-91:-91
:((   bunun dışında herşey çalışıyor. Eprom, Ledler falan. Herşey tamam ama ds1302 sıkıntı çıkarıyor. iki üç tane denedim ama yine aynı

ghistmanzero

Alıntı yapılan: ete - 12 Mart 2017, 20:18:56
Bana göre ds1302 de pullup direnci gerekmez. Aksine data sheet'e bakarsanız (Sayfa-3)  o pinlerde 40 Kohm dahili Pull-Down direnci bağlı olduğu yazılıdır.
Çok gerekiyor ise harici pull-down direnci bağlanabilir. Pullup olursa dahada kararsız kalacaktır o pinler.
Sorunun şekline bakılırsa o pinler kararsız konumda (high ile low arasında) kalıyorlar yada bir etkilenme durumu var veya baskılı devrede o pinlerin bağlantıları osilasyon yapıyordur. Skop ile bakmak gerekir. Entgere besleme bacaklarına 10Mf + 100nf Kondansatör bağlamak çözüm olabilir.

Ete


Galiba haklısınız. Çünkü pull up ları bağlayınca artık elimle temas etsem de bir değişiklik olmuyor. Normalde çalışir durumda bile bu kadar stabil bit görüntü vermez :D şu an sabit bir şekilde 
-91/-91/-91
-91:-91:-91
Gösteriyor. Galiba dirençleri Sökmem gerekecek :/şimdi lehimden sonra  Proteusta  da pull up bağlayınca hata verdi.ekrsn dönük kalıyor.  baglanti olarak komple lehimle kapladim sıkıntı olmasın diye. Farklı kaynaklardan enerji vermeye çalıştım. Yine aynı . Ben bu - 91in neden geldiğini anlayamadim bir türlü. Kısa sürede de bitirmem lazım. Siz yapınca direk bağlayınca oluyor mu? Pinleri sırayla hem koddan hem de proteustan kontrol ettim. Bir sıkıntı görünmüyor. Neyi kaçırıyorum anlamıyorum :/

Melih1802

MCU ya bağlanan 3 ucu 10k ile Pullup yaparak dener misin.

ghistmanzero

Alıntı yapılan: Melih1802 - 12 Mart 2017, 20:29:04
MCU ya bağlanan 3 ucu 10k ile Pullup yaparak dener misin.

Tam olarak hangi ucu kastettin?  Mcu ya bağlanan 3 pin var. İo, rst  ve sclk. Bunlar ds1302 den gelenler. Hangisini pull up edeyim?

sifirzero

#FUSES NOBROWNOUT   
[/size]
[/size]#FUSES BROWNOUT  olarak değiştirirmisin.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

ghistmanzero

Pull up ları sökup rst, sclk ve io 'ya pull down koydum 4.7k. Şu an
00/00/00
00:00:00
Gösteriyor. Ne şanssizim ya :) bir türlü çalıştıramadım şu devreyi :)
32.768khz lik xtal değistiridm olmadı.
DS1302 değiştirdim olmadı
Pıc değiştirdim olmadı
Yolları aresten, isisten, devremden,  pic ev ds1302 datasheetinden bakarak kontrol ettim. Doğru.
Teker teker kısa devre var mı diye baktım. Hiç yok.
Kafayı yedirecek bana bu devre ya


ghistmanzero

Sorun çözüldü.
Arka tarafa elimle dokununca çalışmasınin sebebi pull down larindaki sorun galiba. Ben sclk, io ve ce uçlarına 4.7k  pull-down ekledim. Sonra ekrana
00 /00/00
00:00:00 göstermeye başladı. Ekranda böyle komple sıfır veya bazı degerler sıfır bazılarıni da faklı rakamlar şeklinde gösteriyor ise sorun ds1302 de oluyor. Alıp daha önce değiştirdigim ds1302 yi taktım. Çalıştı.
YALNIZ  TARIH VE ZAMAN AYARI YAPMAYINCA (DİREK DEFAULT AYARI İLE ÇALIŞTİRİNCA ) YANLIŞ TARIH GÖSTERİYOR. AÇIP KAPATINCA VE RESET EDİNCE ARKADA SAYIYOR. HANİ YANLIŞ SAAT GOSTERIYOR AMA KAPATINCA DURMUYOR. ARKADA SAYIYOR.
AMA
BEN KEDİM SET EDİNCE DE HER RESETTE VE AÇIP KAPAMADA KUDUGUM ZAMANA GERİ DÖNÜYOR. BUNU NASIL HALEDICEM. KÜTÜPHANESINDEKI DEFAULT AYARINI NASIL DEĞİŞTİRECEM?

sifirzero

sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir