Модуль ds1302 в автономном режиме работает, при подключении к ардуино "замирает". В чём причина?

kefirko
Offline
Зарегистрирован: 03.05.2016

https://yadi.sk/d/1Jec3yEorej8S

По ссылке видео с субтитрами. Это заснята суть проблемы. Прямо на яндексе можно посмотреть, но без сабов. Лучше скачать оба файлика в одну папочку и тогда можно будет посмотреть с моими комментариями.

А вот описание проблемы:

В автономном режиме работает как положено, а при подключении к ардуино "замирает" (как будто на паузу нажали). Иногда всё же удаётся сделать так, что будут идти, но это надо несколько раз снять/подключить модуль. А при перезагрузке или отключении внешнего питания от платы (свет к примеру пропал) снова замирает.

У меня были мысли что это проблема в том, что батарейка 3V, а с ардуино модуль кормится 5V. Типа на 3V он работает стабильнее, но Arduino Pro Mini еще не доехела, чтобы проверить этот вариант.

Подскажите, кто уже имел дело со связкой Arduino Uno + модуль ds1302, что за беда. Может выкинуть модуль просто и новый взять, но не факт что проблема не повторится.

На всякий случай померил выход на ардуине - даже пяти вольт нет (4,95).

T.Rook
Offline
Зарегистрирован: 05.03.2016
kefirko
Offline
Зарегистрирован: 03.05.2016

Делалось на основе этого видео: https://www.youtube.com/watch?v=dCevx2I3S38 и этого https://www.youtube.com/watch?v=jG0sbB4tD04. Из первого взял пример подключения к плате и распиновку, а из второго библиотеку + пример.

После первой прошивки закомментирую строки 27, 28, 37-39 (как показано во втором видосе) и снова шью.


// DS1302_Serial_Easy 
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// A quick demo of how to use my DS1302-library to 
// quickly send time and date information over a serial link
//
// I assume you know how to connect the DS1302.
// DS1302:  CE pin    -> Arduino Digital 2 -> 7
//          I/O pin   -> Arduino Digital 3 -> 6
//          SCLK pin  -> Arduino Digital 4 -> 5

#include <DS1302.h>

// Init the DS1302
//DS1302 rtc(2, 3, 4);
DS1302 rtc(7, 6, 5);

void setup()
{
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  digitalWrite(4, LOW);
  digitalWrite(3, HIGH);
  
  // Set the clock to run-mode, and disable the write protection
  rtc.halt(false); // false - тикать, true - остановиться
  rtc.writeProtect(false); // false - можно записать информацию на ds1302, true - включена защита от записи /**/
  
  // Setup Serial connection
  Serial.begin(9600);

  // The following lines can be commented out to use the values already stored in the DS1302
  /*rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
  rtc.setTime(12, 0, 0);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(6, 8, 2010);   // Set the date to August 6th, 2010 /**/
  rtc.setDOW(WEDNESDAY);        // Set Day-of-Week to FRIDAY
  rtc.setTime(10, 43, 0);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(11, 5, 2016);   // Set the date to August 6th, 2010 /**/
}

void loop()
{
  // Send Day-of-Week
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");
  
  // Send date
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  // Send time
  Serial.println(rtc.getTimeStr());
  
  // Wait one second before repeating :)
  delay (1000);
}

 

T.Rook
Offline
Зарегистрирован: 05.03.2016

Хм.. врде все прозрачно. В качестве начального предположения:  а давайте попробуем всегда оставлять 27 строку. Потому как по datasheet:

LOCK HALT FLAG
Bit 7 of the seconds register is defined as the clock halt (CH) flag. When this bit is set to logic 1, the clock oscillator
is stopped and the DS1302 is placed into a low-power standby mode with a current drain of less than 100nA. When
this bit is written to logic 0, the clock will start. The initial power-on state is not defined

Вдруг у вас по питанию что-то прилетает когда Вы плату/порт дергаете.

