MsTimer - две штуки?

Rednaxela
Offline
Зарегистрирован: 26.08.2013

Товарищи,

прочитав информацию про millis, про прерывания внешние, про simple timer  - это все не то.

Необходимо организовать два внутренних прерывания с разными временными интервалами.

Проовал внутри одного прерывания подсчитывать количество вызовов и тем самым запускать более длинное прерывание - работает, но не стабильно. Циклит.

Есть ли возможность MsTimer::set  назначить каким либо образом два раза? соответственно для азных подпрогамм и с разными интервалами вызова?

 

 

 

Rednaxela
Offline
Зарегистрирован: 26.08.2013

Да, и еще один момент - первый таймер используется для динамической индикации, а второй для подсчета внешних импульсов в заданный интервал, соответственно во втором программном прерывании включается и выключается аппаратное прерывание "1".

void setup() {
 MsTimer2::set(20, flash);
 MsTimer2::start();
}

void int1() {
 imp++;
}

void flash() {
 if ( interv == 0 )     
  attachInterrupt(1,int1,RISING);
 interv++;
 if ( interv >= 100 ) { 
  detachInterrupt(1); 
  interv = 0; 
  j = imp;  
  imp = 0;
 }
 //отображение накопленного за период значения imp в переменную j
 //далее динамическая индикация
 //...
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

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

>прочитав информацию про millis, про прерывания внешние, про simple timer  - это все не то.

Ну и чем именно "это не то"? Обычно так и и делают. Внешним прирыванием считают количество импульсов, а в Loop() выводять обнуляют.

Вообщем похоже, что вы "просто не умеете их готовить".

Да и чисто на millis/simple сделать два с разными интервалами,  не проблема.

>работает, но не стабильно. Циклит.

Циклит - это 95% признак ошибки логики автора.

 

По коду выше... а к чему он был вообще? Если он у вас работает, то "что еще нужно?". Если не работает, то...  это какой-то ошметок по которому ничего сказать не возможно. Так как минимум половину важного вы оставили "за кадром". Да банально... в чем проблема-то так и не сказали.

Rednaxela
Offline
Зарегистрирован: 26.08.2013

Плата Mega2560.

Проблема в том что если в коде loop встретится задержка, которая больше чем интервал динамической индикации (например delay для считывания показаний датчика или еще что-то) то millis не поможет и индикация работать не будет.

Код который я привел - работает! Но иногда непонятным образом случайно включает прерывание "1". Код простой и как отловить причину ошибки непонятно.

leshak
Offline
Зарегистрирован: 29.09.2011

Rednaxela пишет:

Плата Mega2560.

Проблема в том что если в коде loop встретится задержка, которая больше чем интервал динамической индикации (например delay для считывания показаний датчика или еще что-то) то millis не поможет и индикация работать не будет.

А в чем проблемма не использовать delay() для считывания показаний датчика? Вообщем-то delay() - это только для примеров/тестов на пару строчек. Любой серьезный проект подразумевает что блокирующими функциями пользоватся нельзя (delay() - одна из них). Так чтов  любом случае отвыкайте от использования delay(). Только millis() . Код получается, конечно не такой красивый, но... за все нужно платить.

А если будет нужно 10-ть интервалов разных, то что 10-ть прерываний искать?

Rednaxela пишет:

Код который я привел - работает! Но иногда непонятным образом случайно включает прерывание "1".

Это что-то из серии "чуть-чуть беременна"?

Rednaxela пишет:

Код простой и как отловить причину ошибки непонятно.

Да неверное вам и не очень нужно ее отловить.

Rednaxela
Offline
Зарегистрирован: 26.08.2013

Вообще изначально был вопрос - можно ли инициализировать два и более типа MsTimer.

Попробовал динамическую индикацию в цикле LOOP - очень плохо, цифры мерцают.

Получается цикл loop медленнее 50 Гц ориентировочно?

leshak
Offline
Зарегистрирован: 29.09.2011

Rednaxela пишет:

Вообще изначально был вопрос - можно ли инициализировать два и более типа MsTimer.

Ну не знаю. Вот я набрал в гугле слово MsTimer, первой ссылокой Arduino Playground - Timer1

Там же и про Timer2, внизу ссылки на скетчи про LEDMatrix, ReadReceiver и т.п. 

Вы пытались что-то найти сами?

Rednaxela пишет:

Попробовал динамическую индикацию в цикле LOOP - очень плохо, цифры мерцают.

Либо плохо пробовали, либо пытаетесь их камня получить то что не может.

Если вы думаете что "таймеры" дадут вам одновременность и скорость - зря надеетесь. Паралельных потоков тут небыло и не будет. Так что два таймера вы может и запустите, но пока не разберетесь с логикой, что-бы она "не зацикливалась", небыло больших по времени кусков скетча - все равно ничего не получится. Хоть с таймерами, хоть без. С таймерами даже сложней может быть. В таймерах/прерываниях еще жоще нужно следить за тем, что-бы время обработчика было как можно меньше. Плюс еще куча ограничений на то чего нельзя делать в обработчике.

Rednaxela пишет:

Получается цикл loop медленнее 50 Гц ориентировочно?

А кто же кроме вас может это знать?