Arduino прекъсва функция за забавяне

в следващия си проект използвам 4 светодиода със закъснение (10000). Имам нужда от функция за анулиране на този цикъл и започване отново с нова стойност на забавяне, напр. 100.

Активирах прекъсванията и когато натиснах бутон, забавянето се промени на 100 СЛЕД рунд. Трябва да изчакам 10 секунди.. Възможно ли е да рестартирам функцията за цикъл с новите стойности?


person colastar    schedule 28.10.2014    source източник
comment
Понякога отговорът е Не и сте объркали изпълнението. Опитайте отново, като този път посочите изискванията.   -  person Ignacio Vazquez-Abrams    schedule 28.10.2014


Отговори (1)


Леле, това беше грубо Игнасио Поне бъди полезен.

Можете да направите това, но не както сте въвели.

Закъснението не е добре да се използва при това обстоятелство. Много по-добър начин за внедряване е използването на цикъл while като този:

int delayLED = 10000;

int beginMillis = millis();

while( millis() - beginMillis < delayLED)
{
    // insert the code for your "interrupt" here
    // kinda like this
    if(button pressed)
    {
        delayLED = 100;
        break;
    }
}

Това е само шаблон, а не пълен отговор. Уведомете ме, ако имате допълнителни въпроси.

Приятно кодиране!

person djUniversal    schedule 28.10.2014
comment
И бих добавил: вижте примерите! Първият урок, който винаги се прави с arduino, е как да мига светодиод със закъснение, а вторият без. Преди да се опитвате да си губите времето, опитайте се да научите как работи нещо... - person frarugi87; 29.10.2014
comment
Не съм сигурен за кой пример говорите, но със сигурност самата функция за забавяне на уебсайта arduino.cc има добро описание, че не я използвате за код за синхронизиране. Мисля, че това е напълно валиден въпрос за някой нов в Arduino. Независимо дали го научават в примери (?), в документацията или като зададат въпрос на уебсайт като този. - person djUniversal; 29.10.2014
comment
Всъщност съм изправен пред същия проблем и се чудех дали няма друг начин? Това, което не ми харесва в това решение е, че ако прекъсването се извика след оценката на променливата на флага, тогава функцията ще изпълни това, което не искаме да бъде изпълнено. Между другото изглежда като един вид обединяване. Има ли начин действително да развием стека на функцията или просто да посочим друга адресна памет, когато сме в повикването за прекъсване? Искам да съм сигурен дали наистина е възможно и дали мога да счупя чипа си, правейки това? - person Mr Bonjour; 03.03.2015
comment
Без обединяване. Това се оценява постоянно въз основа на текущия Millis(). Не разбирам защо смятате, че това ще счупи чипа ви, така или иначе този вид оценка се случва постоянно. Причината, поради която беше написано по този начин, е, че OP искаше да прекъсне текущото време и незабавно да започне новото време. Тази функция прави това чрез зацикляне на всеки цикъл, така че ако новото време на забавяне е преминато, тя ще оцени незабавно и ще започне новото време. Какво точно се опитваш да направиш? - person djUniversal; 03.03.2015