В DS1307 Бит 7 Регистра 0 (он же регистр секунд) - это бит остановки часов (CH). Когда этот бит установлен в 1 (при включении питания), генератор остановлен. Но в DS1388 при включении бит EOSC=0 (регистр Control (0x0c)). Значит должен генерить. Или что Вы имели в виду под "записать нормальное значение времени в байт секунд" ? В регистры msec,sec,min,hour я пишу dec2bcd(0x00);
Как только что обнаружил, не могу записать в первые 4 регистра (msec,sec,min,hour). Показывает всегда одно и то же: 0:0:0.160. День, дату, месяц и год пишет нормально. В чем проблема?!!
Проблему локализовал. По крайней мере удалось писать в первые четыре регистра. Хотя часы по-прежнему стоят. Переписал функцию чтения регистров:
Код
rtc_type *rtc; //rtc_time,
unsigned char msec, sec, min, hr, dy, dt, mn; //глобальные переменные
unsigned int yr;
///////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
void rtc_Init(void)
{
rtc_set_time(3, 4, 5);
rtc_set_date(2, 21, 8, 2006);
rtc_get_time(rtc); //первая функция
disp_clk_regs(); //вторая функция
}
///////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
void rtc_get_time(rtc_type *rtc_var)
{
// unsigned char mil, pm;
printf_P("\n\r Yr/Mn/Dt Dy Hr:Mn:Sc.msec");
Send_start();
Send_addr(RTC_ADDR|W);
Send_byte(0);
Send_start();
Send_addr(RTC_ADDR|R);
rtc_var->hundredth=bcd2dec(Rx_byte(ACK));
rtc_var->seconds=bcd2dec(Rx_byte(ACK));
rtc_var->minutes=bcd2dec(Rx_byte(ACK));
rtc_var->hours=bcd2dec(Rx_byte(ACK));
rtc_var->day=bcd2dec(Rx_byte(ACK));
rtc_var->date=bcd2dec(Rx_byte(ACK));
rtc_var->month=bcd2dec(Rx_byte(ACK));
rtc_var->year=bcd2dec(Rx_byte(NACK)) + 2000;
Send_stop();
printf_P("\n\rDUT %d/%d/%d %d", rtc_var->year, rtc_var->month, rtc_var->date, rtc_var->day);
printf_P(" %d:%d:%d.%d", rtc_var->hours, rtc_var->minutes, rtc_var->seconds, rtc_var->hundredth);
}
////////////////////////////////////////////////////////////////////////////////////////////////
//-------------------------------------------------------------------------------
/* ----- time & date display ----- */
void disp_clk_regs(void)
{
printf_P("\n\r Yr/Mn/Dt Dy Hr:Mn:Sc.msec");
Send_start();
Send_addr(RTC_ADDR|W); /* slave address, write 1388 */
Send_byte(0); /* write register address, 1st clock register */
Send_start();
Send_addr(RTC_ADDR|R); /* slave address + read bit, read 1388 */
msec = bcd2dec(Rx_byte(ACK)); /* starts w/last address stored in register pointer */
sec = bcd2dec(Rx_byte(ACK));
min = bcd2dec(Rx_byte(ACK));
hr = bcd2dec(Rx_byte(ACK));
dy = bcd2dec(Rx_byte(ACK));
dt = bcd2dec(Rx_byte(ACK));
mn = bcd2dec(Rx_byte(ACK));
yr = bcd2dec(Rx_byte(NACK)) + 2000;
Send_stop();
printf_P("\n\rDUT %d/%d/%d %d", yr, mn, dt, dy);
printf_P(" %d:%d:%d.%d", hr, min, sec, msec);
}
//###########################################
// ds1388.h
//----------------------------------------------------------------------------
typedef struct _rtc_type
{
unsigned char hundredth;
unsigned char seconds;
unsigned char minutes;
unsigned char hours;
unsigned char day;
unsigned char date;
unsigned char month;
unsigned int year;
}rtc_type;
А теперь внимание, вопрос. Почему чтение через указатель на члены структуры некорректно выводит
на терминал значения hours, minutes, seconds, hundredth? Хотя год, месяц, дату, день выводит правильно. Выводит "2006/8/21 2 0:0:0.160", в то время как чтение регистров через глобальные переменные (вторая функция) выводит то, что записано: "2006/8/21 2 5:4:3.1" ?
Цитата
Добавлено
Заработало!!! Выводит на терминал значение времени прочитанное через глобальные переменные. Вопрос о функции чтения через указатели на члены структуры остается открытым.