Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DS1388
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
alux
Библиотеку использовал от DS1307. Пишу, читаю регистры нормально. Для контроля вывожу содержимое регистров на терминал:
Yr/Mn/Dt Dy Hr:Mn:Sc

TIME: 2007/1/1 2 0:0:0.160
CHARGE: ab
FLAG: 0
CONTROL: 0

Как видно, часы - по нулям. Странно, максимальное значение сотых долей секунд 99, а показывает 160. Контрольный бит Enable Oscillator (EOSC) = 0 When set to logic 0,the oscillator is started. Литиевая батарейка (+3.1В) стоит на месте. Кварц стоит 32768 - миниатюрный неизвестного производителя, купленный в магазине. Внешне - трубочка 2мм. Подозреваю, что проблема все-таки в кварце. Точнее в емкости кварца 12,5 пФ (по даташиту должно быть 6 пФ). Менять кварц пока не пробовал. Осциллограф на выводах ничего не показывает. Хотя DallasSemiconductor не рекомендует щупать осциллографом выводы из-за их чувстительности к нагрузке. Осцилограф - плата Cygnal C8051F320. Запаивал кварц максимально аккуратно непосредственно к выводам. Остатки флюса удалил. Что еще необходимо сделать, чтобы запустить часы? И второй вопрос: можно ли использовать эту частоту 32768 в качестве тактовой для цифрового датчика давления FOSP-01A? Для этого вывод 2(X2) DS1388 выведен на разъем.

P.S. В приложении - мои исходники.
dx40
Цитата(alux @ Aug 27 2007, 10:03) *
Библиотеку использовал от DS1307. Пишу, читаю регистры нормально. Для контроля вывожу содержимое регистров на терминал:
Yr/Mn/Dt Dy Hr:Mn:Sc

TIME: 2007/1/1 2 0:0:0.160
CHARGE: ab
FLAG: 0
CONTROL: 0

Как видно, часы - по нулям. Странно, максимальное значение сотых долей секунд 99, а показывает 160.


Помнится в каких-то далласовских часах, чтобы их запустить, надо было записать нормальное значение времени в байт секунд. Здесь может аналогично?
alux
В 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" ?

Цитата
Добавлено

Заработало!!! Выводит на терминал значение времени прочитанное через глобальные переменные. Вопрос о функции чтения через указатели на члены структуры остается открытым.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.