DS1302 Hi-Tech/Proteus Hatası ~ Düzeldi

Başlatan FxDev, 23 Haziran 2009, 04:44:43

FxDev

Arkadaşlar DS1302 sürmeye çalışıyordum, CCS C driver'ını baz alarak bir kütüphane dosyası hazırladım, fakat proteus'ta istediğim şeyi LCD'de tam görmeme rağmen aşağıdaki uyarıyı alıyorum;



Hatanın nedeni proteus'a göre mantıksal çakışma, hani o gördüğümüz mavi yada kırmızı değil de sarı olması durumu çok kaba tabirle. Fakat uzun uzun araştırmama rağmen bir türlü bu hatayı gideremedim.
Acaba gerçek hayatta uyguladığımda ne gibi bir sorunla karşılaşabilirim...

Bu arada kodun #define TRIS_IO'suz kısmını 8051'de kullandım ve devreyi gerçekleştirdiğimde de çalışıyordu fakat simülasyonda böyle bir sorunla karşılaşmıyordum...

Kodumu burada koyuyorum, hi-tech ile deneme yapmış arkadaşların bilgisini almak isterim...

ds1302.h
#define TRIS_IO TRISD1			//IO portu neye bağlıysa TRISxy'deki xy ona göre belirlenmeli

#define SCLK 	RD0				//Bağlantılar
#define IO 		RD1
#define RST		RD2

void bit_yaz(unsigned char c);

unsigned char bit_oku(void);

void write_ds1302_byte(unsigned char cmd);  

void write_ds1302(unsigned char cmd, unsigned char veri); 

unsigned char read_ds1302 ( unsigned char cmd );

void init_ds1302(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);

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);


ds1302.c
#include <pic.h> 
#include "ds1302.h" 
#include "delay.h" 

void bit_yaz(unsigned char c)
{
	IO=c;
	DelayUs(2);
	SCLK=1;
	DelayUs(2);
	SCLK=0;
	DelayUs(2);
	IO=1;
}

unsigned char bit_oku(void)
{
	unsigned char c;
	SCLK=0;
	c=IO;
	SCLK=1;
	return c;
}

void write_ds1302_byte(unsigned char cmd)
{
	unsigned char i,simdiki_bit;
	for(i=0;i<=7;++i)
	{
		simdiki_bit=cmd>>i;
		simdiki_bit=simdiki_bit&1;
		bit_yaz(simdiki_bit);
	}
}

void write_ds1302(unsigned char cmd, unsigned char veri) 
{
   RST = 1;
   write_ds1302_byte(cmd);
   write_ds1302_byte(veri);
   RST = 0;
}

unsigned char read_ds1302 ( unsigned char cmd )
{ 
   unsigned char i, veri=0; 
       
   RST = 1;
   write_ds1302_byte(cmd);
   TRIS_IO=1;
   DelayUs(2);
   for(i=0;i<=7;++i)
   {
	   DelayUs(2);
	   veri=veri|(bit_oku()<<i);
   }
   TRIS_IO=0;
   RST = 0;
   SCLK=0;
   return veri;
}

