Модуль часов реального времени DS1307 - стоит без внешнего питания

x-nikolas
Offline
Зарегистрирован: 30.04.2017

Добрый день!

Модуль часов реального времени с DS1307 подключен к Ардуино и работает. Но если отключить питание Ардуино (при наличии батарейки на часах), время запоминается и стопорится. А когда Ардуино вновь включается, время продолжает идти с запомненного значения.

Это нормально? Думаю, что нет, и часы реального времени при наличии батарейки должны идти, не останавливаясь.

Прошу совета.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Мне интересно, а каким образом DS1307 сообщает вам, что он начал отчет с запомненнго значения? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

x-nikolas пишет:

Это нормально?

Зависит от того, чего Вы хотите.

Этим управляет 7-ой бит (CH) регистра 0. Что туда запишете, так и будет себя вести (стр. 8 даташита)

x-nikolas
Offline
Зарегистрирован: 30.04.2017

ulis пишет:

Мне интересно, а каким образом DS1307 сообщает вам, что он начал отчет с запомненнго значения? 

Я вывожу показания на экран.
Смотрю на экран, запоминаю время. Выключаю контроллер. Через минуту включаю, смотрю на экран... как-то так ))

x-nikolas
Offline
Зарегистрирован: 30.04.2017

ЕвгенийП пишет:

x-nikolas пишет:

Это нормально?

Зависит от того, чего Вы хотите.

Этим управляет 7-ой бит (CH) регистра 0. Что туда запишете, так и будет себя вести (стр. 8 даташита)

Большое спасибо!

bwn
Offline
Зарегистрирован: 25.08.2014

А скетч хотелось бы взглянуть, есть сильные сомнения в умении ТС менять биты регистра 0.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Научится, если хочет. А не хочет - это к Onkel - тот на чистом С и из посеребренных проводов всё сделает.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Научится, если хочет. А не хочет - это к Onkel - тот на чистом С и из посеребренных проводов всё сделает.

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em, Вы на ключе работаете?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em, Вы на ключе работаете?

 а как же, даже в чемпионате Литвы по скоростной телеграфии участвовал )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

ЕвгенийП пишет:

ua6em, Вы на ключе работаете?

 а как же, даже в чемпионате Литвы по скоростной телеграфии участвовал )))

Можете порекомендовать девайс (не обязательно здесь, можно и в другом месте), чтобы не слишком дорогой, но нормальный. Назначение - 11-летнему ребёнку на "дать попробовать, вдруг понравится".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

№2  думаю подойдёт цена-качество

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Спасибо. Кому руку поставить поищу, проблему-то понимаю, так что буду решать.

mihailkorostele...
Offline
Зарегистрирован: 23.05.2013

А еще, немаловажно, найти хорошие напевы под азбуку!. До сих пор не пойму, почему 1 - "я на горку шла", 2 - "куда ты пошла" и т.д.  

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я напевы не помню, это как один из языков уже

ХОРОШИЙ ТРЕНАЖЁР

qvazio
Offline
Зарегистрирован: 23.11.2017

ЕвгенийП пишет:

x-nikolas пишет:

Это нормально?

Зависит от того, чего Вы хотите.

Этим управляет 7-ой бит (CH) регистра 0. Что туда запишете, так и будет себя вести (стр. 8 даташита)

может подскажите команду записи 1 в 7-ой бит ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, не знаю. Вы руками с часами работаете или библиотекой какой, кто ж Вас знает.

qvazio
Offline
Зарегистрирован: 23.11.2017

ЕвгенийП пишет:

Да, не знаю. Вы руками с часами работаете или библиотекой какой, кто ж Вас знает.

Библиотека iarduino_RTC.h имеет такую возможность... ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятия не имею. Я её никогда не видел.

qvazio
Offline
Зарегистрирован: 23.11.2017

ЕвгенийП пишет:

Понятия не имею. Я её никогда не видел.

Ну ладно...  а  как бы вы это сделали ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, я бы никакими билиотеками вообще не пользовался - писал бы вручную

