TimerOne висит

Для следующей программы. Компилируется и запускается. Я запускаю последовательный монитор (показан следующий код), и он просит меня ввести частоту мигания. Это работает в настройках. Затем он входит в цикл и выводит на последовательный монитор скорость и запускает >Serial.println("the bl И он зависает! Я могу выйти из последовательного монитора и перезапустить его, и он делает то же самое. Таким образом, программа/скетч кажется работать нормально, но каким-то образом последовательная связь зависает? Другие пробовали это, и это работает для них? Используя Alien Aurora R5 под управлением Win10 64bit Home. Добавлены некоторые задержки после того, как другой человек попробовал это, и он завис на них, прежде чем добавить задержку, а затем побежал для них.Они используют 32-разрядную версию Win10, и при попытке на их 64-разрядном ноутбуке он зависает.

//Тестирование последовательного порта

#include <TimerOne.h>

int state = 0;
int value;
long int newtime;

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  digitalWrite(13, state);
  Serial.println("Enter the Blink Rate: ");
}

void loop() {
  if (Serial.available()) {
    value = Serial.parseInt();
    delay(100);
    Serial.print("the blink rate is: ");
    Serial.println(value);
    Serial.println("Enter a new blink rate: ");
    newtime = value * 1000000;
    Timer1.initialize(newtime);
    Timer1.attachInterrupt(blinkme);
    delay(500);
  }
}

void blinkme() {
  state = !state;
  digitalWrite(13, state);
  delay(100);
}

Последовательный монитор

, 👍0

Обсуждение

Зачем задержка (100);, когда вы уже инициализировали Timer1 с правильным временем мигания? Задержек в ISR следует избегать любой ценой., @Maximilian Gerhardt

Задержки были добавлены после попытки запустить его. Другой сообщил, что он завис для них, ПОКА они не добавили функцию задержки в конце цикла., @SamR

Никогда не используйте задержку в прерывании, @chrisl

Висит без всяких прерываний., @SamR

Измените int state = 0; на volatile int state = 0; и удалите *все* вызовы delay(). Перед Timer1.initialize(...) добавьте строку Serial.flush();. Это работает один раз, но не повторно?, @Maximilian Gerhardt

Если это так, то ISR приводит к сбою платы. digitalWrite() может отключить прерывания. Лучше использовать прямое управление портом. Замените вызов digitalWrite на DDRB ^= B00100000;, @Maximilian Gerhardt

Сделал первый комментарий и получил еще пару строк в мониторе, прежде чем он вернул 0 и завис. ДДРБ ^= B00100000; скомпилировал, но ничего не сделал., @SamR

Попробуйте использовать unsigned long в качестве типа как для value, так и для newtime (вместо int и long int). И используйте «1000000UL» вместо «1000000»., @Gerben

У вас есть что-нибудь, подключенное к D13, что может вызвать мгновенную ошибку, например, короткое замыкание? Если у вас подключен внешний светодиод, у вас также есть токоограничивающий резистор, верно?, @Maximilian Gerhardt

Без изменений... все еще висит, @SamR

Я пробовал это со светодиодом и токоограничивающим резистором на D13, и к D13 не было ничего подключено, кроме встроенного внутреннего светодиода., @SamR

Я пробовал несколько версий плат UNO и MEGA. Не думаю, что это связано с платой. Я также попробовал новую библиотеку TimerOne из GitHub с теми же результатами., @SamR

тестовое значение для 0 и не устанавливайте таймер с 0, @Juraj

Используйте «1000000L» вместо «1000000»., @Majenko

0 висит после 3-й строки на мониторе так что очень не нравится 0 для ввода., @SamR

Нет радости с 1000000 литров, @SamR


2 ответа


3

Если вы введете 1 в Serial Monitor и у вас будут выбраны концы строк, Serial Monitor отправит "1\r\n". parseInt() считывает 1, а в следующем цикле \r или \n доступны и анализируются как 0. Затем вы устанавливаете таймер на 0. Серийный номер не может закончить печать, потому что таймер срабатывает без паузы.

,

БИНГО! Поменял монитор на без конца строки и теперь работает нормально! Спасибо!, @SamR

@SamR, прими его ответ, чтобы отметить его решенным, @Juraj

@SamR, Изменил монитор на отсутствие конца строки ... это не способ исправить проблему ... вместо этого вставьте код, который предотвращает нулевое значение newtime, @jsotola


0

Замените io 13 на (предложение) 10 и подключите светодиод + 1k резистор к io 10. 13, кажется, используется. Также нет конца строки в Serial.

,