UPD. Подумалось, что если проблема в этом, и дергаете сам DS модуль по питанию, то в качестве профилактики остановки надо  [ rtc.halt(false); // false - тикать, true - остановиться ] постоянно в loop дергать.

 

 

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Вот где то содрал.

1. В регистре секунд есть не использованный старший бит. В него вставили флаг перехода в спящий режим. Он вскакивает, если напряжение питания падает ниже 2 вольт. При этом схема переходит в спячку, но на внешние сигналы отвечает, хотя генератор останавливается! Чтобы сбросить флаг, при каждом включении записывайте в регистр секунд нолик. Или, если Вы аккуратист, то прочтите время, сбросьте старший бит и запишите секунды обратно.

2. У нас генератор при даже небольшом разряде батареи останавливался. То есть уже при 3,5 вольта стоял. В чем дело? Ведь по DS напряжение отруба - 2 вольта! А дело в том, что батарея – химическое устройство, т.е. медленное! При разряде сильно возрастает сопротивление на частоте работы генератора. После шунтирования батареи парой электролит + керамика все стало ОК. Керамика обязательна, так как генератор запускается не от ступенек, а от фронтов. После принятых мер генератор стал устойчиво работать до полного разряда батареи

T.Rook
Offline
Зарегистрирован: 05.03.2016

Okmor пишет:

1. В регистре секунд есть не использованный старший бит. В него вставили флаг перехода в спящий режим. Он вскакивает, если напряжение питания падает ниже 2 вольт. При этом схема переходит в спячку, но на внешние сигналы отвечает, хотя генератор останавливается! Чтобы сбросить флаг, при каждом включении записывайте в регистр секунд нолик. Или, если Вы аккуратист, то прочтите время, сбросьте старший бит и запишите секунды обратно.

rtc.halt(false); именно это и делает. Чтож, ждем ответа от ТС после проверки :))

Ну и совет №2 тоже очень в тему!

kefirko
Offline
Зарегистрирован: 03.05.2016

Всяко пробовал. И 27-ю строку оставлял на всякий случай - не помогло.

Вечером попробую эту строку в loop записать и потестить.

kefirko
Offline
Зарегистрирован: 03.05.2016

Борода. Если добавить rtc.halt(false) в loop{} ничего отличного от того, что было раньше не происходит.

T.Rook
Offline
Зарегистрирован: 05.03.2016

kefirko пишет:

Борода. Если добавить rtc.halt(false) в loop{} ничего отличного от того, что было раньше не происходит.

Тогда, прежде всего, совет 2 из #4 от Okmor

kefirko
Offline
Зарегистрирован: 03.05.2016

Боюсь я с советом №2 не справлюсь. Нужно разжевать.

Вот сейчас сижу колдую с ардуино про мини (приехала). Вот только приехала 5-ти вольтовая версия. А тут бы 3,3 в самый раз.

Короче работает, но как-то странно. Случайно коснулся чипа - кипяток. Отрубил питание, а в Serial'е время идёт (видимо на батарейке работает). Тыкаю ресет (примерно секунды 2 проходит), а он мне прибавляет по 6 секунд! Да еще и переваливает периодически за 59 секунд! Видимо в совете №2 всётаки есть решение. Как питание подрубаю - чип нагревается (меньше чем за минуту палец уже не держит).

Короче надо заказывать про мини 3,3 видимо и все норм будет. Либо часы 5-ти вольтовые.

А можно как-н на ардуине управлять напряжением логичесикх уровней (или как там это называется). Типа я на пины 5, 6, 7 логическую единицу не в виде 5-ти вольт буду подавать, а в виде 3,3-х вольт?

Кстати "замирания" не выявлено.

Если что-то в определениях напутал, то поправьте.

kefirko
Offline
Зарегистрирован: 03.05.2016

А на уне так чип не греется (pin 3-7). Вот проверил только.

T.Rook
Offline
Зарегистрирован: 05.03.2016

