Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

rtc ds1302 problemi

Başlatan ranadilara, 09 Mayıs 2008, 10:48:01

ranadilara

Merhaba arkadaşlar,
ds1302 kullanarak lcd'ye tarih yazdırmak istiyorum, Serdar Çiçek'in kitabındaki örneğin aynısını denedim ancak ekranda sadece
D:00/00/2000
H:00:00:00
görüyorum, problem nedir acaba?
kodlar bu şekilde

#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay (clock=4000000)
#include <lcd.c>
#include <DS1302.c>

byte saniye, dakika, saat, gun, ay, yil, haftanin_gunu;

void main()
{setup_psp(PSP_DISABLED);
 setup_spi(SPI_SS_DISABLED);
 setup_timer_1(T1_DISABLED);
 setup_timer_2(T2_DISABLED,0,1);
 setup_adc_ports(NO_ANALOGS);
 setup_adc(ADC_OFF);
 setup_CCP1(CCP_OFF);
 setup_CCP1(CCP_OFF);
 
 lcd_init();
 rtc_init();
 
 rtc_set_datetime(9, 06, 8, 4, 10, 18);

 while(1)
 {
  rtc_get_time(saat, dakika, saniye);
  rtc_get_date(gun, ay, yil, haftanin_gunu);
  
  printf(lcd_putc, "\fD:%02d/%02d/20%02d", gun, ay, yil);
  
  switch(haftanin_gunu)
  {case 1: printf(lcd_putc, "PAZ"); break;
   case 2: printf(lcd_putc, "PZT"); break;
   case 3: printf(lcd_putc, "SAL"); break;
   case 4: printf(lcd_putc, "CRS"); break;
   case 5: printf(lcd_putc, "PRS"); break;
   case 6: printf(lcd_putc, "CUM"); break;
   case 7: printf(lcd_putc, "CTS"); break;
   }
   
   printf(lcd_putc, "\nH:%02d:%02d:%02d", saat, dakika, saniye);
    
   delay_ms(1000);
  
}

}


yardımcı olursanız sevinirim...

ranadilara

arkadaşlar ds1302'yi proteusta çalıştırdım, lakin bu sefer de dakika bilgisinde yanlışlıklar oluyor, her dakikada bir artmıyor, mesela 11.31den 11.38e atlıyor bu proteustan kaynaklanan bişey mi acaba
çalıştırdığım kodlar

#include <16f877A.h>            
#use delay(CLOCK=4000000)         
#fuses XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT  
#define RTC_SCLK PIN_c4           
#define RTC_IO   PIN_c5
#define RTC_RST  PIN_c3          
#include <ds1302.c>               
#include <lcd.c>                 

int saniye,dakika,saat,gun,ay,yil,haftanin_gunu;   


void main(void){
   lcd_init();  
   rtc_init();  

   rtc_set_datetime(9,6,8,2,11,11); 

   while(1)
   {
      rtc_get_time(saat,dakika,saniye);
     
      rtc_get_date(gun,ay,yil,haftanin_gunu);
      
      printf(lcd_putc,"\f%02d/%02d/20%02d",gun,ay,yil);
      printf(lcd_putc," %02d:%02d:%02d",saat,dakika,saniye);
      delay_ms(1000); 
   }
}

arslan74

Alıntı yapılan: "ranadilara"arkadaşlar ds1302'yi proteusta çalıştırdım, lakin bu sefer de dakika bilgisinde yanlışlıklar oluyor, her dakikada bir artmıyor, mesela 11.31den 11.38e atlıyor bu proteustan kaynaklanan bişey mi acaba
çalıştırdığım kodlar

#include <16f877A.h>            
#use delay(CLOCK=4000000)         
#fuses XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT  
#define RTC_SCLK PIN_c4           
#define RTC_IO   PIN_c5
#define RTC_RST  PIN_c3          
#include <ds1302.c>               
#include <lcd.c>                 

int saniye,dakika,saat,gun,ay,yil,haftanin_gunu;   


void main(void){
   lcd_init();  
   rtc_init();  

   rtc_set_datetime(9,6,8,2,11,11); 

   while(1)
   {
      rtc_get_time(saat,dakika,saniye);
     
      rtc_get_date(gun,ay,yil,haftanin_gunu);
      
      printf(lcd_putc,"\f%02d/%02d/20%02d",gun,ay,yil);
      printf(lcd_putc," %02d:%02d:%02d",saat,dakika,saniye);
      delay_ms(1000); 
   }
}

