RTC и время в милисекундах

Diablo
Offline
Зарегистрирован: 25.01.2014

Доброго всем времени суток!

Ни как не могу побороть данную проблему:

к Arduino Uno подключен RTC на базе DS1307.

так как по умолчанию софт считает милисекунды от начала запуска программы, а не от времени текущего, встает вопрос, как все же получать реальное время но с милисекундами, хотя бы до сотых?

maksim
Offline
Зарегистрирован: 12.02.2012

У DS1307 есть вывод SQW/OUT. Настраиваете его на 1 Гц и подключаете к внешнему прерыванию, в обработчике прерывания сохраняете значение millis() в переменную.
Все. Секунды вы получаете от таймера, а миллисекунды есть разница между текущим значением 
millis() и переменной.

Diablo
Offline
Зарегистрирован: 25.01.2014

maksim пишет:

У DS1307 есть вывод SQW/OUT. Настраиваете его на 1 Гц и подключаете к внешнему прерыванию, в обработчике прерывания сохраняете значение millis() в переменную.
Все. Секунды вы получаете от таймера, а миллисекунды есть разница между текущим значением 
millis() и переменной.

да действительно, есть такой выход, а раньше не обследовав и в жизни не увидел. Вот собственно и проблема со всякими рода настройками, если честно, все что вы написали далее темный лес, в том числе, как и настроить его на 1Гц

Мой код, кстати пусть и кустарный но до подключения дисплея работал отлично )

void loop () {

if (sec == now.second()) {
  msec = msec + 1;
  }
  else {
  msec = 0;
  }
  Serial.print(msec, DEC);
  sec = now.second();
  delay(4);
}

 

Diablo
Offline
Зарегистрирован: 25.01.2014

Вот что удивительно, снял RTC с питания в 5V, подключил отдельно на 3.3V

Сделал такой код:

void loop () { 
  DateTime now = RTC.now();  
  if (sec == now.second()) msec++;
  else msec = 0;
  sec = now.second();
  Serial.print(now.unixtime());
  Serial.println(msec);
  delay(2);
}

работает корректно и все идеально  считает, 99 миллисекунда является последней в текущей секунде и новая уже получает 0, но вот что удивительно если взять его дату и конвертнуть в нормальную, получается такое: Thu, 16 Jul 6415 01:22:20 GMT

При этом после включения и отключения часы все равно идут в этой временной дате, а после переключения обратно на 5V часы оказываются не сбиты и идут в нашем времени, но по данному коду милисекунды уже считают всего до ~68-69 для каждой секунды.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Diablo пишет:

Вот что удивительно, снял RTC с питания в 5V, подключил отдельно на 3.3V

а если подключить в 220 то все станет гораздо удивительней

Diablo
Offline
Зарегистрирован: 25.01.2014

ну а если по делу? я все же уменьшил мощность, а не увеличил её

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Diablo пишет:

ну а если по делу? я все же уменьшил мощность, а не увеличил её

 п делу мне не понятно зачем мучить RTC для получения в милисекундах.. вы видимо первый кто до такого додумался...

обычно когда нужны милисекунды то берут милис с МК и не морочатся.

Diablo
Offline
Зарегистрирован: 25.01.2014

Как я уже писал миллис считает со старта работы программы, а мне надо от реального времени, так как 2 таких прибора должны иметь одно время с миллисекундами. А запустить их одновременно возможности может не быть.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Diablo пишет:
Как я уже писал миллис считает со старта работы программы, а мне надо от реального времени, так как 2 таких прибора должны иметь одно время с миллисекундами. А запустить их одновременно возможности может не быть.

все забавней и забавней... может уже огласите проект целиком и мы поржом весело?

axill
Offline
Зарегистрирован: 05.09.2011

Diablo пишет:
Как я уже писал миллис считает со старта работы программы, а мне надо от реального времени, так как 2 таких прибора должны иметь одно время с миллисекундами. А запустить их одновременно возможности может не быть.

Если так, то ds1307 вам в этом не подмога. Идея которую вам выше предложили это между секундами Ds1307 считать миллисекунды от кварца самого МК. Но раз вам нужна синхронизация двух МК , то стоит один из них перезапустить и вся информация о миллисекундах будет утрачена

Diablo
Offline
Зарегистрирован: 25.01.2014

Puhlyaviy пишет:

все забавней и забавней... может уже огласите проект целиком и мы поржом весело?

Троллей прошу проходить мимо все по делу, проект прост, надо вычислить время перемещения объекта от датчика 1 до датчика 2, до сотых миллисекунд.

Diablo
Offline
Зарегистрирован: 25.01.2014

axill пишет:

