DS1302 negatif bir tarih veriyor. Çalışmıyor.

Başlatan mikroserdar, 13 Eylül 2010, 00:04:45

mikroserdar

Merhaba arkadaşlar. Serdar Çiçek'in CCS C ile yazmış olduğu DS1302 ile yapılmış gerçek zamanlı saat uygulama devresini kurdum. Hex. dosyasını oluşturdum. Fakat LCD'de. 

    T:-1/-1/20-1    (LCD 1. Satır)
    Saat:-1/-1/-1  (LCD 2. Satır)

Diye bir ifade çıkıyor. Kod şöyle:

/******************************************************************
PIC16F877 ile DS1302 Gerçek Zamanlı Saat (RTC) Uygulaması
*******************************************************************/
#include <16F877.h>     // Kullanılacak denetleyicinin başlık                 // dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#define use_portb_lcd TRUE   // LCD B portuna bağlı
#include <lcd.c>     // LCD.c dosyası programa ekleniyor
#include <DS1302.c>  // DS1302.c dosyası programa ekleniyor
#define RTC_SCLK PIN_c1      // DS1302 için pin tanımlamaları
#define RTC_IO   PIN_c2
#define RTC_RST  PIN_c0

byte saniye,dakika,saat,gun,ay,yil,haftanin_gunu; // byte türünde değişkenler tanımlanıyor

//******************* ANA PROGRAM FONKSİYONU *******************
void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   lcd_init();  // LCD başlangıç ayarları yapılıyor
   rtc_init();  // DS1302 başlangıç ayarları yapılıyor

   rtc_set_datetime(25,07,07,4,22,52); // Tarih ve Saat ayarları yapılıyor

   while(1)
   {
      rtc_get_time(saat,dakika,saniye);       // DS1302'den saat,dakika,saniye bilgileri alınıyor
      rtc_get_date(gun,ay,yil,haftanin_gunu); // DS1302'den gün,ay,yil ve günün isim bilgisi alınıyor
      printf(lcd_putc,"\fT:%02d/%02d/20%02d ",gun,ay,yil); //LCD'ye gün,ay,yıl bilgileri yazdırılıyor

      switch(haftanin_gunu)  // DS1302'den sayısal olarak alınan haftanın günü bilgisine
      {                      // metin olarak karşılık atanıyor
         case 1: printf(lcd_putc,"PAZ"); break; // Eğer "1" ise LCD'ye PAZ yaz
         case 2: printf(lcd_putc,"PZT"); break; // Eğer "2" ise LCD'ye PZT yaz
         case 3: printf(lcd_putc,"SAL"); break; // Eğer "3" ise LCD'ye SAL yaz
         case 4: printf(lcd_putc,"CRS"); break; // Eğer "4" ise LCD'ye CRS yaz
         case 5: printf(lcd_putc,"PER"); break; // Eğer "5" ise LCD'ye PER yaz
         case 6: printf(lcd_putc,"CUM"); break; // Eğer "6" ise LCD'ye CUM yaz
         case 7: printf(lcd_putc,"CTS"); break; // Eğer "7" ise LCD'ye CTS yaz
      }
      printf(lcd_putc,"\nSaat:%02d:%02d:%02d",saat,dakika,saniye); // LCD'ye saat,dakika ve saniye değerlerini yaz
      delay_ms(1000); // 1 sn gecikme veriliyor
   }
}


Yani şöyle olması gerekiyor:

  T:25/07/2007  CRS    (LCD 1. Satır)
    Saat:22/52/04  (LCD 2. Satır)  olması gerekiyor.

DS1302'nin bozuk olma olasılığı var mı acaba?. Bütün bağlantılar kitaba göre yapıldı. Ve doğru. Bir kaç kez bağlantıları kontrol ettim.


Şimdiden teşekkürler.
mikrodentleyici yaşam biçimidir.

muhittin_kaplan

kitapta
#define RTC_SCLK PIN_c1      // DS1302 için pin tanımlamaları
#define RTC_IO   PIN_c2
#define RTC_RST  PIN_c0

tanımlamaları yok. o tanımlamalar büyük ihtimalle ds1302.c dosyasında da vardır. onları kaldırıp deneyiniz

radres

Evet kitapta @muhittin_kaplan'ın dediği gibi

#define RTC_SCLK PIN_c1      // DS1302 için pin tanımlamaları
#define RTC_IO   PIN_c2
#define RTC_RST  PIN_c0

ifadeleri yok. Bunlar olmadan deneyince ISIS'te çalışıyor.

zamzam23

illa o pinleri kullanacaksan ds1302.c içindeki ilgili satırları silip deneyebilirsin.belki calısır emın değilim.

