Почему этот код таймера не работает?

Почему приведенный ниже код не работает? Таймер отсчитывает 370 мс, затем функция вызывается для включения светодиода. Снова 370 мс, затем функция вызывается для выключения светодиода. В основном функция переключения.

int IN0 = 12;
int IN1 = 11;
int OUT1 = 10;
int OUT2 = 9;
int OUT3 = 7;
int OUT4 = 6;
int LED = 13;
unsigned int count = 370;
unsigned int tcount = 0;
bool tflag = 0, mflag = 0, sflag = 0, lflag = 0, rflag = 0;
int a, b;

void setup() {
  pinMode(IN0, INPUT);
  pinMode(IN1, INPUT);
  pinMode(LED, OUTPUT);
  pinMode(OUT1, OUTPUT);
  pinMode(OUT2, OUTPUT);
  pinMode(OUT3, OUTPUT);
  pinMode(OUT4, OUTPUT);
  Timer1.initialize(a); // 370 миллисекунд вовремя
  //Timer1.attachInterrupt(flash);
}

void flash_on() {
  // цифровая запись (светодиод, ! цифровое чтение (светодиод));
  digitalWrite(LED, HIGH);
}

void flash_off() {
  // цифровая запись (светодиод, ! цифровое чтение (светодиод));
  digitalWrite(LED, LOW);
}

void loop() {
  Timer1.attachInterrupt(flash_on);
  a = count;
  Timer1.attachInterrupt(flash_off);
  a = count;
}

, 👍-1

Обсуждение

В какой момент вы даете таймеру новое значение, которое вы указали в «а»? Никогда., @Majenko


1 ответ


1

Перед вызовом Timer1.initialize(a) необходимо указать значение a.

Например, вот так:

void setup() {
  ....
  a = count;
  Timer1.initialize(a); // 370 миллисекунд вовремя
  ....
}

Ваш код loop() также не будет работать так, как вы ожидаете. Как бы то ни было, вы будете переключаться между двумя разными ISR очень быстро, не имея никакого контроля над тем, какой из двух будет вызываться при возникновении прерывания Timer1.

Лучше придерживаться одного ISR, который переключает светодиод. В этом смысл прерывания по таймеру.

,

Здесь, в loop() я вызвал flash_on(), причина в том, что я должен проверить другой параметр путем опроса. Просто переключившись, на мой взгляд, я не могу этого сделать. Если есть какой-либо способ переключения, прошу вас помочь мне с тем же., @Hrishikesh Dixit