Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 5 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 19.03.2003
Доброго времени суток.
Есть сабжевый девайс (http://datasheets.maxim-ic.com/en/ds/DS ... 2C887A.pdf), подключённый (среди прочих устройств) к микроконтроллеру 89C5131A. Проблема состоит в том, что это зараза (RTC) не хочет обновлять время, оно всегда одно и тоже :( Изучил datasheet вдоль и поперёк, и всё равно не могу понять, где проблема.
Думал, что внутренняя батарейка сдохла - так нет, бит VRT в регистре D равен 1.
Что характерно, при любом значении бита SET в регистре B, я могу изменять время, а бит UIP (Updte-In-Progress) в регистре A всегда равен 0 (а нулю он не равен только при B.SET = 1, либо во время обновления, которое как раз и не происходит).
(Изначально в областях памяти даты и времени была какая-то ересь: AAh и 55h, хотя больше 3Bh не должно быть в принципе).

Полной нарисованной схемы сейчас, к сожалению, нету, а спать уже жутко хочется, так что выложу уже завтра вечером, если понадобится.

Вот программка на C, написанная в uVision4 (данные выводятся на COM-порт компьютера):
Код:
#include <stdio.h>
#include <at89c5131.h>

unsigned int i; //standard counter

unsigned char xdata rtc[] _at_ 0x2000; //variable which points to rtc memry block
unsigned char xdata rtc_dayOfMonth _at_ 0x2007;
unsigned char xdata rtc_month _at_ 0x2008;
unsigned char xdata rtc_year _at_ 0x2009;
unsigned char xdata rtc_hour _at_ 0x2004;
unsigned char xdata rtc_minute _at_ 0x2002;
unsigned char xdata rtc_second _at_ 0x2000;
unsigned char xdata rtc_A _at_ 0x200A;
unsigned char xdata rtc_B _at_ 0x200B;
unsigned char xdata rtc_C _at_ 0x200C;
unsigned char xdata rtc_D _at_ 0x200D;

unsigned char dayOfMonth;
unsigned char month;
unsigned char year;
unsigned char hour;
unsigned char minute;
unsigned char second;

unsigned char string_to_send1[] = "Current date: ";
unsigned char string_to_send2[] = "Current time: ";
unsigned char string_to_send3[] = "\r\n";
unsigned char datetime_decimal_buffer[10];

void main(){
   // <configure serial port for output>
   TMOD = 0x20; //T1 is mode2
   //TH1 = 256 - ((Crystal / 192) / Baud)
   //TH1 = 256 - ((24000000 / 192) / 9600) = 242.98 = 243 = f3h
   TH1 = 0xf3; //9600 baud
   PCON = PCON | 0x80; //PCON.7 = 1 (ORL PCON,#080h)
   SCON = 0x50; //8b, 1stop, 1start, REN enabled
   TCON =0x40; //=setb TR1=start T1.
   // </configure serial port for output>

   //set rtc data mode to binary,
   //24-hours mode,
   //disable daylight saving;
   //other options (like interrupt or square wave) - to 0
   //(B register = 00000110b = 6h)
   //
   rtc_B = 0x06;
   //

   while (1){
      //wait until rtc finishes to update the clock
      //
      while (rtc_A && 0x80) {}
      //

      //read data from rtc
      //
      dayOfMonth = rtc_dayOfMonth;
      month = rtc_month;
      year = rtc_year;
      hour = rtc_hour;
      minute = rtc_minute;
      second = rtc_second;
      //

      //echo "Current date" message to user
      //
      for (i=0; string_to_send1[i]>0; i++){
         SBUF = string_to_send1[i];
         while (TI==0) {};
         TI = 0;
      }
      //

      //echo day of the month
      //
      sprintf(datetime_decimal_buffer, "%u", (unsigned int)dayOfMonth);
      for (i=0; datetime_decimal_buffer[i]>0; i++){
         SBUF = datetime_decimal_buffer[i];
         while (TI==0) {};
         TI = 0;
      }
      //

      //echo '.'
      //
      SBUF = '.';
      while (TI==0) {};
      TI = 0;
      //

      //echo month
      //
      sprintf(datetime_decimal_buffer, "%u", (unsigned int)month);
      for (i=0; datetime_decimal_buffer[i]>0; i++){
         SBUF = datetime_decimal_buffer[i];
         while (TI==0) {};
         TI = 0;
      }
      //

      //echo '.'
      //
      SBUF = '.';
      while (TI==0) {};
      TI = 0;
      //

      //echo year
      //
      sprintf(datetime_decimal_buffer, "%u", (unsigned int)year);
      for (i=0; datetime_decimal_buffer[i]>0; i++){
         SBUF = datetime_decimal_buffer[i];
         while (TI==0) {};
         TI = 0;
      }
      //

      //new line
      //
      for (i=0; string_to_send3[i]>0; i++){
         SBUF = string_to_send3[i];
         while (TI==0) {};
         TI = 0;
      }
      //

      //echo "Current time" message to user
      //
      for (i=0; string_to_send2[i]>0; i++){
         SBUF = string_to_send2[i];
         while (TI==0) {};
         TI = 0;
      }
      //

      //echo hour
      //
      sprintf(datetime_decimal_buffer, "%u", (unsigned int)hour);
      for (i=0; datetime_decimal_buffer[i]>0; i++){
         SBUF = datetime_decimal_buffer[i];
         while (TI==0) {};
         TI = 0;
      }
      //

      //echo ':'
      //
      SBUF = ':';
      while (TI==0) {};
      TI = 0;
      //

      //echo minutes
      //
      sprintf(datetime_decimal_buffer, "%u", (unsigned int)minute);
      for (i=0; datetime_decimal_buffer[i]>0; i++){
         SBUF = datetime_decimal_buffer[i];
         while (TI==0) {};
         TI = 0;
      }
      //

      //echo ':'
      //
      SBUF = ':';
      while (TI==0) {};
      TI = 0;
      //

      //echo seconds
      //
      sprintf(datetime_decimal_buffer, "%u", (unsigned int)second);
      for (i=0; datetime_decimal_buffer[i]>0; i++){
         SBUF = datetime_decimal_buffer[i];
         while (TI==0) {};
         TI = 0;
      }
      //

      //new line
      //
      for (i=0; string_to_send3[i]>0; i++){
         SBUF = string_to_send3[i];
         while (TI==0) {};
         TI = 0;
      }
      //
   }
}



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 16.11.2006
Откуда: Всегда!
Я не вижу у тебя в программе запуска осциллятора у RTC (порт А, DV2,DV1,DV0 = 010).


 

Member
Статус: Не в сети
Регистрация: 19.03.2003
zauropod
Разве эти флаги нужны не для всяких дополнительных фич типа будильника, прерываний и проч.? В датащите оно как-то не совсем ясно описано.
В любом случае, большое спасибо за ответ, как приду домой - попробую.


 

Advanced member
Статус: Не в сети
Регистрация: 16.11.2006
Откуда: Всегда!
Cruel_Crow писал(а):
В датащите оно как-то не совсем ясно описано

???

Цитата:
Bits 6, 5, and 4: DV2, DV1, DV0. These three bits are used to turn the oscillator on or off and to reset the countdown chain. A pattern of 010 is the only combination of bits that turn the oscillator on and allow the RTC to keep time.


 

Member
Статус: Не в сети
Регистрация: 19.03.2003
Заработало! Спасибо ещё раз.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 5 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan