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); не работает или серийное окно не отображается.
Извините, если это звучит глупо, поскольку я новичок в программировании.
2 ответа
Лучший ответ:
ISR просто не предназначены для такого злоупотребления.
Если вы хотите использовать функции уровня Arduino, у вас должны быть веские причины, по которым вам нужно смешивать их с кодом прямого доступа к оборудованию arv-gcc (или наоборот).
Если вы новичок в программировании и работе с Arduino, просто игнорируйте этот уровень (пока).
DDRB |= BV(PB5);
легче понять, если написать
pinMode(13,OUTPUT);
(или даже используйте LED_BUILTIN вместо 13)
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
- Быстрая загрузка (WS2812B) и неисправимая проблема
- Таймер глубокого сна esp8266 немного неточен?
- Частота дискретизации Arduino pro mini
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
пожалуйста, отформатируйте свой код .... вы не печатаете внутри ISR .... увеличивайте переменную и вместо этого установите вторую переменную флага ... проверьте наличие флага в цикле () и распечатайте, если флаг установлен, @jsotola
Спасибо за поддержку, @Hrishikesh Dixit
@jsotola, не могли бы вы просмотреть измененный код и поделиться своим предложением?, @Hrishikesh Dixit