Господа, может кто в курсе как можно простым способом в коде избавится от команды for , а то сильно жрет время в коде, работаю над сиреной, может кто сталкивался с подобной ситуацией, работаю пока по командам for - tone - delay
Код (Text): int i; byte forEnabled; void setup() { forEnabled = 1; } void loop() { if(i++ < 5 && forEnabled) { //тело фор }else { forEnabled = 0; } //other staff }
кстати, это навело меня на идею... как в ардуино получить InstructionPointer? Ардуинка не умеет делать многопоточные вычисления, но можно попытаться эмулировать...+ получить можно кучу псевдо-прерываний...
пишу код на охранную систему, смысл таков, при срабатывании определенных датчиков на выходе с процессора должо выходить кучу извещателей, например мигалка и сирена для начала, на мигалку без for и delay я код уже создал, теперь надо создать код на сирену, чтобы так же без задержек в работе кода работал, в общем я считаю что любая красивая программа должна работать на частоте процессора , и ни каких функций типа delay на нее не должны влиять, это в своем роде искуство, вот смотри , использую обычный ппростой код который сплош состоит из , delay? что в итоге получается, полная фигня, там не домигнула, там не допикала, бред!!! Надо сделать так что бы все устройства в гормонии работали и одни другим не мешали, а я сейчас говорю об устройствах выходного сигнала, но нен надо забывать об сигналах приходящих с разных датчиков!!! Вот как то так!
Я кажется понял о чем речь, хочешь эмулировать многопоточность, что бы во время пиканья она продолжала мониторить датчики?
НЕТ ВЫ МЕНЯ НЕМНОГО НЕ ПРАВИЛЬНО ПОНЯЛИ, или что то вроде того, смысл в том что процессор читает программу на огромной скорости, не мне вам это обяснять, можно написать кучу одноразовых программ и все они будут прекрасно работать, но когда пишиш огромный код с огромным количеством функцийй который должен читать полученную информацию, от большого количества датчиков, переваривать эту информацию и выдавать команды на разные устройства, и все это долно происходить в мгновения, то такая функция как delay или for все загубит!!!!
не надо мне датчики мониторить во время пикания, надо что бы код всей программы каким бы он большим не был летал на своих мегагерцах без помех!!!!!!!!!!!!!!!!!
я сделал первый шаг к этому, пока мигалку сделал без задержек в программе таких как delay, сейчас иду дальше!
а чем фор тебя так раздражает) фор состоит из 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;
Огромное спасибо за информацию!!!! Ладно пока не буду ни чего говорить, пока сам все не испробую на своей как говорится шкуре, спасибо за код!!! Поразмышляю, попробую совместить уже созданые кирпичики с теми которые вы посоветовали, ка что получится выложу на сайт!
а вообще изночально хотел обмануть этот простой код Код (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); } }
и совместить его с этим кодом при том что основная часть кода будет в последствии создана и будет работать без задержек по времени на такуя мелочь, вот второй код: Код (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);} }
ЭТИ КОДЫ ВСЕГОЛИШ ВСПОМОГАТЕЛЬНЫЕ, ХОТЕЛОСЬ БЫ ИХ СОВМЕСТИТЬ В ЕДИНОЕ ЦЕЛОЕ ТАКИМ ОБРАЗОМ ЧТО БЫ В БУДУЮЩЕМ НАПИСАНЫЙ ОСНОВНОЙ КОД НИ КАК НЕ ЗАЦИКЛИВАЛСЯ ПО СКОРОСТИ НА ВСПОМОГАТЕЛЬНЫХ!!!! ВОТ ЧТО Я ХОЧУ, И ПОЧМУ ПРОШУ СОВЕТА У ВАС!!!