Delay не работает в Wire.onReceive
- Войдите на сайт для отправки комментариев
Ср, 02/08/2017 - 11:55
Добрый день.
void setup()
{
Wire.begin(BLAH_BLAH);
Wire.onReceive(receiveEvent);
}
void receiveEvent(int count)
{
while (Wire.available() > 0)
{
for (int8_t i = 0; i < 10; i++)
{
do_something();
// delay игнорируется
delay(100);
}
}
}Delay в этой конструкции не работает. Причины - вполне понятны, ведь delay использует прерывания, но при выполнении внутри другого прерывания, он не будет работать.
Вопрос в том, что же делать? Как сделать задержку Wire.onReceive, либо как вывести исполнение этого прерывания в область обычных программ?
ну, в зависимости, что у тебя там функции возвражают или делают - в прерывании обновляй значение переменной и взводи флаг, затем в лупе по значению флага обрабатывай переменную или что там у тебя... циклы какие-то делай и сбрасывай флаг в 0.
Простые решения всегда самые гениальные.
Спасибо!
Причины - вполне понятны, ведь delay использует прерывание
Не использует.
Он использует micros, а тот не изменяется, если запрещены прерывания. Так что delay становится бесконечным
void delay(unsigned long ms) { uint32_t start = micros(); while (ms > 0) { yield(); while ( ms > 0 && (micros() - start) >= 1000) { ms--; start += 1000; } } }Так что delay становится бесконечным
О_О я теперь не усну.
Но по факту - бесконечным он не становится, а просто не работает.
Но по факту - бесконечным он не становится, а просто не работает.
Вам виднее :)
Но по факту - бесконечным он не становится, а просто не работает.
Вам виднее :)
неработает == бесконечность О_О