DS1302 pille çalışırken geri kalıyor!!!

Başlatan serdararikan, 15 Temmuz 2014, 18:35:30

serdararikan

header kodu
#include<htc.h>

#define _XTAL_FREQ	64000000L

#define 	TRISPort	TRISCbits.TRISC2

#define 	ds_rst		LATBbits.LATB7
#define 	ds_dt		PORTCbits.RC2
#define 	ds_clk		LATBbits.LATB6

#define		DS_Saniye		Time[0]
#define		DS_Dakika		Time[1]
#define		DS_Saat			Time[2]
#define		DS_Gun			Time[3]
#define		DS_Ay			Time[4]
#define		DS_Yil			Time[5]
#define		DS_HaftaninGunu	Time[6]

//======Adresler========
#define SEC_ADD_W	0X80
#define SEC_ADD_R	0X81
#define MIN_ADD_W	0X82
#define MIN_ADD_R	0X83
#define HR_ADD_W	0X84
#define HR_ADD_R	0X85
#define DATE_ADD_W	0X86
#define DATE_ADD_R	0X87
#define MON_ADD_W	0X88
#define MON_ADD_R	0X89
#define DAY_ADD_W	0X8A
#define DAY_ADD_R	0X8B
#define YEAR_ADD_W	0X8C
#define YEAR_ADD_R	0X8D
#define PROT_ADD_W	0X8E
#define PROT_ADD_R	0X8F
#define CHARG_ADD_W	0X90
#define CHARG_ADD_R	0X91

#define RAM0_ADD_W	0xc0
#define RAM0_ADD_R	0xc1

//======Komutlar========
#define PROTECT_EN	0x80
#define PROTECT_DE	0x00
#define CHARGER_EN	0xA5
#define CHARGER_DE	0x00

unsigned char Time[8];

extern void ShiftDataOut(char data);
extern unsigned char ShiftDataIn(void);
extern void DS1302Init(void);
extern void SetTime(void);
extern void GetTime(void);
extern void GetMin(void);
extern void WriteDS(unsigned char add,unsigned char dat);
extern unsigned char ReadDS(unsigned char add);
extern void ChargerEnable(void);
extern void ChargerDisable(void);



c kodu

#include"DS1302.h"

void ShiftDataOut(char data)
{
	char mask = 0x01;
	do
	{
		if(data & mask) ds_dt = 1;	
		else	        ds_dt = 0;	
		ds_clk = 1;
		__delay_us(50);
		ds_clk = 0;
		mask <<=1;
	}while(mask);
}

unsigned char ShiftDataIn(void)
{
	char mask = 0x01,tmp=0;
	TRISPort = 1;
	do
	{
		ds_clk = 1;
		if(ds_dt) tmp|= mask;	
		__delay_us(50);
		ds_clk = 0;
		mask <<=1;
	}while(mask);
	TRISPort = 0;
	return(tmp);
}

void ChargerEnable(void)
{
	WriteDS(PROT_ADD_W,PROTECT_DE);
	WriteDS(CHARG_ADD_W,CHARGER_EN);
	WriteDS(PROT_ADD_W,PROTECT_EN);
}

void ChargerDisable(void)
{
	WriteDS(PROT_ADD_W,PROTECT_DE);
	WriteDS(CHARG_ADD_W,CHARGER_DE);
	WriteDS(PROT_ADD_W,PROTECT_EN);
}

void DS1302Init(void)
{
	ds_clk = 0;
	ds_rst = 0;	
	ds_rst = 1;	
	ChargerEnable();//ChargerDisable();
	WriteDS(PROT_ADD_W,PROTECT_DE);
	WriteDS(SEC_ADD_W,0);
	WriteDS(PROT_ADD_W,PROTECT_EN);
	ds_rst = 0;	
}

void WriteDS(unsigned char add,unsigned char dat)
{
	ds_rst = 1;	
	ShiftDataOut(add);
	ShiftDataOut(dat);
	ds_rst = 0;	
}

unsigned char ReadDS(unsigned char add)
{
	unsigned char tmp;
	ds_rst = 1;	
	ShiftDataOut(add);
	tmp = ShiftDataIn();
	ds_rst = 0;	
	return(tmp);
}

void SetTime(void)
{
	ds_rst = 1;
	ShiftDataOut(0xBE);	
	for(char i=0;i<8;i++) ShiftDataOut(Time[i]);		
	ds_rst = 0;	
}


void GetTime(void)
{
	char tmp;
	tmp = ReadDS(SEC_ADD_R);								//saniyeyi oku
	Time[0] = (((tmp & 0x70) >> 4) * 10) + (tmp & 0x0F);	//ondalığa çevir ve Time[0] a yükle.

	tmp = ReadDS(MIN_ADD_R);								//dakikayı oku
	Time[1] = (((tmp & 0x70) >> 4) * 10) + (tmp & 0x0F);	//ondalığa çevir ve Time[1] a yükle.

	tmp = ReadDS(HR_ADD_R);									//saati oku
	Time[2] = (((tmp & 0x30) >> 4) * 10) + (tmp & 0x0F);	//ondalığa çevir ve Time[2] a yükle.

	tmp = ReadDS(DATE_ADD_R);								//günü oku
	Time[3] = (((tmp & 0x70) >> 4) * 10) + (tmp & 0x0F);	//ondalığa çevir ve Time[3] a yükle.

	tmp = ReadDS(MON_ADD_R);								//ayı oku
	Time[4] = (((tmp & 0x10) >> 4) * 10) + (tmp & 0x0F);	//ondalığa çevir ve Time[4] a yükle.

	tmp = ReadDS(YEAR_ADD_R);								//yılı oku
	Time[5] = (((tmp & 0x10) >> 4) * 10) + (tmp & 0x0F);	//ondalığa çevir ve Time[5] a yükle.

	tmp = ReadDS(DAY_ADD_R);								//yılı oku
	Time[6] = tmp;											//Time[6] a yükle.
}

void GetMin(void)
{
	char tmp;
	tmp = ReadDS(MIN_ADD_R);								//dakikayı oku
	Time[1] = (((tmp & 0x70) >> 4) * 10) + (tmp & 0x0F);		//ondalığa çevir ve Time[1] a yükle.										//Time[6] a yükle.
}

Kabil ATICI

@serdararikan
Direnç.net
Bulma konusunda sıkıntı varsa eski bilgisayar kartları üzerindeki saat kristalini söküp kullanabilirsin. (şekli aynıdır)

Bu arada şarj devresini açık olduğunu sanmıyorum yoksa pili bozar.
ambar7

quarko

Kristalin bacaklarına 2x22pF kondansatör koyarsan daha iyi hale gelebilir..
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

serdararikan

Alıntı yapılan: ambar7 - 15 Temmuz 2014, 19:17:21
1-2 günde pek geri kalmıyorda (süper kondansatör ile kullanımda), Hatta 2 haftan fazladır poşetinde duruyor. ( ayarda 10dk bir fark var, ama bu beslemeden mi yoksa ayardan mı hatırlamıyorum)
destek beslemen ne olduğunu belirtmemişsin.. Pil kullanıyorsan pil gerilimini kontrol et. Özellikle  beş saat dediğin zamanın sonunda.. Şarjlı pil kullanıyorsan özellikle pil konusunu dikkat et.

siz ds1302 nin data clk ve rst uçlarını pull-up yapıyormusunuz?


baran123

Alıntı yapılan: serdararikan - 15 Temmuz 2014, 21:58:51
siz ds1302 nin data clk ve rst uçlarını pull-up yapıyormusunuz?
pull-up ds1307 de yapılıyor