MsTimer - две штуки?
- Войдите на сайт для отправки комментариев
Пт, 20/09/2013 - 07:33
Товарищи,
прочитав информацию про millis, про прерывания внешние, про simple timer - это все не то.
Необходимо организовать два внутренних прерывания с разными временными интервалами.
Проовал внутри одного прерывания подсчитывать количество вызовов и тем самым запускать более длинное прерывание - работает, но не стабильно. Циклит.
Есть ли возможность MsTimer::set назначить каким либо образом два раза? соответственно для азных подпрогамм и с разными интервалами вызова?
Да, и еще один момент - первый таймер используется для динамической индикации, а второй для подсчета внешних импульсов в заданный интервал, соответственно во втором программном прерывании включается и выключается аппаратное прерывание "1".
Ну во первых можно поискать плату где есть несколько аппаратных таймеров. Во вторых никто не мешает мешает использовать аппаратный для подсчета, а индикацию через millis/simpleTimer (обычно так и делается).
>прочитав информацию про millis, про прерывания внешние, про simple timer - это все не то.
Ну и чем именно "это не то"? Обычно так и и делают. Внешним прирыванием считают количество импульсов, а в Loop() выводять обнуляют.
Вообщем похоже, что вы "просто не умеете их готовить".
Да и чисто на millis/simple сделать два с разными интервалами, не проблема.
>работает, но не стабильно. Циклит.
Циклит - это 95% признак ошибки логики автора.
По коду выше... а к чему он был вообще? Если он у вас работает, то "что еще нужно?". Если не работает, то... это какой-то ошметок по которому ничего сказать не возможно. Так как минимум половину важного вы оставили "за кадром". Да банально... в чем проблема-то так и не сказали.
Плата Mega2560.
Проблема в том что если в коде loop встретится задержка, которая больше чем интервал динамической индикации (например delay для считывания показаний датчика или еще что-то) то millis не поможет и индикация работать не будет.
Код который я привел - работает! Но иногда непонятным образом случайно включает прерывание "1". Код простой и как отловить причину ошибки непонятно.
Плата Mega2560.
Проблема в том что если в коде loop встретится задержка, которая больше чем интервал динамической индикации (например delay для считывания показаний датчика или еще что-то) то millis не поможет и индикация работать не будет.
А в чем проблемма не использовать delay() для считывания показаний датчика? Вообщем-то delay() - это только для примеров/тестов на пару строчек. Любой серьезный проект подразумевает что блокирующими функциями пользоватся нельзя (delay() - одна из них). Так чтов любом случае отвыкайте от использования delay(). Только millis() . Код получается, конечно не такой красивый, но... за все нужно платить.
А если будет нужно 10-ть интервалов разных, то что 10-ть прерываний искать?
Код который я привел - работает! Но иногда непонятным образом случайно включает прерывание "1".
Это что-то из серии "чуть-чуть беременна"?
Код простой и как отловить причину ошибки непонятно.
Да неверное вам и не очень нужно ее отловить.
Вообще изначально был вопрос - можно ли инициализировать два и более типа MsTimer.
Попробовал динамическую индикацию в цикле LOOP - очень плохо, цифры мерцают.
Получается цикл loop медленнее 50 Гц ориентировочно?
Вообще изначально был вопрос - можно ли инициализировать два и более типа MsTimer.
Ну не знаю. Вот я набрал в гугле слово MsTimer, первой ссылокой Arduino Playground - Timer1
Там же и про Timer2, внизу ссылки на скетчи про LEDMatrix, ReadReceiver и т.п.
Вы пытались что-то найти сами?
Попробовал динамическую индикацию в цикле LOOP - очень плохо, цифры мерцают.
Либо плохо пробовали, либо пытаетесь их камня получить то что не может.
Если вы думаете что "таймеры" дадут вам одновременность и скорость - зря надеетесь. Паралельных потоков тут небыло и не будет. Так что два таймера вы может и запустите, но пока не разберетесь с логикой, что-бы она "не зацикливалась", небыло больших по времени кусков скетча - все равно ничего не получится. Хоть с таймерами, хоть без. С таймерами даже сложней может быть. В таймерах/прерываниях еще жоще нужно следить за тем, что-бы время обработчика было как можно меньше. Плюс еще куча ограничений на то чего нельзя делать в обработчике.
Получается цикл loop медленнее 50 Гц ориентировочно?
А кто же кроме вас может это знать?