ARDUINO NANO и WDT Таймер
- Войдите на сайт для отправки комментариев
Пт, 07/12/2018 - 12:33
Поделитесь, кто использовал сторожевой таймер с новым бутлоадером arduino nano, есть проблемы?
Какой загрузчик посоветуете? UNO?
Поделитесь, кто использовал сторожевой таймер с новым бутлоадером arduino nano, есть проблемы?
Какой загрузчик посоветуете? UNO?
optiboot
optiboot
Нашел про optiboot - Код получился на столько удачным, что официально ставится на все оригинальные Arduino Uno.
Надо ли понимать, что выбрав в IDE плату arduino uno и используя arduino as isp получим именно то, что надо?
А это легко понять. Оптибут - мелкий.
А это легко понять. Оптибут - мелкий.
к сожалению, эта цифра никак не может являться признаком наличия или отсуствия оптибута, поскольку она просто берется из boards.txt и в общем случае не имеет никакого отношения к реальному свободному месту во флеше :(
Надежнее проверить какой загрузчик можно так - посмотреть в том же файле boards.txt - там прописан путь к загрузчику для каждой платы и для Уно так и написано, что загрузчик - optiboot
Путь в boards тоже не показатель, у меня загрузчик optibut, а плату я nano выбираю при загрузке
Для проверки поддержки WDT самым надёжным способом оказалось залить тестовый скетч )))
Скетч поправлен, проверка включается если замкнуть пин 8 на землю, в противном случае никаких танцев с бубном по перепрошивки ардуины, если загрузчик не поддерживает WDT
// modify Victor UA6EM 09.12.2018 //To aсtivity WDT Timer Pse connect Pin8 to GND #include <avr/wdt.h> unsigned int timer = 0; void setup() { wdt_disable(); // бесполезная строка до которой не доходит выполнение при bootloop pinMode(8,INPUT_PULLUP); Serial.begin(9600); Serial.println("Setup.."); Serial.println("Wait sec.."); delay(1000); if(digitalRead(8) == LOW){ wdt_enable (WDTO_8S); // Для тестов не рекомендуется устанавливать значение менее 8 сек. Serial.println("Watchdog enabled."); }else{ Serial.println("Watchdog DISABLE."); } } void loop(){ // Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial if(!(millis()%1000)){ timer++; Serial.println(timer); digitalWrite(13, digitalRead(13)==1?0:1); delay(1); } // wdt_reset(); }А это легко понять. Оптибут - мелкий.
к сожалению, эта цифра никак не может являться признаком наличия или отсуствия оптибута, поскольку она просто берется из boards.txt и в общем случае не имеет никакого отношения к реальному свободному месту во флеше :(
Так реальное свободное место простыми способами и не измерить, как я понимаю - всегда компилируем прошивку под предполагаемый, а не реальный объем progmem space.
Может, конечно, мой ненаучный экспресс-метод не отвечает методологии измерений, но пока не подводил при выборе из двух загрузчиков, один из которых будет потолще (стандартный), другой поплоще - оптибут. Других не пользую, более мелких не встречал.
загрузчик от УНО новый, и никаких проблемм.
единственно при заливке скетчей потом придется всегда выбирать УНО
загрузчик от УНО новый, и никаких проблемм.
единственно при заливке скетчей потом придется всегда выбирать УНО
оно само выбирается
Ссылка для оптибута 8-й версии - добавить в настройках IDE
Может, конечно, мой ненаучный экспресс-метод не отвечает методологии измерений, но пока не подводил при выборе из двух загрузчиков, один из которых будет потолще (стандартный), другой поплоще - оптибут. Других не пользую, более мелких не встречал.
Мельче наверняка можно, но нет смысла, т.к. минимальный размер bootsize AVR 256 слов, т.е., 512 байт.
Хотя, если в бут запихнуть часть прикладного кода, то почему бы и нет.)
К действиям подтолкнула тема про WDT http://arduino.ru/forum/apparatnye-voprosy/vsegda-li-wdt-perezagruzhaet-kontroller#new
Достал нанку на FTDI со старым загрузчиком. Ардуино ИДЕ 1.8.9. Плату выбрал 328 Old bootloader. Загрузил скетч из #6. При включении WDT плата уходит в вечный ребут. Кнопка ресет не помогает. Только передергивание питания.
Дополнил код и проблема исчезла. WDT установил на 500 мс - работает.
// modify Victor UA6EM 09.12.2018 //To aсtivity WDT Timer Pse connect Pin8 to GND #include <avr/wdt.h> unsigned int timer = 0; void setup() { wdt_disable(); // бесполезная строка до которой не доходит выполнение при bootloop pinMode(8, INPUT_PULLUP); Serial.begin(9600); Serial.println("Setup.."); Serial.println("Wait sec.."); delay(1000); if (digitalRead(8) == LOW) { wdt_enable (WDTO_500MS); // Для тестов не рекомендуется устанавливать значение менее 8 сек. Serial.println("Watchdog enabled."); } else { Serial.println("Watchdog DISABLE."); } } void loop() { wdt_disable(); while (1) { // Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial if (!(millis() % 1000)) { timer++; Serial.println(timer); digitalWrite(13, digitalRead(13) == 1 ? 0 : 1); delay(1); } } // wdt_reset(); }Поспешил я. Так WDT отключается совсем.