Доброго времени суток. Есть сабжевый девайс (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-порт компьютера):
//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; } // } }
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.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения