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);
}
@SamR, 👍0
Обсуждение2 ответа
Если вы введете 1 в Serial Monitor и у вас будут выбраны концы строк, Serial Monitor отправит "1\r\n". parseInt() считывает 1, а в следующем цикле \r или \n доступны и анализируются как 0. Затем вы устанавливаете таймер на 0. Серийный номер не может закончить печать, потому что таймер срабатывает без паузы.
БИНГО! Поменял монитор на без конца строки и теперь работает нормально! Спасибо!, @SamR
@SamR, прими его ответ, чтобы отметить его решенным, @Juraj
@SamR, Изменил монитор на отсутствие конца строки
... это не способ исправить проблему ... вместо этого вставьте код, который предотвращает нулевое значение newtime
, @jsotola
Замените io 13 на (предложение) 10 и подключите светодиод + 1k резистор к io 10. 13, кажется, используется. Также нет конца строки в Serial.
- Программирование Arduino Uno R3 для срабатывания реле каждые 24 часа
- Библиотека Arduino Timer 1 управляет значением таймера
- Как сделать очень долгую функцию delay(), несколько часов
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Разница между «time_t» и «DateTime»
- Получение BPM из данного кода
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Arduino непрерывно считывает значение АЦП с помощью прерывания
Зачем
задержка (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