DS1302 hakkında...

selman497

Üye
Katılım
17 Tem 2007
Mesajlar
10
Puanları
1
Yaş
40
arkadaşlar şuanki devremde ds1302 RTC entegresi kullanıyorum PIC16f877 20mhz olarak çalışıyorum ISIS üzerinde yaptığım denemelerimde eğer pici 1Mhz olarak ayarlarsam saat entegresi gayet düzgün çalışıyor fakat pici tekrar 20mhz aldığım zaman saat entegresi 10kat yavaşlıyor Pici 1mhz de çalıştır diyeceksiniz program büyük oldugundan çok yavaş çalışıyor..
yani problem 20mhz lik bir picte ds1302inin çok yavaş çalışması ben devremi sadece isiste denedim eğer breadbord üzerinde denersem ds1302 normal çalışırmı yoksa gene isisteki gibi yavaşmı çalışır bunu öğrenmek istiyorum internette çok aradım fakat bulamadım yardımlarınızı bekliyorum selametle...
 
i2c modülünü mü kullanıyorsun? Yoksa herhangi iki bacaktan data/clock hattı mı bağladın? Hangi dilde ve hangi derleyici ile yapıyorsun çalışmanı?

1302 ile bağlantı frekansın değişirse, i2c standart frekansının üstüne çıkmış isen ds1302 sana cevap verecek zamanı bulamaz. 400 kHz in altında haberleştir.
 
herhangi 2 bacaktan data/clock hattı bağlı i2c değil ccs C de çalışıyorum fakat 400kHz in altında sadece 1302 ye özel olarak 400khzin altına nasıl ineceğim bilmiyorum
 
herhangi 2 bacaktan data/clock hattı bağlı i2c değil ccs C de çalışıyorum fakat 400kHz in altında sadece 1302 ye özel olarak 400khzin altına nasıl ineceğim bilmiyorum

Neden donanımsal i2c haberleşmesi yapmıyorsunuz? Programı buraya koyarsan bakabiliriz birlikte.

Ben 40 MHz ile i2c yi sorunsuz kullanabiliyorum. Sizde sorun ne kodu görmeden bir şey söylemek zor.
 
#include <ds1302.h>
#define RTC_SCLK PIN_C3
#define RTC_IO PIN_C4
#define RTC_RST PIN_C2

