Вычесть из меньшего большее или как обрабатывать warp таймеров
- Войдите на сайт для отправки комментариев
Доброго времени суток, уважаемые.
Есть переменная таймера, которой мы присваиваем текущее значения счетчика времени в mills() или
timer=mills();
Предположим для простоты, что это 16-битовый счетчик и на момент присвоения там было 0xFFAE. Прошло время, и значение счетчика перевалило за максимум и стало 0x0015, когда мы в программе стали выяснять, а не прошел ли нужный нам интервал путем:
if (mills()-timer>100) и тут нас ждет засада с правильным вычислением прошедшего времени.
Я уверен, что эта ситуация уже как-то решалась, но не могу представить как правильно ее искать. Да даже посчитать, чтобы алгоритм действий составить никак, ибо все калькуляторы охотно вычисляют отрицательные числа, что никак не отражает нужную действительность.
Помогите, а, кто чем может?
А давайте почитаем, что millis() это unsignet long с 32-мя битами.
Ну а если Вы такой терпеливый, что дождетесь переполнения, то никто Вам не мешает проверить, что было переполнение.
Хотя, если переполнение было несколько раз...тогда Вы воистину терпеливый и программируйте на PIC - там можно тактовую частоту 36кГц задать.
Или проверяйте на переполнение или модуль реального времени воткните. Да вариантов туева хуча - от задачи зависит
операция вычитания нечувствительна к переполнению в любом контроллере. просто проверь и не трать время на диспуты. тут уже стопицот тем было. поищи "великое переполнение millis()"
//Ну а если Вы такой терпеливый,
а если не терпиливый, но хотябы не конченый олигофрен (в чем лично я сомниваюсь т.к. это много раз обсуждалось на форуме и не найти это могут токо лауреаты конкурса по минимуму IQ) то хотяб сделайте так.
И переполнения будут раза 4 в секунду. О каждом таком "ждет засада с правильным вычислением" информирует мигание ТХ. А на светодиоде 13 будет мигание заданного периода. Найди сбой! Твои мозги мы уже проверили, их суко не обнаружено. Теперь глаза проверим , узри сбои при переполнении.
Делись впечатлениями, классно быть дебилом? Ты на форуме с 14-го года и так нихера не понял. Значить и не поймешь уже. Вали нахер, это не твое.
В сотый раз подымать тему с видом "а мужики же и не знают!" Писец. Ты осознаешь что если дальше таких тупарей, как ты, будет как сейчас, то форум можно закрывать, он будет интересен токо таким как ты беспросветным.
ПС. Предлагаю с каждого свежего брать расписку что тему про переполнение миллиса он здесь никогда не создаст.
бить нельзя их, а не вникнут - абиснять. (с)
бить низзя абиснять
Не оскорбляйте религиозные чувства ТС! :)
if (mills()-timer>100) и тут нас ждет засада с правильным вычислением прошедшего времени
Точно? А стандарт языка привести можешь?
Точно? А стандарт языка привести можешь?
Зачем? Так написано в уроках у самого гивера! Также переполнение специальным образом обрабатывается в FLProg. А это такие профи, которым мы - сирые и убогие, ... ну, ты понял.
Спасибо, уважаемый, за направление поиска, все нашел. Я сомневался с беззнаковым вычислением разницы, но камрады тут успокоили. if( current - last > interval) будет работать полюбому
В FLProg вобще забористо
хотя и гувер не отстает, у него с циклом!