Но, когда-то я вот так же здесь на форуме кому-то добавлял в библиотеку для DS3231 такую фичу. Могу показать. Но у Вас же другая библиотека, да и часы другие.

x-nikolas
Offline
Зарегистрирован: 30.04.2017

Добрый день!

Позже подскажу, сейчас не рядом с ПЛК, на память не помню. У меня всё сразу получилось.

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

mihailkorostelev@rambler.ru пишет:

А еще, немаловажно, найти хорошие напевы под азбуку!. До сих пор не пойму, почему 1 - "я на горку шла", 2 - "куда ты пошла" и т.д.  

1   . _ _ _ _  И тОлькО ОднО

2   . . _ _ _  Я нА гОркУ шлА

3   . . . _ _   трИ тЕбЕ мАлО

4   . . . . _    кОмАндИр пОлкА

5   . . . . .     пЯтИлЕтИЕ

..... и так далее. Не важно какой напев, важно чтоб он запомнился как определённый символ.

qvazio
Offline
Зарегистрирован: 23.11.2017

x-nikolas пишет:

Добрый день!

Позже подскажу, сейчас не рядом с ПЛК, на память не помню. У меня всё сразу получилось.

Да, если можете поскажите. А часы такие я думаю купить не проблема. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sandr4 пишет:

mihailkorostelev@rambler.ru пишет:

А еще, немаловажно, найти хорошие напевы под азбуку!. До сих пор не пойму, почему 1 - "я на горку шла", 2 - "куда ты пошла" и т.д.  

1   . _ _ _ _  И тОлькО ОднО

2   . . _ _ _  Я нА гОркУ шлА

3   . . . _ _   трИ тЕбЕ мАлО

4   . . . . _    кОмАндИр пОлкА  или я на горку шла )))

5   . . . . .     пЯтИлЕтИЕ

..... и так далее. Не важно какой напев, важно чтоб он запомнился как определённый символ.

x-nikolas
Offline
Зарегистрирован: 30.04.2017

qvazio пишет:

ЕвгенийП пишет:

x-nikolas пишет:

Это нормально?

Зависит от того, чего Вы хотите.

Этим управляет 7-ой бит (CH) регистра 0. Что туда запишете, так и будет себя вести (стр. 8 даташита)

может подскажите команду записи 1 в 7-ой бит ?

Прошу прощения за задержку.

Я делал это стандартной библиотекой Wire.h. Итак, ниже скетч, который может записать байт в DS1307 (или изменить бит 7 (CH) байта 0).

Если вы просто загрузите скетч, при условии верного адреса прибора, то на мониторе СОМ порта увидите состояние всех битов нулевого байта, как они меняются и чему равен 7-й бит (7-6-...-1-0).

Для записи нового значения нужно:

1. Стереть "//" перед "Wire.write(0);".

2. В скобках оставить "0", если хотите сбросить 7-й бит и "128", если хотите установить 7-й бит.

3. Загрузить получившийся в пункте 2 скетч.

4. Заново установить "//" перед "Wire.write(0);". (чтобы перестать записывать)

5. Загрузить получившийся в пункте 4 скетч.

Теперь вы увидите, что бит 7 байта 0 принял то значение, которое вы записали.

