Спасибо! Буду разбираться. Прочтите, пожалуйста, #105.
Если добавить счетчик переключений trigger, то “ноль” ловится без проблем.
Опять! Вы рассказываете как вы планируете делать, а не что Вы планируете делать. Т.е. Вы рассказываете свою идею решения задачи, а не саму задачу.
Пример о котором я говорил такой:
у человека было SSR реле с контролем перехода через ноль. Он хотел давать ему команды внутри полупериодов, не чаще, чем раз в 10мс (полупериод сетевого напряжения). Ну, написал очень хитрую настройку таймера и получил ШИМ с периодом в одну секунду с шагом управления в 10мс (т.е. ШИМ управлялся от 0 до 100). Но проблема была в том, что его ШИМ постоянно куда-то плавал по фазе в сравнении с сетевым напряжением и уплывал до того, что начинался полный рассинхрон, пропускались полупериоды и т.п. Как он всех достал вопросами о том, как подогнать период, чтобы рассинхронизации не было … а она всё равно за час накапливалась. Пока он (на третьей неделе траха наших мозгов) не сказал какая у него задача. Тогда его просто обматерили и сказали – сделай детектор пиков сетевого напряжения и тактируй таймер от него! Таймер будет тикать строго в пики независимо от точности и стабильности частоты сети. Вот и всё - никакой рассинхронизации, всё работает идеально.
Это я к тому, что Вы лучше объясняйте задачу, а не Ваш метод решения. Возможно, Вам другой метод предложат.
Задача минимум. Необходимо выдержать заданный период времени. По окончании этого периода зафиксировать факт окончания периода. А по запросу через UART получать время в минутах и секундах до конца периода. Хотя с запросом через UART я справлюсь. А вот как перевести остаток времени в минуты и секунды - не соображу. И хрен с ними, с задержками в датчике.
___Чо?
Чисто интуитивно ![]()
Число секунд остатка=Остаток/1000; Минуты=Число секунд остатка/60; Секунды=Число секунд остатка%60;
Погрешность в пределах секунды.
…Хотя…, если Погрешность=Остаток%1000>500, то Число секунд остатка=Число секунд остатка+1;
Прежде чем что-то решать, это “что-то” нужно внятно сформулировать.
Может, и решать после этого будет нечего.
@Optron
Два момента:
-
если у вас что-то в коде занимает секунду - выдерживать 500мс интервалы будет НЕВОЗМОЖНО.
-
я вам уже давно писал, что библиотека для датчика у вас кривая. Задержка, равная статусу датчика - это полный бред.
Так что единственный вариант для вас - это взять другую библиотеку.
Вы не знаете, как из миллисекунд получить минуты и секунды?
Например, сегодня сорок восьмой день с момента запуска программы. Мне надо отметить недельный период, по истечению которого выдать какой-то сигнал. Беру millis(), вычисляю - каким он (она) должен (должна) быть через неделю и записываю это в переменную stop. Я не знаю как правильно найти разницу между stop и текущим millis(), так как момент stop наступит после переполнения.
Заведите переменную, значение которой увеличивайте каждую секунду.
Прочитай про unixtime. Это время выраженное одним числом и его легко сравнивать с необходимыми интервалами. Для unixtime есть процедуры преобразования в дни часы минуты секунды и обратно.
Заведите переменную, считающую число переполнений или купите модуль часов за 100 р.
Если длительность периода не превышает “времени переполнения” (недельный или месячный – пофиг), то всё делается точно так же, как с периодом в одну секунду - точно также, никакой разницы.
Причем это делается не так, как Вы сказали:
Никогда так не делайте. От слова “совсем никогда”. Никогда не складывайте текущее время с длительностью периода, чтобы получить время окончания. Так нельзя делать!
Пояснения для особых случаев
Для альтернативно-одарённых: “так нельзя делать”
Для просто тупых: “ТАК НЕЛЬЗЯ ДЕЛАТЬ НИКОГДА, НЕТ ИСКЛЮЧЕНИЙ”
См.
uint32_t diff = millis() - stop;
И пофигу на переполнение
В одном посте упомянуты альтернативная одаренность, простая тупизна, и Вечный Жид.
Похоже, самые спокойные из нас начинают теряться в этом мире, без ежедневного крапивного отвара внутривенно, и, особенно, без регулярного садо-мазо с уклоном в садо.
Может быть так?
uint32_t diff = stop - millis();
Извините за грубость - вы считаете себя умнее меня?
При чем здесь “умнее”?
Я сделал как Вы сказали. Там идет увеличение. А мне нужен остаток.
извинения ни к чему, потому что невозможно по-русски подобрать интонацию к вопросу про интеллект собеседника, чтобы он не был оскорбительным. Попробуйте у близкого человека спросить просто “ты умный?” - развлекуха на вечер гарантирована. Такой вот лингвистический казус.