можно ли заменить delay в функции void zero_cross_int()
- Войдите на сайт для отправки комментариев
Вс, 27/12/2020 - 23:58
1 int AC_LOAD =3; 2 volatile int dimming =128; 3 void setup() { 4 pinMode(AC_LOAD,OUTPUT); 5 attachInterrupt(0,zero_cross_int, RISING); 6 } 7 void zero_cross_int() 8 { 9 int dimtime = (75*dimming); 10 delayMicroseconds(dimtime); 11 digitalWrite(AC_LOAD, HIGH); 12 delayMicroseconds(20); 13 digitalWrite(AC_LOAD, LOW); 14 } 15 void loop() { 16 for (int i = 1; i <=128; i++) { 17 dimming=i; 18 delay(20); 19 } 20 for (int i = 128; i >=1; i--) { 21 dimming=i; 22 delay(20); 23 } 24 }
Для кого это месиво запостили?
навыков ещё мало в общении на форуме, пронумеровать не смог
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Написанное- малопредсказуемый бред
она работает, только не знаю как его сюда выложить
фото или видео
какими "другими командами" вы хотите это заменить. и. главное. зачем?
Обозначьте конечную цель этого действия
она работает, только не знаю как его сюда выложить
фото или видео
ни в коем случае не фото и не видео. вам в сообщении #4 дали ссылку на правильное выкладывание кода - читайте
Оно конечно как то даже работает, только вот совсем не так как задумано автором.
Потому как, к мнимому времени полуволны (delay(20)), прибавляется задержка внутри прерывания. И непредсказуемо количество итераций в цикле перебора for .
Тут правильнее сделать инкремент внутри прерывания.
Как бы в прерывании делей не работает. Только отдаёт последнее полученное перед прерыванием значение.
Как бы в прерывании делей не работает. Только отдаёт последнее полученное перед прерыванием значение.
Как бы delayMicroseconds() вполне себе работает
Серьёзно? Механизм можете объяснить? Как не выходя из прерывания попасть в другое? У ардуины нет приоритетных прерываний. Чтение регистра таймера при переходе через ноль может дать очень интересный результат.
Нету там никаких прерываний.
На микросеконд нет, но само значение корректируется в миллисекундных прерываниях, если их не будет, то микросеконд будут крутиться в объёме нулевого таймера с прыжками через 0. Если повезёт с начальным значение - будет нормальный интервал.
Серьёзно? Механизм можете объяснить? Как не выходя из прерывания попасть в другое?
delay() на миллисах с прерываниями, delayMicroseconds() раскладывается в nop-ы
Серьёзно? Механизм можете объяснить? Как не выходя из прерывания попасть в другое? У ардуины нет приоритетных прерываний. Чтение регистра таймера при переходе через ноль может дать очень интересный результат.
Ник182, ты с делей перепутал. ДелейМикросекондс к прерывниям не обращается.
Я стер, для читаемости все от частот кроме 16МГц
Спасибо! Я попутал делаумикросеконд с микросеконд. Если использовать микросеконд по принципу блинк без делэй то есть грабли.
__asm__ __volatile__ (
11
"1: sbiw %0,1"
"\n\t"
// 2 cycles
12
"brne 1b"
:
"=w"
(us) :
"0"
(us)
// 2 cycles
о чем написано в этих двух строках, где можно прочитать про эти обозначения ?
согласен,не так сформулировал задачу
этот код я сам не писал,скопировал и использовал под свои нужды
изменил код так
Попробуйте использовать волшебное сочетание Ctrl+T и увидите, что Ваши проверки miilis стоят внутри условий. Не знаю, так ли задумывалось, но думаю, что нет. Писали бы код сразу аккуратно, такого бы не было.
Проверки по-прежнему под условием из строки №12. Что они там делают? Вы читаете, что Вам пишут?
Смотря как написать. Вот Вы можете просто словами рассказать логику Вашего кода? Судя по всему - нет, потому что то, что Вы считаете правильным не лезет ни в какие ворота. Вот Вы пишете
Но это же не так! В смысле Ваши слова ни разу не соответствуют коду! Что значит "пока нажата кнопка через 2 секунды"? А если я нажал и через полсекунды отпустил, то что? Уже не надо ничего делать? А в Вашем коде почему-то делается! Вашему коду вообще плевать когда я отпускаю кнопку и отпускаю ли вообще.
А пока Вы не можете словами объяснить логику программы, Вы её не напишете, даже не пытайтесь. Невозможно написать "не знаю что".
У Вас же пока в голове нет никакой логики, а есть только не вполне осознанная идея, детализировать которую Вы не можете. А, как говорил граф Калиостро, «Материализация чувственных идей есть труднейшая задача научной магии» и Вам с этой задачей не справиться. Так что работайте сначала над формулированием чёткой логики процесса. И только потом пытайтесь программировать, но не раньше.
Вы меня не слышите. Пока Вы не сформулируете логику процесса словами, не лезьте ни в какие задержки и условия - не получится!
Ваш вопрос сейчас не "как", а "что" нужно делать. Пока не знаете "что", не нужно делать "никак".