Избавление от команды for

Тема в разделе "Arduino & Shields", создана пользователем grx1a, 14 май 2013.

  1. grx1a

    grx1a Гик

    Господа, может кто в курсе как можно простым способом в коде избавится от команды for , а то сильно жрет время в коде, работаю над сиреной, может кто сталкивался с подобной ситуацией, работаю пока по командам for - tone - delay
     
  2. grx1a

    grx1a Гик

    заранее спасибо!!!
     
  3. Mitrandir

    Mitrandir Гуру

    Код (Text):
    int i;
    byte forEnabled;
    void setup()
    {
      forEnabled = 1;
    }
     
    void loop()
    {
     
    if(i++ < 5 && forEnabled)
    {
    //тело фор
    }else
    {
      forEnabled = 0;
     
    }
    //other staff
    }
     
    grx1a нравится это.
  4. Mitrandir

    Mitrandir Гуру

    в смысле жрет время? ты про время на переход на следующую итерацию?
     
  5. grx1a

    grx1a Гик

    Спасибо огромное за наводку, попробую предложенный вами вариант!!!!!
     
  6. Mitrandir

    Mitrandir Гуру

    кстати, это навело меня на идею... как в ардуино получить InstructionPointer?
    Ардуинка не умеет делать многопоточные вычисления, но можно попытаться эмулировать...+ получить можно кучу псевдо-прерываний...
     
  7. grx1a

    grx1a Гик

    пишу код на охранную систему, смысл таков, при срабатывании определенных датчиков на выходе с процессора должо выходить кучу извещателей, например мигалка и сирена для начала, на мигалку без for и delay я код уже создал, теперь надо создать код на сирену, чтобы так же без задержек в работе кода работал, в общем я считаю что любая красивая программа должна работать на частоте процессора , и ни каких функций типа delay на нее не должны влиять, это в своем роде искуство, вот смотри , использую обычный ппростой код который сплош состоит из , delay? что в итоге получается, полная фигня, там не домигнула, там не допикала, бред!!! Надо сделать так что бы все устройства в гормонии работали и одни другим не мешали, а я сейчас говорю об устройствах выходного сигнала, но нен надо забывать об сигналах приходящих с разных датчиков!!! Вот как то так!
     
  8. Mitrandir

    Mitrandir Гуру

    Я кажется понял о чем речь, хочешь эмулировать многопоточность, что бы во время пиканья она продолжала мониторить датчики?
     
    grx1a нравится это.
  9. grx1a

    grx1a Гик

    НЕТ ВЫ МЕНЯ НЕМНОГО НЕ ПРАВИЛЬНО ПОНЯЛИ, или что то вроде того, смысл в том что процессор читает программу на огромной скорости, не мне вам это обяснять, можно написать кучу одноразовых программ и все они будут прекрасно работать, но когда пишиш огромный код с огромным количеством функцийй который должен читать полученную информацию, от большого количества датчиков, переваривать эту информацию и выдавать команды на разные устройства, и все это долно происходить в мгновения, то такая функция как delay или for все загубит!!!!
     
  10. grx1a

    grx1a Гик

    не надо мне датчики мониторить во время пикания, надо что бы код всей программы каким бы он большим не был летал на своих мегагерцах без помех!!!!!!!!!!!!!!!!!
     
  11. grx1a

    grx1a Гик

    я сделал первый шаг к этому, пока мигалку сделал без задержек в программе таких как delay, сейчас иду дальше!
     
  12. Mitrandir

    Mitrandir Гуру

    а чем фор тебя так раздражает)

    фор состоит из
    1 операция на задание начального условия
    1 операция сравнения на конец
    1 операция инкрементации счетчика
    1 goto в начало тела

    Код (Text):
    for(int i = 0; i<10;i++)
    {
    println(i);
    }
    эквивалентно:
    Код (Text):
    int i =0;
    a:;
    println(i);
    if(i < 5) goto a;
     
    grx1a нравится это.
  13. grx1a

    grx1a Гик

    вот и спросил у опытных людей как обмануть прграмму таким образом что бы избавится от команды for
     
  14. grx1a

    grx1a Гик

    Огромное спасибо за информацию!!!! Ладно пока не буду ни чего говорить, пока сам все не испробую на своей как говорится шкуре, спасибо за код!!! Поразмышляю, попробую совместить уже созданые кирпичики с теми которые вы посоветовали, ка что получится выложу на сайт!
     
  15. grx1a

    grx1a Гик

    а вообще изночально хотел обмануть этот простой код
    Код (Text):
    #define soundPin 12
    int freq =0;
    float wait =0.5;
    int time =5;

    void setup()
    {
      pinMode(soundPin,OUTPUT);
    }

    void loop()

    {
      for (freq = 30; freq < 500; freq++)
         {
           tone(soundPin, freq ); // Beep pin, freq, time
           delay(wait);
         }
      for (freq = 500; freq > 30; freq--)
         {
           tone(soundPin, freq ); // Beep pin, freq, time
           delay(wait);
         }
    }
     
  16. grx1a

    grx1a Гик

    и совместить его с этим кодом при том что основная часть кода будет в последствии создана и будет работать без задержек по времени на такуя мелочь, вот второй код:
    Код (Text):

    /*
    Код для двуцветной LED мигалки  с широтно импульсной модуляцией (ШИМ=PWM)
    БЕЗ ИСПОЛЬЗОВАНИЯ ФУНКЦИИ    delay!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    */

    #define ledPin1   5           // PIN СИНИЙ LED      
    #define ledPin2   4           // PIN КРАСНЫЙ LED
    #define pot1 1                 // PIN ПОТЕНЦЕОМЕТРА ДЛИННЫ ВСПЫШКИ
    #define pot2 2                 // PIN ПОТЕНЦЕОМЕТРА ДЛИННЫ ЦИКЛА

    boolean BlinkPeriod = 0;         // Триггер периода вспышки за цикл
    boolean OFF_LED_Period = 0;   // Триггер периода запрета вспышки за цикл
    int pos = 1;                     // Переменная смены цвета и количеста вспышек (счетчик)   
    long t1;                         // Время вспышки  (длинна вспышки)
    long t2;                         // Время  цикла
    long time;
    int count;                     // Счетчик импульсов

    void setup()
    {  
      pinMode(ledPin1, OUTPUT);  
      pinMode(ledPin2, OUTPUT);  
    }  

    void loop()  
    { int potpos1=analogRead(pot1);
      int potpos2=analogRead(pot2);
      t1 = map(potpos1,0,1023,0,300);
      t2 = map(potpos2,0,1023,0,300);
     
     
      //ГЕНЕРАТОР ПРЯМОУГОЛЬНЫХ ИМПУЛЬСОВ С ПЕРЕМЕННОЙ СКВАЖНОСТЬЮ
      if((BlinkPeriod==0)&&(OFF_LED_Period==0))
        {
          time=millis();
          BlinkPeriod=1;
          count++;                                  // Счетчик импульсов вспышки
              if (count>5) count=1;                // 6 - позиций счетчика
          OFF_LED_Period=0;
        }
      if( BlinkPeriod && (millis() - time) > t1)      //Время Вспышки
        {
           BlinkPeriod = 0;
           OFF_LED_Period=1;
        }
      if(OFF_LED_Period && (millis() - time) > t2)  //Время Цикла
        {
           OFF_LED_Period=0;
        }

      //ОПРЕДЕЛЕНИЕ МИГАЮЩЕГО LED (КРАСНЫЙ - СИНИЙ)
      if((count==1)||(count==2))    // ДВЕ ВСПЫШКИ
       {pos = 1;}                  // КРАСНЫЙ LED
      if(count==3)                // ПАУЗА МЕЖДУ СМЕНОЙ ЦВЕТА
       {pos = 2;}                  // Одна позиция счетчика на паузу
      if((count==4)||(count==5))    // ДВЕ ВСПЫШКИ
       {pos = 3;}                  // СИНИЙ LED

      //ВЫХОДНОЙ СИГНАЛ
      if ((BlinkPeriod==1)&&(pos==1))  // Мигает КРАСНЫЙ LED
      {digitalWrite(ledPin1,HIGH);}
      else
      {digitalWrite(ledPin1,LOW);}

      if((BlinkPeriod==1)&&(pos==3))   // Мигает СИНИЙ LED
      {digitalWrite (ledPin2,HIGH);}
      else
      {digitalWrite (ledPin2,LOW);}

    }
     
  17. grx1a

    grx1a Гик

    ЭТИ КОДЫ ВСЕГОЛИШ ВСПОМОГАТЕЛЬНЫЕ, ХОТЕЛОСЬ БЫ ИХ СОВМЕСТИТЬ В ЕДИНОЕ ЦЕЛОЕ ТАКИМ ОБРАЗОМ ЧТО БЫ В БУДУЮЩЕМ НАПИСАНЫЙ ОСНОВНОЙ КОД НИ КАК НЕ ЗАЦИКЛИВАЛСЯ ПО СКОРОСТИ НА ВСПОМОГАТЕЛЬНЫХ!!!! ВОТ ЧТО Я ХОЧУ, И ПОЧМУ ПРОШУ СОВЕТА У ВАС!!!
     
  18. grx1a

    grx1a Гик

    как то так!
     
  19. grx1a

    grx1a Гик

    Что скажете по этому поводу? Это возможно? или не реально? Скажите пожалуста!
     
  20. grx1a

    grx1a Гик

    ЗАРАНЕЕ СПАСИБО!!!!!!!!!!!!!!!!!!!!