Serial.println() не работает в ISR

Пожалуйста, обратитесь к моему коду ниже,

const int led_pin = PB5;
const uint16_t t1_load = 0;
const uint16_t t1_comp = 43750;
int blinkcount;



void setup() {
  // поместите сюда код установки для однократного запуска:
  DDRB |= (1<< led_pin);
  TCCR1A = 0;
  //TCCR1B = 0X03;
 TCCR1B |= (1 << CS12);
 TCCR1B &= ~(1 << CS11);
 TCCR1B &= ~(1 << CS10);

  TCNT1 = t1_load;
  OCR1A = t1_comp;

  TIMSK1 = (1 << OCIE1A);
  Serial.begin(9600);
  sei();


}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:
  delay(500);


}

ISR(TIMER1_COMPA_vect) {
  TCNT1 = t1_load;
  PORTB ^= (1 << led_pin);
  blinkcount = blinkcount + 1;
  Serial.println(blinkcount);
}

Serial.println(blinkcount); не работает или серийное окно не отображается.

Извините, если это звучит глупо, поскольку я новичок в программировании.

, 👍0

Обсуждение

пожалуйста, отформатируйте свой код .... вы не печатаете внутри ISR .... увеличивайте переменную и вместо этого установите вторую переменную флага ... проверьте наличие флага в цикле () и распечатайте, если флаг установлен, @jsotola

Спасибо за поддержку, @Hrishikesh Dixit

@jsotola, не могли бы вы просмотреть измененный код и поделиться своим предложением?, @Hrishikesh Dixit


2 ответа


Лучший ответ:

0

ISR просто не предназначены для такого злоупотребления.

Если вы хотите использовать функции уровня Arduino, у вас должны быть веские причины, по которым вам нужно смешивать их с кодом прямого доступа к оборудованию arv-gcc (или наоборот).

Если вы новичок в программировании и работе с Arduino, просто игнорируйте этот уровень (пока).

DDRB |= BV(PB5); легче понять, если написать

pinMode(13,OUTPUT); (или даже используйте LED_BUILTIN вместо 13)

,

0
const uint16_t t1_load = 0;
const uint16_t t1_comp = 43750;
int blinkcount;
int flag, flag_1, a, i;



void setup() {
  // поместите сюда код установки для однократного запуска:
  DDRB |= (1<< led_pin);
  TCCR1A = 0;
  //TCCR1B = 0X03;
 TCCR1B |= (1 << CS12);  //для 256 предскаляров
 TCCR1B &= ~(1 << CS11);
 TCCR1B &= ~(1 << CS10);

/* TCCR1B &= ~ (1 << CS12);
 TCCR1B |= (1 << CS11);
 TCCR1B &= ~(1 << CS10);*/

  TCNT1 = t1_load;
  OCR1A = t1_comp;

  TIMSK1 = (1 << OCIE1A);
  Serial.begin(9600);
  sei();


}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:
  delay(500);

/*  blinkcount = blinkcount + 1;
  if(blinkcount++)
  {
    flag = 1;
  }
  if(flag == 1)
  {
    Serial.println("ok");
  }*/


}

void loop_1()
{
  i = blinkcount;
  //for(i=0; i<=blinkcount; i++);
  //{
  i = i + 1;
  //если(я++)
  // {
    flag = 1;
    flag_1 = flag;
   //}
  if(flag_1 == 1)
  {
    Serial.println(flag_1);
  }
// }
}

ISR(TIMER1_COMPA_vect) {
  TCNT1 = t1_load;
  PORTB ^= (1 << led_pin);
  //счетчик миганий = счетчик миганий + 1;
  //Serial.println(blinkcount);
  loop_1();


}```

I've changed the code according to your suggestion, the tx led on arduino blinks but serial monitor does not pop up

,

loop_1 (логически) все еще является частью ISR. **Serial.println() не работает в ISR** — это факт, а не вопрос. Не используйте ISR, если вам это не нужно ИЛИ вы не понимаете. В вашем случае применимы оба условия. Извини., @DataFiddler