Ну 3х вольтовый или 5-ти вольтовый у Вас модуль, это только Вы знаете.  Мы ведь его не видели. Как и схему подключения. Сама DS1302 будет и на 3 и на 5-ти вольтах работать. Нагрев  - нехороший симптом - корень в питании скорее всего, как и "замирания". Так что вешайте конденсаторы параллельно батарее и проверяйте.

77 секунд это реально круто! :) Может вы модуль уже пережарили?

Замкну-ка я две темы в одну :) http://arduino.ru/forum/apparatnye-voprosy/vy1307-ostanavlivayutsya-pri-otklyuchenii-pitaniya

kefirko
Offline
Зарегистрирован: 03.05.2016

А я продолжу тут, а то там про ds1307. Чутка, но другое. Даже если простого решения не найдётся, то может у кого-то найдутся похожие проблемы.

Совет Okmor возможно и имеет место, но там немного другая проблема описана. У меня же генератор останавливается фактически после рестарта ардуины, в автономном режиме он работает. Хотя может быть это потому что батарейка еще новая. Или туда вообще аккумуляторную надо (https://www.youtube.com/watch?v=b8-4o6A7dZs - правда это опять же про ds1307).

Сегодня подключил модуль на пины 3-7 (как в скетче), но без батарейки. Всё работает идеально. При ребуте конечно дата сваливается, но зато потом опять начинает тикать с нуля. Работает именно так как и должен. А вот с батарейкой так не хочет.

При попытке взять питание не с третьего пина (как в примере), а с самой платы Ардуино - греется чип. С батарейкой, без батарейки - всё равно.

Вот непонятно. Почему если взять 5 вольт с 5-ти вольт ардуины, то чип греется, а если с 3-го пина, то нет. Померил напряжения там и там. Всё одинаково 5,16В. Хотя в прошлый раз было 4,95В. Как-то так. Чудеса. 

T.Rook
Offline
Зарегистрирован: 05.03.2016

kefirko пишет:

Сегодня подключил модуль на пины 3-7 (как в скетче), но без батарейки. Всё работает идеально. При ребуте конечно дата сваливается, но зато потом опять начинает тикать с нуля. Работает именно так как и должен. А вот с батарейкой так не хочет.

Именно! Без батарейки просто нет питания и ничего не работает. А Ваши симптомы похожи на нехватку питания от батарейки при отсутствии внешнего питания. Ну и как полагается, при нехватке своего питания (<2.2в) DS-ка тормозится. Не смотрели, напряжение питания при работе от батареии на ножках DS какое?

 

kefirko
Offline
Зарегистрирован: 03.05.2016

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

T.Rook
Offline
Зарегистрирован: 05.03.2016

А Какое напряжение на батарее и соответствующем пине DS-ки при подлюченной ардуинке и выключенном внешнем питании?

T.Rook
Offline
Зарегистрирован: 05.03.2016

kefirko пишет:
Проблемы возникают при подключению к плате ардуины. Если модуль подключен к плате без батарейки, то все нормально. Если с батарейкой, то 'замирает'. При отключении от платы или отключении питания платы время идет.

Так при каких условиях замирание?

DS подключена к ардуине , есть внешнее питание и происходит сброс ардуинки при передергивании COM порта? или ресетом?

Напишите подробнее. Только давайте использовать "DS" и "ардуина", а то когда Вы пишете "плата" то не совсем понятно какая плата.

 

kefirko
Offline
Зарегистрирован: 03.05.2016

T.Rook пишет:

Так при каких условиях замирание?

DS подключена к ардуине , есть внешнее питание и происходит сброс ардуинки при передергивании COM порта? или ресетом?

Напишите подробнее. Только давайте использовать "DS" и "ардуина", а то когда Вы пишете "плата" то не совсем понятно какая плата.

Да именно при этих условиях он останавливается. Если батарейка вставлена.

DS + батарейка + автономный режим (от батарейки) без подключения к ардуине = работает. Отмечаю потому что при отключении было одно время, а при подключении стало другое время, значит при отсутствии внешнего питания DS исправно работал от батарейки. Так сказать "тикал".

DS + батарейка + подключение к ардуине = не работает, пауза, замерание (как по адекватнее назвать... останавливается короче). Причем если несколько раз переткнуть DS туда/сюда (выдернуть из ардуины, воткнуть), то можно поймать момент когда DS заработает от питания ардуины, но при передергивании COM порта или ресете ардуины он опять останавливается. Всё это есть на видео. Старался блин делал, чтобы понятно было, но видимо плохо получилось.

DS без батарейки + подключение к ардуине = работает. При ресете, передёргивании COM потра - работает. Всё круто. Про сохранение времени речь не идет. И так понятно что при отключении питания DS начнет отчет с нуля, но начнёт ведь!

В описанных выше вариантах на пины ардуины 3 и 4 были прикручены +5V и GND (см. код примера). Чисто для удобства подключения DS (он уже размещен на отдельном модуле). Вот тут https://www.youtube.com/watch?v=dCevx2I3S38 дядька именно таким образом и подключал DS.

Теперь берем питание и землю как обычно с пина +5V и GND ардуины. DS начинает люто разогреваться.

kefirko
Offline
Зарегистрирован: 03.05.2016

T.Rook пишет:

А Какое напряжение на батарее и соответствующем пине DS-ки при подлюченной ардуинке и выключенном внешнем питании?

Вечером обязательно посмотрю. Забыл просто.

T.Rook
Offline
Зарегистрирован: 05.03.2016

Интересует напряжение непосредственно на ножках DS1302 -  внешнего питания и батареи в момент "замирания". По идее, способ увести DS в режим остановки генератора, это проседание питание.  Эх, хорошо бы осцилографом посмотреть шо там происходит.

kefirko
Offline
Зарегистрирован: 03.05.2016

Подключен к ардуино, батарейка вставлена, тикает: внеш - 5,15В, бат - 3,04В.

Подключен к ардуино, батарейка вставлена, остановился: внеш - 2,44В, бат - 2,65В.

Подключен к ардуино, батарейки нет, тикает: внеш - 5,15В.

Подключен к ардуино, батарейки нет, остановился: не останавливается, всегда тикает.

Выдернут из ардуино, батарейка вставлена, скорее всего тикает: бат - 2,99В.

kefirko
Offline
Зарегистрирован: 03.05.2016

T.Rook пишет:

Интересует напряжение непосредственно на ножках DS1302 -  внешнего питания и батареи в момент "замирания". По идее, способ увести DS в режим остановки генератора, это проседание питание.  Эх, хорошо бы осцилографом посмотреть шо там происходит.

Собственно вот. Померил (см. выше).

T.Rook
Offline
Зарегистрирован: 05.03.2016

kefirko пишет:

Подключен к ардуино, батарейка вставлена, остановился: внеш - 2,44В, бат - 2,65В.

Почему так просело внешнее питание? Не должно быть так!

Если в этом варианте внешнее было отключено - то надо смотреть разводку питания от батареи на DS. Батарея должна уходить только на DS и на землю.  

kefirko
Offline
Зарегистрирован: 03.05.2016

T.Rook пишет:

kefirko пишет:

Подключен к ардуино, батарейка вставлена, остановился: внеш - 2,44В, бат - 2,65В.

Почему так просело внешнее питание? Не должно быть так!

Если в этом варианте внешнее было отключено - то надо смотреть разводку питания от батареи на DS. Батарея должна уходить только на DS и на землю.  

Подключен к ардуино - это он подключен к ардуино и от него же кормится. В этом варианте как раз внешнее питание подключено.

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

kefirko
Offline
Зарегистрирован: 03.05.2016

Только что проделал те же манипуляции с DS, но теперь подключил его к про мини. Всё точно так же как и с уной. Никакой разницы. Даже напряжения не сильно отличаются.

Дополнительно замерил напрячение на ногах DS при сильном нагреве чипа. Это когда я подключаю ноги VCC, GND DS-ки к VCC, GND ардуины, а не к 3, 4-му пинам как в примере. Было 3,66В на ноге внешнего питания, 2,99В на ноге батарейки, DS грелся.

Дальше интереснее. Вынимаю батарею из DS, подключаю еще раз в схему "перегрева". Напряжение с ноги внешнего питания 5,19В. Все нормально, ничего не греется, а в прошлый раз на уне грелось. Пару раз жму ресет - нормально. Подключаю батарею, жму ресет - 5,19В ничего не греется. Прям мистика. Выдернул проводки VCC, GND из про мини, воткнул назад, нажал ресет - 3,66В начал греться DS. Странно всё это. Закажу еще 1 DS для опытов.

До кучи вопрос: про мини у меня шьется через usbasp программатор (опух пока ему прошивку обновлял). Сериал порт ничего показывать не хочет. "Плата СОМ3 недоступна" пишет. Я правильно понимаю, что при подключении через usbasp так и должно быть, Serial будет не доступен? А если будет usbttl конвертер, то через Serial я все увижу как обычно?

usbasp программатор, usbttl конвертер - вроде в этом и ключевая разница.

AleksandrH
Offline
Зарегистрирован: 04.07.2017

Хочу поделиться, может кому поможет. Я тоже поимел проблем с подключением ds1302, нагревание, зависание, неточный ход. Прогуглил массу постов. Сейчас ни чего не греется, не зависает и идет с приличной точностью, практически как заводные часы моей бабушки :-) Для того что бы чип не грелся я сделал две вещи, в скетче в setup() добавил строку rtc.setTCR(TCR_OFF); // выключить зарядку. Вывод земли устройства я подключил к земле ардуино через сопротивление 7 кОм. Сопротивление было определено так, подключил переменный резистор на 10 кОм на землю и в монитор порта каждую секунду выдал показания часов и крутил резистор. От 10 до 8 кОм периодически часы выдавали бред. От 8 до 6 кОм стабильная работа, меньше 6 кОм опять бред. Питание устройства от +5 ардуино, остальные выводы подключил напрямую к портам ардуино. Для повышения точности я просверлил по краям от кварца по середине длины в плате пару отверстий 1 мм, обогнул дугой кварц провочкой от какой то радиодетали и с обратной стороны на плате припаял к земле. Полет нормальный.

