Hi Tech Ds1302 Sorunu

Başlatan muhammedbilal, 21 Şubat 2011, 12:55:50

muhammedbilal

arkadaşlar fxdev kardeşimizin hitech adında hazırlamış olduğu kitabı indirdim yalnız bir türlü ds1302 kodlarını çalıştıramadım kullandığım pic 18f872 lcd ekrarnında sadece
>9.>9>9
>9:>9:>9   şekline benzer ifadeler çıkıyor bu ifadeler daha sonra değişebilir yardımcı olabilirmisiniz


                                                                          Teşeşşkürler...

eseneren

O kitapda 16F877 kullanılıyor yanlıs hatırlamıyorsam, osilator hızınız farklı olabilir mi?
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

muhammedbilal

yok kardeş osilatorde değil sorun başka devrede de kullandım...

arslan74


muhammedbilal

Teşekkürler fakat sorun hala düzelmiş değil :(

muhammedbilal

arkadaşlar yardım eden yokmu pretaus ta simülasyonunda bile çalışmıyor pic dahi aynı kodlarda sorun mu var ! hep sıfır değiri görünüyor !

Maxim

#6
şu anda kullandığınız programın son halinin TAMAMINI ,fuse ayarları ile birlikte ve doğru şemayı buraya verin
nasıl yardım edecek millet?? herkeste fxdev in kitabımı var ?

şu iş bir türlü çözülemedi yahu
PROGRAMI VE ŞEMANINIZI VERINIZ

neredeyse artık neon ışıklı yanıp sönen yazı ile yazdıracağız forumun her köşesine
*Probleme ait kod veya şema varsa ekleyiniz, bu cevapların artmasına ve sorunun çözülmesine yardımcı olur.

muhammedbilal

proteusta sorunu hallettim yalnız orjinal devrede aynı şekilde çalışmamaktadır Lcd de saat değerleri yerine 00/00/00 00:00:00:  bulunmakta sizce hatayı nerede yaptım...

http://img194.imageshack.us/i/13055818.png



rtc.c
#include <htc.h>
#include "rtc.h"
#include "delay.h"

void send_one(void)
{
   TRIS_IO=0;
   IO=1;
   DelayUs(4);
   SCLK=0;
   DelayUs(4);
   SCLK=1;
   DelayUs(4);
}

void send_zero(void)
{
   TRIS_IO=0;
   IO=0;
   DelayUs(4);
   SCLK=0;
   DelayUs(4);
   SCLK=1;
   DelayUs(4);
}

void ds1302_write(unsigned char ram, unsigned char veri)
{
   unsigned char i;
   RST=1;
   DelayUs(4);
   for(i=0;i<8;i++)
   {
      if((ram>>i)&0x01)
         send_one();
      else
         send_zero();      
   }
   
   for(i=0;i<8;i++)
   {
      if((veri>>i)&0x01)
         send_one();
      else
         send_zero();      
   }
   RST=0;
   DelayUs(4);
   SCLK=0;
   DelayUs(4);
}

unsigned char ds1302_read(unsigned char ram)
{
   unsigned char i,veri=0;
   RST=1;
   DelayUs(4);
   for(i=0;i<8;i++)
   {
      if((ram>>i)&0x01)
         send_one();
      else
         send_zero();      
   }
   
   TRIS_IO=1;
   DelayUs(4);

   for(i=0;i<8;i++)
   {   
      SCLK=0;
      if(IO==1)
         veri=veri|(1<<i);
      else
         veri=veri|(0<<i);
      SCLK=1;
   }
   RST=0;
   DelayUs(4);
   TRIS_IO=0;
   DelayUs(4);
   SCLK=0;
   DelayUs(4);
   
   return veri;
}

void ds1302_init(void)
{
   unsigned char x;
   
   RST=0;
   DelayUs(4);
   SCLK=0;
   DelayUs(4);
   
   ds1302_write(0x8E,0);
   ds1302_write(0x90,0xA5);
   
   x=ds1302_read(0x81);
   if((x & 0x80)!=0)
      ds1302_write(0x80,0);
}

unsigned char get_bcd(unsigned char veri)
{
   unsigned char nibh;
   unsigned char nibl;

   nibh=veri/10;
   nibl=veri-(nibh*10);

   return((nibh<<4)|nibl);
}

unsigned char rakam(unsigned char veri)
{
   unsigned char i;
   i=veri;
   veri=((i>>4)&0x0F)*10;
   veri=veri+(i&0x0F);

   return veri;
}
void rtc_set_datetime(unsigned char day,unsigned char mth,unsigned char year,unsigned char dow,unsigned char hr,unsigned char min, unsigned char sec)
{
   ds1302_write(0x86,get_bcd(day));
   ds1302_write(0x88,get_bcd(mth));
   ds1302_write(0x8c,get_bcd(year));
   ds1302_write(0x8a,get_bcd(dow));
   ds1302_write(0x84,get_bcd(hr));
   ds1302_write(0x82,get_bcd(min));
   ds1302_write(0x80,get_bcd(sec));
}

void rtc_get_date(unsigned char *day, unsigned char *mth, unsigned char *year, unsigned char *dow)
{
   *day = rakam(ds1302_read(0x87));
   *mth = rakam(ds1302_read(0x89));
   *year = rakam(ds1302_read(0x8d));
   *dow = rakam(ds1302_read(0x8b));
}

void rtc_get_time(unsigned char *hr, unsigned char *min, unsigned char *sec)
{
   *hr = rakam(ds1302_read(0x85));
   *min = rakam(ds1302_read(0x83));
   *sec = rakam(ds1302_read(0x81));
}


rtc.h
#define TRIS_IO TRISE6      //IO portu neye bagliysa TRISxy'deki xy ona göre belirlenmeli

#define SCLK     RE5            //Baglantilar
#define IO       RE6
#define RST      RE7

void send_one(void);

void send_zero(void);  

void ds1302_write(unsigned char ram, unsigned char veri);

unsigned char ds1302_read(unsigned char ram);

void ds1302_init(void);

unsigned char get_bcd(unsigned char veri);

unsigned char rakam(unsigned char veri);

void rtc_set_datetime(unsigned char day,unsigned char mth,unsigned char year,unsigned char dow,unsigned char hr,unsigned char min, unsigned char sec);

void rtc_get_date(unsigned char *day, unsigned char *mth, unsigned char *year, unsigned char *dow);

void rtc_get_time(unsigned char *hr, unsigned char *min, unsigned char *sec);

muhammedbilal

yardım eden yok mu arkadaşlar

arslan74

Alıntı yapılan: muhammedbilal - 25 Şubat 2011, 13:30:47
yardım eden yok mu arkadaşlar

1- Verdiğim link deki kodları yazıp denedin mi?
2- Sadece Kodların yayınlamak yerine içinde proteus simülasyonu olan bir projeyi de yayınlarsan sana daha iyi cevap vermiş oluruz. Yoksa senin özel kodunu alıp birde yeniden proje oluşturacağız ve proteusda simülasyon çizimlerini yapmakla uğraşacağız. Kimse de senin işin olsun diye kendi vaktini boş yere bu iş için harcamaz. Ama dediklerimi yaparsan bir kaç dakika bakıp cevap verebilir.

Selamlar

muhammedbilal

kodları denedim gene çalışmadı simülasyonda kod çalıştı biraz sapma oldu ama orjinal devreyi kurup kodu yükledim ama saat değerleri yerine hep sıfır değeri yaıyor...

http://rapidshare.com/files/449788154/18f8722.PWI
http://rapidshare.com/files/449788153/18f8722.DSN