char bas(){
while(bas1==0){
keypad_oku();enable_interrupts(int_rda);
rtc_get_time(saat,dakika,saniye); rtc_get_date(gun,ay,yil,haftanin_gunu);
lcd_gotoxy(1,1);printf(lcd_putc," AsKod Teknoloji\n %02d/%02d/%02d %02d:%02d",gun,ay,yil,saat,dakika);
if(keypad_oku()==12){bas1=1}

program tamamen bu değil program çok uzun sadece programda kullandıgım biyer burası sadece,daha başka 4 fonksiyonda daha kullanıyorum.eğer bu kısmı halledersem diğerlerinede aynı şeyi uygulayarak çözerim eğer yardım ederseniz bu ds1302 ile I2c haberleşme nasıl olacak onu öğrenmek isterim yardımlar için şimdidem sağol...
 
internette baktığım diğer ds1302 uygulamalarındada aynı şey var hiç biri normal saat ile tam uyumlu değil uyumlu olanlar ise küçük ve fazla yüklenilmemiş programlar dolayısıyla fazla hızda istemiyorlar ben projemde hem tuş takımı Lcd ve rs232 kullanıyorum ds1302 de ekleyince picin %80 romunu kullanıyorum bu yüzden ds1302 den bir şekilde I2c olsun başka bi yolla olsun ne yavaş ne hızlı saat dilimini istedğim zaman tam olarak almalıyım yardım edecek olan arkadaşlara şimdiden teşekkürler...
 
//////////////////////////////////////////////////////////////////////////
//// DS1302.C ////
//// Driver for Real Time Clock ////
//// ////
//// rtc_init() Call after power up////
//// ////
//// rtc_set_datetime(day,mth,year,dow,hour,min) Set the date/time ////
//// ////
//// rtc_get_date(day,mth,year,dow) Get the date ////
//// ////
//// rtc_get_time(hr,min,sec) Get the time ////
//// ////
//// rtc_write_nvr(address,data) Write to NVR ////
//// ////
//// data = rtc_read_nvr(address) Read from NVR ////
//// ////
//// get_bcd(data) Convert data to BCD ////
//// ////
//// rm_bcd(data) Convert data to int ////
//// ////
//////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
//////////////////////////////////////////////////////////////////////////

#ifndef RTC_SCLK
#define RTC_SCLK PIN_C3
#define RTC_IO PIN_C4
#define RTC_RST PIN_C2

#endif

void write_ds1302_byte(BYTE cmd) {
BYTE i;

for(i=0;i<=7;++i) {
output_bit(RTC_IO, shift_right(&cmd,1,0) );
output_high(RTC_SCLK);
output_low(RTC_SCLK);
}
}

void write_ds1302(BYTE cmd, BYTE data) {

output_high(RTC_RST);
write_ds1302_byte(cmd);
write_ds1302_byte(data);
output_low(RTC_RST);
}

BYTE read_ds1302(BYTE cmd) {
BYTE i,data;

output_high(RTC_RST);
write_ds1302_byte(cmd);

for(i=0;i<=7;++i) {
shift_right(&data,1,input(RTC_IO));
output_high(RTC_SCLK);
delay_us(2);
output_low(RTC_SCLK);
delay_us(2);
}
output_low(RTC_RST);

return(data);
}

void rtc_init() {
BYTE x;
output_low(RTC_RST);
delay_us(2);
output_low(RTC_SCLK);
write_ds1302(0x8e,0);
write_ds1302(0x90,0xa4);
x=read_ds1302(0x81);
if((x & 0x80)!=0)
write_ds1302(0x80,0);
}

int get_bcd(BYTE data)
{
int nibh;
int nibl;

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

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

int rm_bcd(BYTE data)
{
int i;

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

return data;
}

void rtc_set_datetime(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min) {

write_ds1302(0x86,get_bcd(day));
write_ds1302(0x88,get_bcd(mth));
write_ds1302(0x8c,get_bcd(year));
write_ds1302(0x8a,get_bcd(dow));
write_ds1302(0x84,get_bcd(hr));
write_ds1302(0x82,get_bcd(min));
write_ds1302(0x80,get_bcd(0));
}

void rtc_get_date(BYTE& day, BYTE& mth, BYTE& year, BYTE& dow) {
day = rm_bcd(read_ds1302(0x87));
mth = rm_bcd(read_ds1302(0x89));
year = rm_bcd(read_ds1302(0x8d));
dow = rm_bcd(read_ds1302(0x8b));
}

void rtc_get_time(BYTE& hr, BYTE& min, BYTE& sec) {
hr = rm_bcd(read_ds1302(0x85));
min = rm_bcd(read_ds1302(0x83));
sec = rm_bcd(read_ds1302(0x81));
}

void rtc_write_nvr(BYTE address, BYTE data) {
write_ds1302(address|0xc0,data);
}

BYTE rtc_read_nvr(BYTE address) {
return(read_ds1302(address|0xc1));
}

tamamen bu ds1302 driverı
 
DS1302.h dosyasında bulunan aşağıdaki iki fonksiyona kırmızı renkli kısımları girin.

Kolay gelsin.

Kod:
void write_ds1302_byte(BYTE cmd) {
   BYTE i;

   for(i=0;i<=7;++i) {
      output_bit(RTC_IO, shift_right(&cmd,1,0) );
      output_high(RTC_SCLK);
      output_low(RTC_SCLK);
      [COLOR="Red"]delay_us(10);[/COLOR]
   }
}

Kod:
BYTE read_ds1302(BYTE cmd) {
   BYTE i,data;

   output_high(RTC_RST);
   write_ds1302_byte(cmd);

   for(i=0;i<=7;++i) {
      shift_right(&data,1,input(RTC_IO));
      output_high(RTC_SCLK);
      delay_us([COLOR="Red"]5[/COLOR]);
      output_low(RTC_SCLK);
      delay_us([COLOR="Red"]5[/COLOR]);
   }
   output_low(RTC_RST);

   return(data);
}
 
eyv. ustam çok sağolasın deniyeceğim olmazsada olsun düşünmen yeter:)
 

Forum istatistikleri

Konular
129,842
Mesajlar
930,707
Kullanıcılar
452,689
Son üye
MertCanxx

Yeni konular

Geri
Üst