mikroserdar

Dediğini aynen yaptım ekranda şöyle bir ifade çıktı. Yani DS1302.c dosyasında ki pin değişikliğini yapınca:

    T:00/00/2000    (LCD 1. Satır)
    Saat:00/00/80  (LCD 2. Satır)


Bu ifade çıkıyor. Acaba sorun nedir. Bilebilecek bir arkadaş var mı acaba. Acaba DS1302 mi bozuk.

yardım ederseniz çok sevinirim. Şimdiden teşekürler.
mikrodentleyici yaşam biçimidir.

radres

PROTEUS'ta mı deniyorsun yoksa gerçek ortamda mı?

mikroserdar

Gerçek zamanlı gerçekleştiriyorum devreyi. Serdar Çiçek'in kitabındaki devreyi aynen kurdum. DS1302.c dosyasında değişiklik yaptım ve ekran bir önceki mesajımdaki gibi. Yani. 00'lı. Saniye 80'i gösteriyor. Anlamadım bu işten bişey.
mikrodentleyici yaşam biçimidir.

zamzam23

#7
/******************************************************************
 PIC16F877 ile DS1621 Sıcaklık ve Termostat Entegresi Uygulaması
*******************************************************************/
#include <16f877.h>     // Kullanılacak denetleyicinin başlık                 // dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#define use_portb_lcd TRUE   // LCD B portuna bağlı
#include <lcd.c>     // LCD.c dosyası programa ekleniyor
#include <DS1302.c>  // DS1302.c dosyası programa ekleniyor

byte saniye,dakika,saat,gun,ay,yil,haftanin_gunu; // byte türünde değişkenler tanımlanıyor

//******************* ANA PROGRAM FONKSİYONU *******************
void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   lcd_init();  // LCD başlangıç ayarları yapılıyor
   rtc_init();  // DS1302 başlangıç ayarları yapılıyor

   rtc_set_datetime(20,07,07,6,22,52); // Tarih ve Saat ayarları yapılıyor

   while(1)
   {
      rtc_get_time(saat,dakika,saniye);       // DS1302'den saat,dakika,saniye bilgileri alınıyor
      rtc_get_date(gun,ay,yil,haftanin_gunu); // DS1302'den gün,ay,yil ve günün isim bilgisi alınıyor
      printf(lcd_putc,"\fT:%02d/%02d/20%02d ",gun,ay,yil); //LCD'ye gün,ay,yıl bilgileri yazdırılıyor

      switch(haftanin_gunu)  // DS1302'den sayısal olarak alınan haftanın günü bilgisine
      {                      // metin olarak karşılık atanıyor
         case 1: printf(lcd_putc,"PAZ"); break; // Eğer "1" ise LCD'ye PAZ yaz
         case 2: printf(lcd_putc,"PZT"); break; // Eğer "2" ise LCD'ye PZT yaz
         case 3: printf(lcd_putc,"SAL"); break; // Eğer "3" ise LCD'ye SAL yaz
         case 4: printf(lcd_putc,"CRS"); break; // Eğer "4" ise LCD'ye CRS yaz
         case 5: printf(lcd_putc,"PER"); break; // Eğer "5" ise LCD'ye PER yaz
         case 6: printf(lcd_putc,"CUM"); break; // Eğer "6" ise LCD'ye CUM yaz
         case 7: printf(lcd_putc,"CTS"); break; // Eğer "7" ise LCD'ye CTS yaz
      }
      printf(lcd_putc,"\nSaat:%02d:%02d:%02d",saat,dakika,saniye); // LCD'ye saat,dakika ve saniye değerlerini yaz
      delay_ms(1000); // 1 sn gecikme veriliyor
   }
}


devre bu haliyle proteusta calısıyor. eger board uzerınde calısmıyorsa;
1-bağlantılarını kontrol edin. lcd bağlantıların tmm gibi. ds1302 nin bağlantılarını kontrol et bence.
2-hiç olmadı entegren bozuk olabılır neden olmasın.

ama bence sunu yapmalısın. once verdıgım kodu aynen derle işlemciye yukle.ds1302 pinlerini de değiştirme.aynen bi dene.baglantıların dogruysa ve  calısmazsa ds1302 bozuktur.eğer calısırsa entegrenın calıstıgına emınız. o zaman da ds1302 yi istediğin pine bagla, tanımlamaları yap. eskilerini sil.bu sekılde dene.bagladıgın pinlerin cıkısmı giriş mı olacagına sen karar vermederleyici karar versin.#use_standart_io(x)

mikroserdar

mikrodentleyici yaşam biçimidir.

zamzam23