Вот сам скетч:

 
#include <Wire.h>
void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
  Serial.begin(9600); //устанавливаем последовательное соединение
}
bool a,b,c,d,e,f,g,h ;
byte xx;
void loop()
{
  ////УСТАНОВКА БИТА 7
  ////////////////////////
 Wire.beginTransmission(104); // Начинаем передачу в прибор с адресом 104 (0х68)
 Wire.write(0);               // "Устанавливаем курсор" на нужный байт (0 - байт c секундами)  
 //Wire.write(0);             // Записываем нужное число в выбранный байт (0 - для обнуления бита 7, 128 - для установки бита 7 в единицу)
 Wire.endTransmission();     // Заканчиваем передачу
 
//// Всё, что дальше, не обязательно, но наглядно покажет, как и что меняется после записи,
//// а так же как меняются биты, в которых считаются секунды
 Wire.requestFrom(104,1);  // Запрашиваем 1 байт из прибора с адресом 104 (0х68) тут нужно отметить, что прежде необходимо (как выше) "установить курсор".
// Дальше читаем байт, раскладываем его на биты
 xx=Wire.read(); 
 a=bitRead(xx, 0);
 b=bitRead(xx, 1);
 c=bitRead(xx, 2);
 d=bitRead(xx, 3);
 e=bitRead(xx, 4);
 f=bitRead(xx, 5);
 g=bitRead(xx, 6);
 h=bitRead(xx, 7);
// Выводим биты на монитор СОМ порта для наглядности
Serial.print(xx,HEX);
Serial.print(' ');
Serial.print(h);
Serial.print(g);
Serial.print(f);
Serial.print(e);
Serial.print(' ');
Serial.print(d);
Serial.print(c);
Serial.print(b);
Serial.println(a);
 
  delay(1000);
}
qvazio
Offline
Зарегистрирован: 23.11.2017

А при установке 7-го бита в 0-ом байте время обнуляется ?

x-nikolas
Offline
Зарегистрирован: 30.04.2017

qvazio пишет:

А при установке 7-го бита в 0-ом байте время обнуляется ?

Я не проверял, но думаю, что скорее всего нет, разве что секунды обнуляются. 

Но это и не важно. Нужно всего один раз откорректировать бит 7 и забыть об этом. А уж потом установку текущего времени можно организовать в вашей основнй программе.

Тем более, по моему опыту, часы начинают врать со временем и, по-хорошему, нужно бы в программе организовать установку/корректировку времени с помощью экрана и, например, джойстика. Но это уже смотря насколько сильно хочется заморочиться =)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

x-nikolas пишет:

с помощью экрана и, например, джойстика. 

Не проще ли через NTP/GPS/и т.д.? Соответсвующие модули копейки стоят, зато время всегда точное - не надо помнить об этом.

qvazio
Offline
Зарегистрирован: 23.11.2017

x-nikolas пишет:

Я не проверял, но думаю, что скорее всего нет, разве что секунды обнуляются...

Но это и не важно.

как раз мне важно. Там принцип какой... Время (для меня это будет таймер - час:мин:сек) начинается с нуля. И стоит пока не "нажмут кнопку", пока кнопка НАЖАТА  время идет, как только "кнопку" отпустили врмя стало на паузу и СЕКУНДЫ сохранились. Интервалы "удержания кнопки" могут быть разными 1сек, 5,сек, 24сек, 7сек, 40сек, 1мин, 3мин и т.п. Но, пока я не захочу обнулить часы, время дожно сохраняться.

 

x-nikolas
Offline
Зарегистрирован: 30.04.2017

ЕвгенийП пишет:

x-nikolas пишет:

с помощью экрана и, например, джойстика. 

Не проще ли через NTP/GPS/и т.д.? Соответсвующие модули копейки стоят, зато время всегда точное - не надо помнить об этом.

Конечно, так намного лучше. И это хороший совет тому, кто собирается использовать часы. В моём случае я просто разбирался с тем, что есть.

x-nikolas
Offline
Зарегистрирован: 30.04.2017

qvazio пишет:

x-nikolas пишет:

Я не проверял, но думаю, что скорее всего нет, разве что секунды обнуляются...

Но это и не важно.

как раз мне важно. Там принцип какой... Время (для меня это будет таймер - час:мин:сек) начинается с нуля. И стоит пока не "нажмут кнопку", пока кнопка НАЖАТА  время идет, как только "кнопку" отпустили врмя стало на паузу и СЕКУНДЫ сохранились. Интервалы "удержания кнопки" могут быть разными 1сек, 5,сек, 24сек, 7сек, 40сек, 1мин, 3мин и т.п. Но, пока я не захочу обнулить часы, время дожно сохраняться.

 