Merhaba,

bu sorun kodlamadan kaynaklaniyor. Bende daha önceleri bu malzemeyle denemeler yapmıştım öyle bir sorunla karılaşmamıştım.

Selamlar

KIRIKDR

bende karsılastım hocam aynı sorunla nedeni nedir bilemiyorum...serdar hocanın kitabındaki örnekler altas kitabın sitesinde var.oradaki örneği simüle edince bir sorun cıkmıyor ama aynı örnek programın ccs kodlarında en ufak bir değişklikte bahsettiğiniz hatayı veriyor.ben araya bir iki kod eklemek istedim ama olmadı hata verdi belki proteus versiyonlarının uyumsuzluğundan kaynaklanabilir....

denemek isteyen arkadaşlar aşağıdaki linkten programa ulaşabilir..dosyanın içindeki ds1302 ile rtc uygulamasına bakınız..
http://www.altaskitap.com/CCS_C/CCS_C_HEX_DSN.rar

Erol YILMAZ

DS1302 nin DATA pinini  4k7 ile PULL-UP yapmayı unutmayınız...

Mucit23

Allegro hocam yanlış anlamayın bilmediğimden soruyorum. Ds1302 SPI protokolüyle haberleşiyor. Şimdiye kadar hiç ds1302 nin data bacağına pull-up direnci koymadım. Çalışmasını veya haberleşmesini etkilemiyordu. SPI ile haberleşmelerde data bacağına pull-up koymaya gerek varmıdır.

Erol YILMAZ

evet bende bu konuda çok düşündüm ama pratikte
pull-up direnci koyunca düzgün çalışıyor, kaymayınca düzgün çalışmıyor.
DS1302'den rakamlar rastgele geliyor.

Ve Maxim dediğin gibi hiçbiryerde de Pull-up koyun demiyor.

ibrsel

Arkadaşlar acaba DS den okuduğunuz bilgiyi DECİMAL değere dönüştürüyormusunuz..Eğer bu dönüşümü yapmıyor iseniz,okuduğunuz değeri direkt LCD ye yazdırıyorsanız hata yapıyorsunuz demektir. Çünkü DS içerisinde "Saniye,Dakika,Saat,Gün,Ay,Yıl" değerleri "BCD" formatında saklanır. Protokolde haberleşip bu değerleri okuduğunuzda,ve bir değişkene aktadığınızda bu değerleri aynı zamanda DECIMAL e dönüştürmeniz gerekir..Unutmayın !!

omereliusuk

#8
ds1302.c de okuma yaparken zaten bcd formatını decimal e çevirip gönderen bir fonksiyon var.
ayrıca yazma yaparken de tam tersi decimali bcd'ye çeviren bir fonksiyon var. hususi açtım baktım. sorun yok.

hatta garibime gitti.

byte rm_bcd(BYTE data)
{
   byte i;

   i=data;
   data=(i>>4)*10;
  data=data+(i<<4>>4);

   return data;
}

renkli olan yer de i'yi önce sola 4 kaydırmış daha sonra sağa dört kaydırmış. ben böyle bir şey düşünmüştüm ama
olmaz diye yazmamıştım.
şöyle yazmıştım:
byte rm_bcd(BYTE data)
{
   byte i;
byte i1;
   i=data;
   data=(i>>4)*10;
i1=i%16  //i1 bcd nin 1lik bölümü sayıyı 16'ya bölüp kalan değer
  data=data+i1;

   return data;
}

büyük ihtimalle sizin 31 den sonra 38 geliyor demeniz İSİS in azizliği ...
sisteminizin gerçekte çalışıyor olması gerekir diye düşünüyorum. malum isis hesap kitap uzmanı... arada da böyle hesap hataları yapabiliyor...
en azından ben öyle düşünüyorum.

Ferhat Özdemir

Eğer her 1 saniyede 8 saniye fark atiyorsa mantik olarak sorun delay süresinde gibi gorunuyor.

delay_ms(1000); burayi, delay_ms(100); olarak degistirip dene bakalim.

Diğer bir husus, ben bu uygulamayı farkli turde yapmiştim ve zaman bilgileri sabit kaliyordu. Sonra sigortalardan
INTRC_IO   ekleyince duzeldi. Belki bir faydasi olur.