Пример распараллеливания

pupesk
Offline
Зарегистрирован: 28.06.2014

Здравствуйте. Имеется такая задача: во время выполнения цикла в лупе void loop(){  while(1) {} } (который выполняется постоянное безо всяких delay() ), сделать вывод lcd.print() раз в 10 секунд, не прерывая тот while и не снижая частоту его выполнения.

Подскажите пожалуйста, как это осуществить. Я погугли на эту тему и ничего не смог найти :(

Проверять millis() на прибавление 10секунд? но там же будет переполнение и...  ну это самый понятный вариант и в отсутствии других будет использован он.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

вам нужно переделать void loop(){  while(1) {} } на работу через прерывания, так как это не правильный подход. Если нужно задать частоту очень точно - нужно использовать синтезатор частот а не вложенные циклы. Вобщем у вас в любом случае раз в 10 секунд будет задержка на несколько милисекунд и частота изменится(один период вытянется). Если нужно отловить короткий импульс - надо использоват прерывание, но не циклы. Если нужно частоту то нужно использовать таймер и прерывание по таймеру.

pupesk
Offline
Зарегистрирован: 28.06.2014

Прерывания никак не удается осилить :(

Возможно я слишком утрировал в начале... в цикле while() происходит отлавливание запроса приходящего по http. Т.е. задержка даже в 100-250мс никак не скажется на работе.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Возьмите дуе, она может несколько циклов выполнять одновременно

inspiritus
Offline
Зарегистрирован: 17.12.2012

Давно использую http://blog.ksduino.org/post/42862084042/pseudo-multitasking-using-timer-in-arduino-sketch

работает под 328 процем без проблем. Очень удобно.

Задаете процессы и периоды их повторения. При выходе из каждого процесса можно изменить паузу до следующего вызова. Благодаря такой гибкости я например реализую длинный  программный шим для управления SSR-z . 

В примере вся программа сидит в процессах, в loop остается только перезапуск таймера и перезапуск ksd протокола, который сам по себе интересен, но здесь является оффтопиком. В конце подпроцессов виден вызов t.after(), в котором выставляется таймер до следующего вызова подпроцесса. 

После освоения этого метода, линейное программирование практически перестал применять.

 

pupesk
Offline
Зарегистрирован: 28.06.2014

JollyBiber due нету. покапуть не вариант же

inspiritus оч интересно! спасибо. попытаюсь вникнуть. мб повезет больше чем с прерываниями :)

inspiritus
Offline
Зарегистрирован: 17.12.2012

Это и есть прерывания ;)

там процессы запускаются по прерыванию от внутреннего таймера.

pupesk
Offline
Зарегистрирован: 28.06.2014

inspiritus пишет:

Это и есть прерывания ;)

там процессы запускаются по прерыванию от внутреннего таймера.

Я вот что-то опять окопался, закопался и подвис.

Суть KSduino в чем? Описаная функция - это же функция вот этого таймера

И если я правильно понял, то мой код будет иметь такой вид:

    #include "Timer.h"
     
    Timer t;
     
    void setup()
    {
      t.every(100, zahvat_mira);
      t.every(1000, dlyalcd);
    }
     
     
    void loop()
    {
      t.update();
    }
     
     
    void zahvat_mira()
    {
      vipolnenie(10 raz v 1 sec);
    }
    void dlyalcd()
    {
      vivesti_na_lcd(1 raz v sec);
    }

Насколько я прав? :)