Если так, то ds1307 вам в этом не подмога. Идея которую вам выше предложили это между секундами Ds1307 считать миллисекунды от кварца самого МК. Но раз вам нужна синхронизация двух МК , то стоит один из них перезапустить и вся информация о миллисекундах будет утрачена

вот по этому я и эксперементирую с тем, что пытаюсь за секунду прогнать датчик 99 раз, и как я писал выше если подключить часы к 3.3V, это работает идеально, при самом простом алгоритме, но не в той временной зоне...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Diablo пишет:

Троллей прошу проходить мимо все по делу, проект прост, надо вычислить время перемещения объекта от датчика 1 до датчика 2, до сотых миллисекунд.

просить вы можете все что вам в голову взбредет.. можете даже золотую рыбку кликать..

тоесть заместо нормального пути, ака поиск как синхронизировать 2 МК на какой то дистанции ( мигая светодиодом и читая этот светодиод с другого конца. по радио. по звуку..) вы решили что вы будете высчитывать разницу между двумя RTC с точностью до сотых долей... причем нужна еще правильная дата...

если нужна правильная дата, то можно предположить что 2 МК разделены половиной глобуса.. и на такой дистанции точность до сотых долей уже как мертвому припарки...

а елси дистанция в пределах видимости  то это возращает нас к началу.. каким образом МК будут синхронизироватся? ведь никто не дает гарантии что два RTC будут бегать точно друг за другом с точностью до сотых.. к тмоу же сам модуль не очень точен.. некоторые вон наблюдают расхождение в несколько минут в течении суток... а если будет решена проблема синхронизации, то там можно и милис считать а потом с них уж высчитытвать дни, года, минуты.. кстати так еще и не понятно нафиг нужен второй мк? если по сути одному мк просто нужно два датчика светодиодных с отражателем с другой стороны

так что тупите дальше дорогой... троли вам только мечтаются в вашей больной фантазии..

Diablo
Offline
Зарегистрирован: 25.01.2014

данные приборы могут находиться друг от друга на расстояние от 500м до 5км, при этом использовать GPS или GPRS приемники очень бы не хотелось. Запустить их одновременно тоже не получиться что бы например всего лишь высчитывать обычные Millis. Поэтому и морочаюсь, как заставить их работать на таком расстояние но синхронно по времени. Данные датчики нужны будут всего 1 день, после чего на полку до определенного периода, в виду этого их RTC можно синхронизировать перед выходом из дома. Другого более рационального подхода я представить не могу.

axill
Offline
Зарегистрирован: 05.09.2011

Если можно синхронизировать перед выходом из дома, значит можно и запустить перед выходом из дома одновременно. Еще вариант - синхронизировать их в любой момент при соединении по Serial. В любом случае RTC вам не нужен, нужен стабильно работающий генератор

Забудьте про RTC, он не для вашей задачи

совет - хотите адекватной помощи на форуме, описывайте задачу, а не свое решение. Сейчас ваше решение выглядит как попытка затолкать яблоко (RTC) в задницу (задачу) - но это не означает, что вы нашли нетрадиционное решение ;) это лишь означает, что вы пытаетесь применить не подходящее задаче решение ;)

ivan_admin
Offline
Зарегистрирован: 09.01.2014

Часы не нужны, ну или только 1 если уж нужно дату и время.

Перед выходом считываем из одной millis  в другую.

А после тоже самое и высчитаем разницу.

Тока если они не зависнут :)

Diablo
Offline
Зарегистрирован: 25.01.2014

ivan_admin пишет:

Тока если они не зависнут :)

а какова вероятность сбоя? вроде как millis(), до полного цикла бегут 50 дней ) тут максимум 4-8 часов на работу.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Diablo пишет:

а какова вероятность сбоя? вроде как millis(), до полного цикла бегут 50 дней ) тут максимум 4-8 часов на работу.

Зависит целиком от внешних факторов начиная с питания и заканчивая радиусом закругления рук программирующего. Внутри - виснуть особо нечему.

Diablo
Offline
Зарегистрирован: 25.01.2014

Ну тогда всем спасибо за дискуссию, и разъяснение, буду делать именно так!

Делаю первый проект на ардуине так что не серчайте)

Solvik
Offline
Зарегистрирован: 24.11.2016

   Доброго всем. Осваиваю самые простые подключения и программирования. Не могу разобраться с отсчетом времени. После проверки скетча и загрузки его в модуль, LED на плате показывает что импульс идет. Но на мониторе порта введенные данные остаются неизменными. Хотя там строка тоже прокручивается. Какая строка в скетче указывает на "привязку" к реальному времени?

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

13-я.