TimerOne и последовательные библиотеки

Я работаю с библиотекой TimerOne, код показан ниже:

#include <TimerOne.h>

void setup() {
    Serial.begin(9600);
    pinMode(13, OUTPUT);    
    Serial.println();
    Timer1.initialize(1000000); // set a timer of length 1000000 microseconds
    Timer1.attachInterrupt(timerIsr); // attach the service routine here
}

void loop() {
    Serial.println(millis());
}

void timerIsr() {
    Serial.print("FROM Time1: ");
    Serial.println(millis());
}

Проблема в том, что после некоторых циклов (когда millis из loop() возвращает 930), ардуино останавливается.

Я думаю, что проблема в том, что когда Arduino запускает цикл и записывает в последовательный порт, процедура ISR тоже пишет. Как я могу решить эту проблему?

Я пытаюсь изменить:

Serial.print("FROM Time1: ");
Serial.println(millis());

by:

digitalWrite(13, !digitalRead(13));

И работает нормально, я думаю, что у библиотеки Serial arduino есть некоторые проблемы при использовании прерываний, это возможно?

Есть любой способ заблокировать Arduino в каком-то блоке кода, я пытаюсь использовать atomic и не сработало.

Я использую Arduino UNO (ATmega328)


person wellfer123    schedule 11.08.2013    source источник


Ответы (2)


Первая проблема заключается в том, что ваш ISR (процедура обслуживания прерываний) НЕ ДОЛЖЕН выполнять какие-либо операции ввода-вывода. Вместо этого напишите что-нибудь вроде:

int timedone;

setup() {
   // etc.
   timedone = 0;
}

loop() {
   if (timedone == 1)
   {
    Serial.print("FROM Time1: ");
    Serial.println(millis());
   }
}

void timerISR() {timedone = 1;}

Вместо того, что у вас есть:

void timerIsr() {
    Serial.print("FROM Time1: ");
    Serial.println(millis());
}

Надеюсь это поможет.

person JackCColeman    schedule 11.08.2013

Я потратил много времени на открытие.

Просто

Serial.flush();

:/

person wellfer123    schedule 12.08.2013
comment
по-видимому, было две проблемы: выдача ввода-вывода из ISR и отсутствие сброса последовательного буфера? Буфер автоматически сбрасывается при заполнении. - person JackCColeman; 12.08.2013
comment
Да, но я не знаю почему, но когда я очищаю последовательный буфер в ISR, Loop() работает нормально :D - person wellfer123; 12.08.2013
comment
попробуйте сбросить только в цикле(), а НЕ в ISR. В соответствии с хорошей практикой программирования ISR НЕ должен выполнять ввод-вывод (printf и т. д.), в конечном итоге ваш код будет достаточно сложным, и вы столкнетесь с проблемами ввода-вывода из ISR. - person JackCColeman; 12.08.2013
comment
Спасибо за совет :D - person wellfer123; 12.08.2013