Добрый день !
Есть часы DS1302 и Arduino Uno R3. Подключил библиотеку DS1302.h, загрузил скетч для работы с часами.
Появилась проблема - часы не отсчитывают время в автономном режиме !
Пока есть внешнее питание, часы идут ! Нет внешнего питания - стоят !
После очередного включения, часы отображают время которое было на момент отключения внешнего питания. Судя по всему чип часов работает. Старое время помнят - значит и батарейка работает. Так почему же они не ведут отсчет времени автономно? Кто знает, подскажите !
Может быть есть какая то хитрость в программировании ?
Перед установкой времени используются команды:
rtc.write_protect(false);
rtc.halt(false);
Может быть после установки времени нужно использовать еще какие нибудь команды ?
Или эти же, но с другими параметрами ?!?!...
Скетч:
/*
Example sketch for interfacing with the DS1302 timekeeping chip.
Copyright (c) 2009, Matt Sparks
All rights reserved.
*/
#include <stdio.h>
#include <string.h>
#include <DS1302.h>
/* Set the appropriate digital I/O pin connections */
uint8_t CE_PIN = 5;
uint8_t IO_PIN = 6;
uint8_t SCLK_PIN = 7;
/* Create buffers */
char buf[50];
char day[10];
/* Create a DS1302 object */
DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
void print_time()
{
/* Get the current time and date from the chip */
Time t = rtc.time();
/* Name the day of the week */
memset(day, 0, sizeof(day)); /* clear day buffer */
switch (t.day) {
case 1:
strcpy(day, "Sunday");
break;
case 2:
strcpy(day, "Monday");
break;
case 3:
strcpy(day, "Tuesday");
break;
case 4:
strcpy(day, "Wednesday");
break;
case 5:
strcpy(day, "Thursday");
break;
case 6:
strcpy(day, "Friday");
break;
case 7:
strcpy(day, "Saturday");
break;
}
/* Format the time and date and insert into the temporary buffer */
snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",
day,
t.yr, t.mon, t.date,
t.hr, t.min, t.sec);
/* Print the formatted string to serial so we can see the time */
Serial.println(buf);
}
void setup()
{
Serial.begin(9600);
/* Initialize a new chip by turning off write protection and clearing the
clock halt flag. These methods needn't always be called. See the DS1302
datasheet for details. */
rtc.write_protect(false);
rtc.halt(false);
/* Make a new time object to set the date and time */
/* Tuesday, May 19, 2009 at 21:16:37. */
Time t(2014, 6, 4, 13, 22, 40, 4);
/* Set the time and date on the chip */
//rtc.time(t);
}
/* Loop and print the time every second */
void loop()
{
print_time();
delay(1000);
}
такой миркушки у меня нет
я не очень понял в чем суть проблемы
микросхемы при обесточивании ведут себя как кнопки замыкающие на землю выводы
что-бы этого не происходило придумали Z- состяние но это питать или Реле
насколько я понял часам на внешную плату ерунда команды уходят
не очень понятно а если микропроцессор включится не сбрасывает ли он периферию
может тут имеет место не синтаксическая проблема а логическая
Суть проблемы в том что, RTC - DS1302 должны работать как и часы на материнской плате компьютера. То есть независимо от питания которое приходит на материнскую плату от блока питания. Для этого часы снабжены батарейкой.
А в моем случае часы работают нормально лишь до тех пор, пока есть питание на Arduino UNO.
Когда питание Arduino отключается, часы останавливаются. (И запоминают время).
Когда питание вновь подается, часы продолжают показывать время с того момента в который была отключена Arduino...
Ну в общем, если питание отсутствует 2 часа, то потом часы отстают на 2 часа...
Сами часы такого типа:
http://www.aliexpress.com/item/Free-shipping-DS1302-Real-Time-Clock-Module-with-Battery-CR2032-for-arduino-2-pieces-lot/1214260168.html
Как мне добиться полноценной работы RTC - DS1302 ???
Мне нужно чтоб они работали и без питания Arduino.
заменить батарейку.
заменить батарейку.
думаете что все таки логическая
заменить батарейку.
думаете что все таки логическая
заправляю бензин и машина едет. но как только бензин заканчивается, она перестает ехать.. в чем проблема?
наверно нужно как минимум проверить сколько питания выдает батарейка и достаточного ли этого для работы часов..
Батарейку я проверил в первую очередь.
3.23 Вольта. Да и сохранется время в памяти долго. К батарейке претензий нет.
Arduino у меня недавно. А с часами RTC столкнулся впервые.
Ощущение такое что я просто что то делаю не так... Не могу понять что...
ну
1. взять нормальную библиотеку с нормальными примерами!
2. ваш код при включении дуины в сеть первым делом выставляет в часах время прописаное в коде...
3. изучайте матчасть!
Строчку - //rtc.time(t);
В первый раз запускаю в активном виде, без - символов //
А уже во второй раз в виде комментария, с символами - //
Так что во второй раз время стартует не с времени указанного в скетче. А показывает время когда питание было отключено.
И как мне знать какая библиотека нормальная и какой пример нормальный ?
До этого я испробовал две другие библиотеки, но они даже установить правильно время не смогли. Я указывал точное время и дату. Но отображались совсем другие значения... Возможно дело было в кодировке... не знаю... Эта библиотека сразу установила всё правильно. Вот только автономно время не считают а просто замирают до следующего включения.
Может ещё есть идеи ? Или посоветуйте пожалуйста нормальную библиотеку с примерами !
возможно не стартует кварц.
Очень странно, т.е. пока внешнее питание есть часы идут и идут правильно, и при отключениии питания время не сбрасывается (при следующем включении время как бы "стартует" с прошлого раза) ?
А что будет, если просто подать питание, засечь скажем 30 сек, и только потом попробовать прочитать время, будет показывать значение предыдущего отключения плюс 30 сек ?
Очень странно, т.е. пока внешнее питание есть часы идут и идут правильно, и при отключениии питания время не сбрасывается (при следующем включении время как бы "стартует" с прошлого раза) ?
Да именно так и происходит...
Задержка 30 сек, интересная идея, попробую...
Пробовать не пришлось, потому что ситуация начала проясняться.
Случайно прижал плату часов и начались чудеса... :-)))
Сбились часы на дату 2000 00 00.
Время 0 часов 0 минут, только секунды и день недели продолжили отображаться корректно !
После следующей прошивки отображение пошло через секунду.
То есть четные секунды всё корректно, а нечетные секунды что-то по нулям: или дата, или минуты, или часы...
Или всё по нулям а секунды корректно.
Диагноз - китайская сборка !
Лечение:
1) Пришлось пропаять все контакты платы.
2) Кварц пришлось даже выпаять, залудить нормально и назад впаять.
3) Выводы микросхемы пришлось очистить от оксидов и вставить назад в панельку.
4) Под батарейкой было обнаружено небольшое пятно оксидов... Зачистил.
Если бы чудеса начались сразу, я бы сразу и пропаял !
Возможно из-за плохой сборки и не получилось работать с двумя предыдущими библиотеками <DS1302.h>.
Теперь всё работает адекватно.
Остался вопрос точности... Ребята в форумах пишут что часы убегают ежесуточно на 5 сек. Посмортим...