improper functioning (ds1307)

Respected Sir

I am developing a module regarding to medical electronics to which i have to interface the ds1307 rtc chip with 8051 core microconverter(Aduc841).

while reading the rtc i am not getting the correct values. Please help me regarding the same.

// if(changes) // { // kindly mention; // Thanks in advance; // }

void Rtc(void) { I2c_Routine(); // Go to i2c routine }

void I2c_Routine(void) { CFG841 = CFG841 | 0X01; rtc_set_time(0x00); // Initialise the RTC (Clear sec register CH bit) Rtc_Write(); while(1) { rtc_get_time();

Digit_Placement(1,6,0,hour_M); Digit_Placement(1,6,6,hour_L); Display_Line(6,14,&isto[0]);

Digit_Placement(1,6,19,mins_M); Digit_Placement(1,6,25,mins_L); Display_Line(6,31,&isto[0]);

Digit_Placement(1,6,36,seconds_M); Digit_Placement(1,6,42,seconds_L); } }

void Send_Byte(unsigned char data1) { unsigned char i; for(i=0x80; i!=0; i=i>>1) { if((data1 & i) == 0) { SDA = 0; Delay_New(5); } else { SDA = 1; Delay_New(5); } SCL = 1; Delay_New(10); SCL = 0; } get_ack();

}

void Send_Data(unsigned char SLAVEADD) { Send_Byte(SLAVEADD); // Go to Send_Byte routine }

void check_busy(void) { SDA = 1; SCL = 1; if((SCL == 1) && (SDA == 1)) BUSY = 0; else BUSY = 1; }

void Start_Bit(void) { if(BUSY == 0) { // SDA = 1; // SCL = 1; Delay_New(5); SDA = 0; Delay_New(10); // SDATA o/p low for start condition SCL = 0; } }

void Stop_Bit(void) { SDA = 0; Delay_New(5); SCL = 1; Delay_New(10); SDA = 1; }

void get_ack(void) { SDA = 1; Delay_New(5); SCL = 1; Delay_New(10); / while(SDA){} // catch ack from slave(ds 1307) // while(!SDA){} P2_6 = 0; SCL = 0; ack_delay(); P2_6 = 1; Delay_New(20); ack_delay(); // break; }

void give_nack(void) { SDA = 1; // Delay_New(5); SCL = 1; Delay_New(10); SCL = 0; }

void Receive_Byte(void) { unsigned char m = 0; // SCL = 0; SDA = 1; Delay_New(5); readdata = 0x00; for(m=0x80; m!=0; m=m>>1) { SCL = 1; Delay_New(5); if(SDA==1) { readdata |= (m & 0xff); } else if(SDA==0) { readdata |= (m & 0x00); } SCL = 0; } give_nack(); }

void Write_1302(unsigned char addr,unsigned char datawrite) { check_busy(); Start_Bit(); Send_Data(0xD0); // SLAVE ID for DS 1307 Send_Data(addr); // Corresponding register Address of RTC Send_Data(datawrite); // DATA VALUE for the Selected Register Stop_Bit(); }

unsigned char read_1302(unsigned char addr) // incase of correction change this func to return type { check_busy(); Start_Bit(); Send_Data(0xD0); Send_Data(addr); check_busy(); Start_Bit(); Send_Data(0xD1); Receive_Byte(); Stop_Bit(); return(readdata); }

void Rtc_Write(void) { Write_1302(0x07,0x10); //data to control register Write_1302(0x06,0x06); //data to year register Write_1302(0x05,0x01); //data to month register Write_1302(0x04,0x01); //data to date register Write_1302(0x03,0x01); //data to day register Write_1302(0x02,0x00); //data to hour register Write_1302(0x01,0x00); //data to minutes register Write_1302(0x00,0x00); //data to seconds register }

void rtc_set_time(unsigned char sec) { // Write_1302(0x00,(bin2bcd(sec))); Write_1302(0x00,sec); }

void rtc_get_time(void) { unsigned char temp_sec,temp_mins,temp_hour;

temp_sec = read_1302(0x00); temp_mins = read_1302(0x01); hours_d = read_1302(0x02); day_d = read_1302(0x03); date_d = read_1302(0x04); month_d = read_1302(0x05); year_d = read_1302(0x06);

//hours_d = bcd2bin(read_1302(0x02)); //mins_d = bcd2bin(read_1302(0x01)); //temp_sec = bcd2bin(read_1302(0x00)); //seconds_M = ((temp_sec & 0xF0)+ 0x30);

hour_M = (((temp_hour & 0xF0) >> 4) + '0'); hour_M = ((temp_hour & 0x0F) + '0');

mins_M = (((temp_mins & 0xF0) >> 4 ) + '0'); mins_M = ((temp_mins & 0x0F) + '0');

seconds_M = (((temp_sec & 0xF0) >> 4 )+ '0'); seconds_L = ((temp_sec & 0x0F) + '0');

}

unsigned char bin2bcd(unsigned char binval) { unsigned char temp_val; if(binval>0x99) return(0); else { temp_val = binval / 10; temp_val 4) & 0x0F) * 10; temp_val += (bcdval & 0x0F); return (temp_val); }

kindly do the favour regarding the same.

Thanking all

regards Navaneethan

Reply to
nava555
Loading thread data ...

Am I the only one more than a little worried that Usenet is been used for helping to debug medical software ?

You don't provide a definition of Delay_New so it's impossible to know what rate you are attempting to run the I2C bus at - the most obvious question is are you running the I2C bus at a clock rate higher than the target can handle ?

Simon.

--
Simon Clubley, clubley@remove_me.eisner.decus.org-Earth.UFP
If Google's motto is "do no wrong", then how did we get Google Groups 2 ?
Reply to
Simon Clubley

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.