Delay не работает в Wire.onReceive

Иванов Сергей
Offline
Зарегистрирован: 02.08.2017

Добрый день.

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, либо как вывести исполнение этого прерывания в область обычных программ?

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

ну, в зависимости, что у тебя там функции возвражают или делают - в прерывании обновляй значение переменной и взводи флаг, затем в лупе по значению флага обрабатывай переменную или что там у тебя... циклы какие-то делай и сбрасывай флаг в 0.

Иванов Сергей
Offline
Зарегистрирован: 02.08.2017

Простые решения всегда самые гениальные.

Спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Иванов Сергей пишет:

Причины - вполне понятны, ведь 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;
		}
	}
}

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

ЕвгенийП пишет:

Так что delay  становится бесконечным

О_О я теперь не усну.

Иванов Сергей
Offline
Зарегистрирован: 02.08.2017

ЕвгенийП пишет:
Так что delay  становится бесконечным

Но по факту - бесконечным он не становится, а просто не работает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Иванов Сергей пишет:

Но по факту - бесконечным он не становится, а просто не работает.

Вам виднее :)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

ЕвгенийП пишет:

Иванов Сергей пишет:

Но по факту - бесконечным он не становится, а просто не работает.

Вам виднее :)

неработает == бесконечность О_О