| ??? 02/16/09 05:39 Read: times |
#162450 - More Details !! Responding to: ???'s previous message |
Hi Fernandes,
thanks for your reply. I am using HT 1380 serial Time Keeper in my 8052 project. This IC VCC pin is directly connected to 3.6V Battery forever. The code for using the device in my project is as follows: HT1380 usage code....
/*----------------------------------------*/
sbit RTC_SCLK = 0x95; //1380 SCLK PIN
sbit RTC_IO = 0x96; //1380 I/O PIN
sbit RTC_REST = 0X97; //1380 REST PIN
unsigned char xdata rtc_data[8]; //BUFFER TO MAINTAIN INDIVIDUAL REGISTERS
// OF 1380
//This function writes data passed by rdata to 1380
void writeRtc(unsigned char rdata)
{
unsigned char i,temp=1;
for(i=0;i<8;i++) //writing 8 bits serially
{
RTC_SCLK=0; //Input to SCLK is falling edge - rising edge sequence
if(rdata & temp) //check for particular bit to send as 1 / 0
RTC_IO = 1; //taking bit by bit data starting from LSB on port pin
else
RTC_IO = 0;
RTC_SCLK=1; //Input to SCLK is falling edge - rising edge sequence
temp <<= 1; //Left Shifting for sending next bit
}
}
//-------------------------------------
//This function enables write mode for 1380 and sends the data to write into 1380
void writeRtcData(unsigned char rvar,unsigned char reg)
{
RTC_REST=1; //REST = 1 starts data transfer
reg &= 0xfe; //R/W = 0 for writing mode enable
writeRtc(reg); //write command to RTC
writeRtc(rvar); //writing data to the location decided by address by address byte in command
RTC_SCLK=0;
RTC_REST=0; //REST = 0 terminates data transfer
}
/*****************************************************************************/
// SETS THE DATE AS PER THE PASSED PARAMETERS BY UPDATING THE INTERNAL RTC REGISTERS
/*****************************************************************************/
/*---------------------------------------------------------------------*/
void setDate(unsigned char dt,unsigned char mn,unsigned char year,unsigned char wk)
{ //date month year week day
writeRtcData(0x00,0x8e); //WP=0 register data can be written in
writeRtcData(dt,0x86); //write date
writeRtcData(mn,0x88); //write month
writeRtcData(wk,0x8a); //write day
writeRtcData(year,0x8c); //write year
writeRtcData(0x80,0x8e); //WP=1 register data can not be written in
}
/*****************************************************************************/
// SETS THE TIME AS PER THE PASSED PARAMETERS BY UPDATING THE INTERNAL RTC REGISTERS
/*****************************************************************************/
/*---------------------------------------------------------------------*/
void setTime(unsigned char h,unsigned char m,unsigned char s)
{ // hours minutes seconds
// (24 hour format)
writeRtcData(0x00,0x8e); //WP=0 register data can be written in
writeRtcData(s,0x80); //write seconds
writeRtcData(m,0x82); //write minutes
writeRtcData(h,0x84); //write hours
writeRtcData(0x80,0x8e); //WP=1 register data can not be written in
}
/*****************************************************************************/
//This function extracts all the 8 registers of 1380 into the rtc_data[] temporary
//buffer, so that we can access the individual array elements of this buffer
//whenever we need latest RTC parameters, which can be called by using the functions
//mentioned below this function.
/*****************************************************************************/
void updateRealTime(void)
{
unsigned char i,j,k,temp;
RTC_REST = 1; //REST = 1 starts data transfer
writeRtc(0xbf); //command for burst mode reading
for(i=0;i<8;i++) //8 register loop
{
rtc_data[i]=0; //first clear the register.
temp=0x01;
for (j=0;j<8;j++) //for 8 bits = 1 byte
{
RTC_IO=1; //making line as input
RTC_SCLK=0; //Input to SCLK is falling edge - rising edge sequence
if(RTC_IO) //if 1 then save as 1 else kept as 0
rtc_data[i] |= temp;
RTC_SCLK=1; //Input to SCLK is falling edge - rising edge sequence
temp<<=1; //Left Shifting for reading next bit
}
k = rtc_data[i]>>4; //Generating the 8-bit value
rtc_data[i] = (unsigned char)((k*10)+(rtc_data[i] & 0x0f));
}
RTC_SCLK=0; //REST = 0 terminates data transfer
}
/*****************************************************************************/
// These functions are called when we require the specified RTC parameter
// in our operations of the system
// Example : unsigned char cur_min; cur_min = getMins();
/*****************************************************************************/
unsigned char getSecs(void) {return rtc_data[0];}
unsigned char getMins(void) {return rtc_data[1];}
unsigned char getHours(void){return rtc_data[2];}
unsigned char getDate(void) {return rtc_data[3];}
unsigned char getMonth(void){return rtc_data[4];}
unsigned char getYear(void) {return rtc_data[6];}
unsigned char getDay(void) {return rtc_data[5]-1;}
//Main code...
/*****************************************************************************/
//The rtc_data[] temporary buffer is updated forever in the superloop and
//the date and time setting, grabbing the required RTC parameters are done
//thro special user programming at system runtime.
/*****************************************************************************/
void main(void)
{
//Initialize hardware devices
//Initialize RTOS
//Create Tasks
//Load initial values and parameters
//start Interrupts and Serial Baud
RTC_SCLK=0;
RTC_REST=0;
RTC_IO = 0;
while(1)// SuperLoop that Runs Forever...
{
--
--
--
--
--
updateRealTime();
}
}
Q.1 >> How to initialize the RTC HT1380 on start up of the system. Q.2. >> Need the suggestion for above mention code. Any Improvement ? |
| Topic | Author | Date |
| HT1380 > RTC | 01/01/70 00:00 | |
| Not enough details to help | 01/01/70 00:00 | |
| More Details !! | 01/01/70 00:00 | |
Call RTC_Init | 01/01/70 00:00 |



