• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Работа с аппаратным таймером.

pvvx

Активный участник сообщества
Пишите свой опрос RTC или припаяйте провод прерывания Alarm, а не юлите вокруг да около...
 

Goga075

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

pvvx

Активный участник сообщества
Кроме температурного ухода у кварцев бывает уход из-за окисления напыления металлических электродов от остаточной нечистоты газа. Плюс достаточно большой уход от номинала резонансной частоты при изменении амплитуды напряжения. А так же расположения кристалла в плоскости действия гравитации, а в дешевых и от дыр в корпусе - разнице давления … :)

Сегодня у вас +0.9999, а завтра насчитает минус и число минут будет другое – попадете на пересчет минут. И как не крутите Arduino, придется писать все дрова для часов самому.
Или забыть о данной задаче.
 

Goga075

New member
Мне вот интересно стало, как вы так посчитали что сдвиг на минуты может быть!?!?
 

pvvx

Активный участник сообщества
Пусть время в RTC 00:59:59 и 1 мкс до перехода к 01:00:00
Считываем регистр минут - в нем 59. Через 1 мкс считываем регистр секунд - там 00. Получаем 59:00
И наоборот считываем регистр секунд - там 59, через 1 мкс считываем регистр минут - там 00. Получаем 00:59
 

pvvx

Активный участник сообщества
И так далее, если не действовать по документации к RTC получим дельту в +-год, если регистр лет RTC не управляется. Если управляется, то +-сотню лет в момент перехода с 31.12.99 23.59.59 к 01.01.00 00:00:00.
 

pvvx

Активный участник сообщества
Время считывания одного 8-ми битного регистра по шине I2C на 100 кГц не менее 200 мкс.
При непрерывном чтении регистров RTC как не попадя, по Ардуиновски, получаем вероятность попасть на пересчет более 1/5000
И какая разница, что игрушка, которою используют не более получаса лажанет и покажет часы из другого века? Всё равно её выкинут.
 

pvvx

Активный участник сообщества
Вот 64-х битный счетчик таймера на СИ, в ESP считывается так:

  1. Запрещаются прерывания
  2. Считывается старший 32-х битный регистр.
  3. Считывается младший 32-х битный регистр.
  4. Повторно считывается старший 32-х битный регистр и сверяется с первым чтением. Если не равен, то на пп2.
  5. Складываются младшие и старшие 32 бита в 64-х битное число.
  6. Разрешаются прерывания.

Такое можно применить к RTC, но нет смысла, т.к. на то в RTC есть аппаратный алгоритм чтения описанный в документации.
 

pvvx

Активный участник сообщества
У вас "скетч" специально настраивается на момент поодиночного считывания регистров в момент их пересчета.
Похоже это сделано чтобы наловить как можно больше глюков.
Но задача ловли глюков так не делается. Есть методы проще :)
 

Goga075

New member
Спасибо за ваши язвительные и глупые подсказки.
Но я нашел в чем проблема. Все гениальное просто.
Аппаратный таймер ESP имеет отрицательное значение погрешности и моя формула разумеется не учитывает отрицательные значения.
 

pvvx

Активный участник сообщества
Но я нашел в чем проблема. Все гениальное просто.
Аппаратный таймер ESP имеет отрицательное значение погрешности и моя формула разумеется не учитывает отрицательные значения.
Очень хорошо, что исключили ещё один глюк из описанных выше.
 

pvvx

Активный участник сообщества
Теперь вам придется исправить всё остальное, включая библиотеку DS3231.

Описание как ми когда защелкиваются регистры RTC для чтения (вырезка из PDF):
1722275612554.png

Используемая вами реализация в "скетче" имеет такие обращения:
1722275649443.png
Что является неверным использованием, о котором описано ранее.

Далее в исходниках этой "либы" встречаются забавные надписи типа - я не знаю как синхронизовать RTC, используйте в правильную часовую миллисекунду, а не при приближении к пересчету, если обращения редки, типа глюк маловероятен :)
Ну для Arduino сойдет :) :)

Так-же писали что подойдет, но не подошло.
Оно и неудивительно - достаточно посмотреть код...
 

pvvx

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

CodeNameHawk

Moderator
Команда форума
Аппаратный таймер ESP имеет отрицательное значение погрешности и моя формула разумеется не учитывает отрицательные значения.
Так я вам об этом и написал в первом ответе и хватит "ябедничать" на другого, это так же некультурно, как и обращаться к незнакомому на ты.
 

pvvx

Активный участник сообщества
Первая ошибка находится уже в первых строках
Код:
      Serial.print(myRTC.getMinute(), DEC);
      Serial.print(":");
      Serial.println(myRTC.getSecond(), DEC);
С идущих часов считывается значение минут и выводятся. Часы продолжают идти. Минуты меняются...
И тут считывается значение секунд. Из другого времени в минутах и выводятся. :eek:
Как до такого можно додуматься?
 

CodeNameHawk

Moderator
Команда форума
Часы продолжают идти. Минуты меняются...
Так может он из тех "Не поверю, пока сам не увижу и палец свой не приложу"
А так, во время отладки, тяжело такое поймать, вот и не верит.

esp_timer_start_once(timer1, (3600-(myRTC.getMinute()*60+myRTC.getSecond()))*1000000ul);
по этому коду, скорее всего и не определить, в какой последовательности считаются, минуты и секунды или секунды а потом минуты, все будет в "руках" компилятора.
 

Goga075

New member
Ржу с вас ребятки. Вы два клоуна устроили тут такой сралик в попытках доказать на сколько вы супер знатоки. Один утверждает что еще в начале "подсказал", хотя я попросил уточнить и уточнить не смог. Другой "мотивировал" своими советами в формате насмешек.
Ну а если серьезно по делу. Формула выставляет время каждой последующей сработки таймера в 0 минут и 0 секунд с погрешностью в 0.999 секунды. Про какой сдвиг на минуты вы говорите мне не понять.
Да, существует вероятность что есп перезагрузится или включится скажем к примеру в 15 минут 59.999 секунд и да мы получим по факту не верную вычитку. Но такая вероятность будет равна примерно 0.0001% т.е. на практике это фактически не возможно.
Хотя изначальный вопрос стоял о другом и коль вам хочется докопаться до кривизны кода, то правда всегда будет на вашей стороне.
 

CodeNameHawk

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

Потом было
Опишите, как вы получаете смещение времени и как рассчитываете новое время таймера.
Вы опять ничего не поняли
Смещение времени я ни как не получаю.
Даже на
esp_timer_start_once(timer1, (3600-(myRTC.getMinute()*60+myRTC.getSecond()))*1000000ul);
Что тут делает myRTC ?
не смогли ответить.
И после этого я все починил сам.
 
Сверху Снизу