AleksandrH
Offline
Зарегистрирован: 04.07.2017

П.С. кто то писал, что ставить сопротивление на землю не правильно, так вот можете попробовать другой способ, я его не пробовал, т.к. порядком устал от борьбы с этими часами. Выводы управления подтягиваются к +5в резисторами на 10 кОм, а питание +5в подается через сопротивление 1 кОм. Земля напрямую. Если кто будет пробовать и получится, напишите тут ради интереса.

AleksandrH
Offline
Зарегистрирован: 04.07.2017

Еще одна фича которая может кому то пригодиться при работе с часами ds1302. Не смотря на все доработки схемы подключения и настройки часов в них иногда, очень редко но проскакивают левые данные. И что бы они не попадали в основную программу я сделал в своем скетче фильтр на такие глюки. Допустим есть переменная в которой хранится текущее время Time CurTime. Заполняем ее значение так что бы левые данные отсекались:

void GetCurTime() {
  CurTime = rtc.getTime();
  while (CurTime.date == 0 || CurTime.date > 31 || CurTime.hour > 23 || CurTime.mon == 0 || CurTime.mon > 12) {
    CurTime = rtc.getTime();
    delay(500);
  }
}

ArturKu
ArturKu аватар
Offline
Зарегистрирован: 06.09.2020

Вчера тоже получил часы на 1302 и начались те же "пляски с бубном".
Перепробовал все советы с этой темы, перепробовал кучу скетчей - останавливаются, собаки, и всё!

Сегодня просто по-старинке попробовал пропаять все контакты и подрезать их по длине - уж очень сильно торчали. Решил: если и это не поможет - пущу под переделку на 1307.

И случилось ЧУДО - они заработали!