Насколько я понимаю, бит 7 байта 0 определяет, стоят или идут часы при отсутствии внешнего питания. А в Вашем случае при наличии внешнего питания часы всегда стоят, пока не нажмёшь кнопку.

Если решать эту задачу "в лоб", то без нажатия кнопки нужно просто постоянно записывать одно и то же значение времени (для установки времени есть готовые библиотеки). По нажатию на кнопку перестать записывать (чтобы часы пошли) и постоянно запоминать текущее время. После отжатия кнопки продолжать записывать одно и то же запомненное перед отжатием время.

Если не "в лоб", то, может, есть бит остановки времени, но я такого в этих часах не видел.

qvazio
Offline
Зарегистрирован: 23.11.2017

Когда устанавливаешь курсор весь байт перезаписывается ? Или когда записываешь "1" в 7 бит в остальные биты записываются нули ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qvazio пишет:

Или когда записываешь "1" в 7 бит в остальные биты записываются нули ?

Вы физически не можете ничего записать в один бит. Записываете Вы всегда регистр целиком. Что запишете в остальные биты, то там и будет. Как вариант: сначала прочитать регистр, наложить 1 на нужный бит и записать обратно - в итоге, ничего кроме нужного бита не изменится.

qvazio
Offline
Зарегистрирован: 23.11.2017

ЕвгенийП пишет:

ариант: сначала прочитать регистр, наложить 1 на нужный бит и записать обратно - в итоге, ничего кроме нужного бита не изменится..

Вот, вот , вот я про это и думал. Только как это рализовать при отпускании кнопки незнаю. Пока незнаю.

Но логика тут такая.

1. Старт программы .  Запись "1" в 7 бит 0-го регистра и обнуляем время ... типа "10000000". Время стоит, часы на нулях. Ждем нажатия кнопки.

2. Нажатие кнопки (первое). Записываем "0" в 7 бит 0-го регистра "00000000" запускаем часы.

.... Wire.write(0); 

 Wire.write(0); ....

3. Отпускаем кнопку. Считываем значение из 0-го регистра .. "00100110" (какое то значение)

4. Делаем логическое сложение "00100110" + "10000000" = "10100110"

5. Устанавливаем курсор Wire.write(0); и потом записывает  результат предыдущего сложения "10100110"

6. Кнопка отпущена, часы остановлены, секунды сохранены. Ждем следуюющего нажатия кнопки.

7. Второе (следуюющие) нажатие кнопки.  Считываем значение из 0-го регистра .. "10100110" (то чт записали на кануне)

8. Делаем из "10100110"  значение "00100110" (логическое вычитание наверное). Устанавливаем курсор  Wire.write(0); и записываем назад (Wire.write(какое то значение);

Поидее время должно пойти с момента остановки, если ничего не напутал.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Пробуйте и смотрите.

x-nikolas
Offline
Зарегистрирован: 30.04.2017

qvazio пишет:

1. Старт программы .  Запись "1" в 7 бит 0-го регистра и обнуляем время ... типа "10000000". Время стоит, часы на нулях. Ждем нажатия кнопки.

С чего вы взяли, что "1" в 7-м бите 0-го регистра останавливает часы? Она останавливает счёт только при отсутствии внешнего питания (при отключенном контроллере, когда часы работают только от батарейки).

Чтобы остановить часы, нужно туда постоянно записывать одно и то же значение времени, пока не нажата кнопка.

Kursant86
Offline
Зарегистрирован: 28.01.2020

На модуле нужно выпаять резистор на R7 680 кОм. И будет всем счастье :)

 

bwn
Offline
Зарегистрирован: 25.08.2014

Kursant86 пишет:

На модуле нужно выпаять резистор на R7 680 кОм. И будет всем счастье :)

Некрофил аднака, на дату последнего поста взгляните, чуть больше двух лет прошло. 
Нынче уж и модули эти никто не юзает, ну почти.))))

Kursant86
Offline
Зарегистрирован: 28.01.2020

А вдруг у кого то такая проблема... А решения не нашел. А я так просто мимо проходил и написал. На всякий случай.