void init_ds1302(void)
{     
   unsigned char x; 
    
   RST = 0; 
   DelayUs(2); 
   SCLK = 0; 
   DelayUs(2); 
   
   write_ds1302(0x8e,0);
   write_ds1302(0x90,0xa6);
   
   x=read_ds1302(0x81);
   if((x & 0x80)!=0)			//Eğer saat kristali kapalı ise aç
   		write_ds1302(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)
{
   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(unsigned char *day, unsigned char *mth, unsigned char *year, unsigned char *dow)
{
   *day = rakam(read_ds1302(0x87));
   *mth = rakam(read_ds1302(0x89));
   *year = rakam(read_ds1302(0x8d));
   *dow = rakam(read_ds1302(0x8b));
}

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


Ayrıca denemeye çalıştığım konuya ait tüm dosyalar da aşağıdaki linkte...
http://rapidshare.com/files/247574113/deneme.rar.htm

Yardımcı olan arkadaşlara şimdiden teşekkür ederim...

arslan74

Merhaba,
Ben böyle bir kod yazmıştım. Çalışmasında hiç bir sorun yok. Kodu gönderiyorum, bu kodu kullanabilirsin.

DS1302.h

/*******************************

	DS1302 CHiP SET READ KODU.

*******************************/


#ifndef	_DS1302_H
#define	_DS1302_H


#define bitset(var,bitno) ((var) |= 1 << (bitno))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))


#define TRIS_IO TRISE1

#define  SECOND		0x81
#define  MINUTE		0x83
#define  HOUR		0X85
#define  DATE		0X87
#define  MONTH		0X89
#define  DAY		0X8B
#define  YEAR		0X8D
#define  CONTROL	0X8F
#define  CHARGER	0X91



extern unsigned char second, minute, hour;
extern unsigned char date, month, year;


static	bit	SCLK  	@ (unsigned)&PORTE*8+0;	// use this bit to 
static	bit	IO		@ (unsigned)&PORTE*8+1;	// use this bit to 
static	bit	RST  	@ (unsigned)&PORTE*8+2;	// use this bit to 




void init_DS1302(void);

unsigned char read_DS1302 ( unsigned char );

void send_bit_1(void);

void send_bit_0(void);

unsigned char BCD_2_bin (unsigned char data);

unsigned char bin_2_BCD (unsigned char data);


void write_DS1302( unsigned char cmd, unsigned char data );


void lcd_put_time (void);
void lcd_put_date (void);
	
void usart_put_time_out (void);
void usart_put_date_out (void);

void usart_put_time (void);
void usart_put_date (void);
	
void tarih_yaz(void);
void saat_yaz(void);

	
#endif


Ds1302.c

/*******************************

	DS1302 CHIP SET KODU.

*******************************/

#include <pic.h>
#include "DS1302.h"
#include "delay.h"
#include "lcd.h"
#include "usart.h"

extern unsigned char gelen_s_data[7];
extern unsigned char gelen_t_data[7];

extern unsigned char eeprom_tx_data[10];

unsigned char second, minute, hour;
unsigned char date, month, year;


void init_DS1302( void ){
	
	unsigned char sec_val;

	PORTE = 0b000;
	TRISE = 0b000;	
	
	RST = 0;
	DelayUs(2);
	SCLK = 0;
	DelayUs(2);
	
	write_DS1302( CONTROL, 0 );
	
//	write_DS1302( CHARGER, 0b10100110 );
	write_DS1302( CHARGER, 0b10100110 );
	
	
//	write_DS1302( MINUTE, 0x32 );
//	write_DS1302( DATE, 0x26 );
//	write_DS1302( HOUR, 1 );
//	write_DS1302( MONTH, 8 );
//	write_DS1302( YEAR, 7 );
	
	sec_val = read_DS1302(SECOND);
	
	if ( sec_val & 0b10000000 )	// Eper saat kristali kapal} ise ac.
			write_DS1302( SECOND, 0b00000000 );
} //



void write_DS1302(unsigned char reg_val, unsigned char data) {

	unsigned char bits;
		
	TRIS_IO = 0;	// output
	DelayUs(8);
	
	reg_val--;
	
	RST = 1; // Enable
	
	for ( bits=0; bits<8; bits++ ){
	
		if ( reg_val & (1 << bits) )	//
			send_bit_1();
		else
			send_bit_0();
	}
	
	for ( bits=0; bits<8; bits++ ){
	
		if ( data & (1 << bits) )	//
			send_bit_1();
		else
			send_bit_0();
	}

	RST = 0; //Disable
	DelayUs(2);
	TRIS_IO = 0;	// output
	DelayUs(2);
	SCLK = 0;	
	DelayUs(2);
}


unsigned char read_DS1302 ( unsigned char reg_val ){
	
	unsigned char val, bits;
		
	TRIS_IO = 0;	// output
	DelayUs(2);

	RST = 1; // Enable
	DelayUs(2);
	
	for ( bits=0; bits<8; bits++ ){
	
		if ( reg_val & (1 << bits) )	//
			send_bit_1();
		else
			send_bit_0();
	}
	
	TRIS_IO = 1;	// input
	DelayUs(2);
	
	for ( bits=0; bits<8; bits++ ){
		
		SCLK = 0;
		
		if (IO == 1 )	
			bitset(val,bits);
		else 
			bitclr(val,bits);

		SCLK = 1;
					
	}
	
	RST = 0; //Disable
	DelayUs(2);
	TRIS_IO = 0;	// output
	DelayUs(2);
	SCLK = 0;
	DelayUs(2);

	return val;
	
} //



void send_bit_1(void){
	
	IO = 1;
	DelayUs(2);
	SCLK = 0;
	DelayUs(2);
	SCLK = 1;
	DelayUs(2);
	
}

void send_bit_0(void){
	
	IO = 0;
	DelayUs(2);
	SCLK = 0;
	DelayUs(2);
	SCLK = 1;
	DelayUs(2);
	
}



unsigned char BCD_2_bin (unsigned char data){

	/* Convert a BCD number to a binary character */

	unsigned char temp = 0;

	temp = (((data & 0xF0)>>4)* 0x0A);			// high nibble X 10
	temp = temp + (data & 0x0F);			// add low nibble
	
	return temp;
}


unsigned char bin_2_BCD (unsigned char data){

	/* Convert a binary number to BCD */

	char temp = 0;	
	while (data > 9){
		temp = temp + 0x10;				//  not an efficient routine but acceptable
		data = data - 10;					// since 31 is the largest number
	}
	temp = temp + data;
	
	return temp;
}


void lcd_put_time (void){
	
	unsigned char yazdir;
	unsigned char second, minute, hour;

	second = read_DS1302(SECOND);
	minute = read_DS1302(MINUTE);
	hour   = read_DS1302(HOUR);

	eeprom_tx_data[1] =  hour;	// Saat
	eeprom_tx_data[2] =  minute;	// Dakkia
	eeprom_tx_data[3] =  second;	// Saniye


//	lcd_putch('(');
	yazdir = ((hour>>4) & 0xF);
	lcd_putch('0'+ yazdir);
	yazdir = (hour & 0xF);
	lcd_putch('0'+ yazdir);
	
	lcd_putch(':');
			
	yazdir = ((minute>>4) & 0xF);
	lcd_putch('0'+ yazdir);
	yazdir = (minute & 0xF);
	lcd_putch('0'+ yazdir);
	
	lcd_putch(':');
	
	yazdir = ((second>>4) & 0xF);
	lcd_putch('0'+ yazdir);
	yazdir = (second & 0xF);
	lcd_putch('0'+ yazdir);

//	lcd_putch(')');

}


void lcd_put_date (void){
	
	unsigned char yazdir;
	unsigned char date, month, year;

	date   = read_DS1302(DATE);
	month  = read_DS1302(MONTH);
	year   = read_DS1302(YEAR);

	eeprom_tx_data[4] =  date;	// Gün
	eeprom_tx_data[5] =  month;	// Ay
	eeprom_tx_data[6] =  year;	// Yıl

	yazdir = ((date>>4) & 0xF);
	lcd_putch('0'+ yazdir);
	yazdir = (date & 0xF);
	lcd_putch('0'+ yazdir);
	
	lcd_putch('.');
	
	yazdir = ((month>>4) & 0xF);
	lcd_putch('0'+ yazdir);
	yazdir = (month & 0xF);
	lcd_putch('0'+ yazdir);
	
	lcd_putch('.');
//	lcd_putch('2');
//	lcd_putch('0');
	
	yazdir = ((year>>4) & 0xF);
	lcd_putch('0'+ yazdir);
	yazdir = (year & 0xF);
	lcd_putch('0'+ yazdir);

}

void usart_put_time (void){
	
	second = read_DS1302(SECOND);
	minute = read_DS1302(MINUTE);
	hour   = read_DS1302(HOUR);
	
	usart_put_time_out();
	
}

void usart_put_time_out (void){
	
	unsigned char yazdir;

	putch('(');
	yazdir = ((hour>>4) & 0xF);
	putch('0'+ yazdir);
	yazdir = (hour & 0xF);
	putch('0'+ yazdir);
	
//	putch(':');
			
	yazdir = ((minute>>4) & 0xF);
	putch('0'+ yazdir);
	yazdir = (minute & 0xF);
	putch('0'+ yazdir);
	
//	putch(':');
	
	yazdir = ((second>>4) & 0xF);
	putch('0'+ yazdir);
	yazdir = (second & 0xF);
	putch('0'+ yazdir);

	putch(')');

//	putch (13);	// Enter tu~u. Yeni sat}r.

}




void usart_put_date (void){
	
	date   = read_DS1302(DATE);
	month  = read_DS1302(MONTH);
	year   = read_DS1302(YEAR);
	
	usart_put_date_out();
	
}

void usart_put_date_out (void){
	
	unsigned char yazdir;
	
	putch('[');

	yazdir = ((date>>4) & 0xF);
	putch('0'+ yazdir);
	yazdir = (date & 0xF);
	putch('0'+ yazdir);
	
//	putch('.');
	
	yazdir = ((month>>4) & 0xF);
	putch('0'+ yazdir);
	yazdir = (month & 0xF);
	putch('0'+ yazdir);
	
//	putch('.');
//	putch('2');
//	putch('0');
	
	yazdir = ((year>>4) & 0xF);
	putch('0'+ yazdir);
	yazdir = (year & 0xF);
	putch('0'+ yazdir);

	putch(']');

//	putch (13);	// Enter tu~u. Yeni sat}r.

}//




void tarih_yaz(void){	// Saat entegresine yeni tarih yazar.
	
	unsigned char s_bilgi,bilgi_1, bilgi_2;
	
	bilgi_1 = gelen_t_data[0];
	bilgi_2 = gelen_t_data[1];
	
	bilgi_1 -= '0';
	bilgi_2 -= '0';
	
	s_bilgi = bilgi_1*0x10;
	s_bilgi += bilgi_2;
	
	write_DS1302( DATE, s_bilgi );
	
	bilgi_1 = gelen_t_data[2];
	bilgi_2 = gelen_t_data[3];
	
	bilgi_1 -= '0';
	bilgi_2 -= '0';
	
	s_bilgi = bilgi_1*0x10;
	s_bilgi += bilgi_2;
	
	write_DS1302( MONTH, s_bilgi );
	
	bilgi_1 = gelen_t_data[4];
	bilgi_2 = gelen_t_data[5];
	
	bilgi_1 -= '0';
	bilgi_2 -= '0';
	
	s_bilgi = bilgi_1*0x10;
	s_bilgi += bilgi_2;
	
	write_DS1302( YEAR, s_bilgi );
	
}


void saat_yaz(void){	// Saat entegresine yeni saati yazar.
	
	unsigned char s_bilgi,bilgi_1, bilgi_2;
	
	bilgi_1 = gelen_s_data[0];
	bilgi_2 = gelen_s_data[1];
	
	bilgi_1 -= '0';
	bilgi_2 -= '0';
	
	s_bilgi = bilgi_1*0x10;
	s_bilgi += bilgi_2;
	
	write_DS1302( HOUR, s_bilgi );
	
	bilgi_1 = gelen_s_data[2];
	bilgi_2 = gelen_s_data[3];
	
	bilgi_1 -= '0';
	bilgi_2 -= '0';
	
	s_bilgi = bilgi_1*0x10;
	s_bilgi += bilgi_2;
	
	write_DS1302( MINUTE, s_bilgi );
	
	bilgi_1 = gelen_s_data[4];
	bilgi_2 = gelen_s_data[5];
	
	bilgi_1 -= '0';
	bilgi_2 -= '0';
	
	s_bilgi = bilgi_1*0x10;
	s_bilgi += bilgi_2;
	
	write_DS1302( SECOND, s_bilgi );
	
}


Selamlar

ORC

Alıntı yapılan: "FxDev"Hocam kodunuz oldukça uzun geldi bana, CCS'den başkalarının kodundan devşirme aktarmayla 2 günden beri hata da düzelmedi.
Başkalarının koduyla oynamaktansa açtım datasheet'i baştan yazdım kodu.

Arkadaşlar resimlerin küçük halini (thumb) koyalım lütfen, büyük resim sayfa düzenini çok bozuyor.


Arkadasım oncelikle bu kutuphaneyi paylastıgın için cok teşekkür ediyorum çok işime yaradı..Simulasyonda denedim calısıyor sorun yok hemen devresini kurdum ama calısmıyor sebebini anlamadım :( yardımcı olursanız sevinirim...
Kod ve devreyi upload ediyorum..

İlgilenirseniz çok sevinirim kafayı yedim de :?

Edit: ekranda yani lcd ekranında 00:01:01

gb sacma bi deger goruyorum ve hiç değişmiyor..

http://rapidshare.com/files/322590575/ol.rar.html