ARDUINO NANO и WDT Таймер

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Поделитесь, кто использовал сторожевой таймер с новым бутлоадером arduino nano, есть проблемы?
Какой загрузчик посоветуете? UNO?

b707
Offline
Зарегистрирован: 26.05.2017

optiboot

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

optiboot

Нашел про optiboot - Код получился на столько удачным, что официально ставится на все оригинальные Arduino Uno.
Надо ли понимать, что выбрав в IDE плату arduino uno и используя arduino as isp получим именно то, что надо?

sadman41
Offline
Зарегистрирован: 19.10.2016

А это легко понять. Оптибут - мелкий. 

Без оптибута:
 
Sketch uses 7,196 bytes (23%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,211 bytes (59%) of dynamic memory, leaving 837 bytes for local variables. Maximum is 2,048 bytes.
 
С оптибутом:
 
Sketch uses 7,196 bytes (22%) of program storage space. Maximum is 32,256 bytes.
Global variables use 1,211 bytes (59%) of dynamic memory, leaving 837 bytes for local variables. Maximum is 2,048 bytes.

 

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

А это легко понять. Оптибут - мелкий. 

к сожалению, эта цифра никак не может являться признаком наличия или отсуствия оптибута, поскольку она просто берется из boards.txt и в общем случае не имеет никакого отношения к реальному свободному месту во флеше :(

Надежнее проверить какой загрузчик можно так -  посмотреть в том же файле boards.txt - там прописан путь к загрузчику для каждой платы и для Уно так и написано, что загрузчик - optiboot

uno.upload.tool=avrdude
uno.upload.protocol=arduino
uno.upload.maximum_size=32256
uno.upload.maximum_data_size=2048
uno.upload.speed=115200

uno.bootloader.tool=avrdude
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0xFD
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.bootloader.file=optiboot/optiboot_atmega328.hex

uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.board=AVR_UNO
uno.build.core=arduino
uno.build.variant=standard
 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Путь в boards тоже не показатель, у меня загрузчик optibut, а плату я nano выбираю при загрузке

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Для проверки поддержки 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();
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

sadman41 пишет:

А это легко понять. Оптибут - мелкий. 

к сожалению, эта цифра никак не может являться признаком наличия или отсуствия оптибута, поскольку она просто берется из boards.txt и в общем случае не имеет никакого отношения к реальному свободному месту во флеше :(

Так реальное свободное место простыми способами и не измерить, как я понимаю - всегда компилируем прошивку под предполагаемый, а не реальный объем progmem space.

Может, конечно, мой ненаучный экспресс-метод не отвечает методологии измерений, но пока не подводил при выборе из двух загрузчиков, один из которых будет потолще (стандартный), другой поплоще - оптибут. Других не пользую, более мелких не встречал. 

Emer
Offline
Зарегистрирован: 02.11.2016

загрузчик от УНО новый, и никаких проблемм.

единственно при заливке скетчей потом придется всегда выбирать УНО

b707
Offline
Зарегистрирован: 26.05.2017

Emer пишет:

загрузчик от УНО новый, и никаких проблемм.

единственно при заливке скетчей потом придется всегда выбирать УНО

оно само выбирается

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
Green
Offline
Зарегистрирован: 01.10.2015

sadman41 пишет:

Может, конечно, мой ненаучный экспресс-метод не отвечает методологии измерений, но пока не подводил при выборе из двух загрузчиков, один из которых будет потолще (стандартный), другой поплоще - оптибут. Других не пользую, более мелких не встречал. 


Мельче наверняка можно, но нет смысла, т.к. минимальный размер bootsize AVR 256 слов, т.е., 512 байт.
Хотя, если в бут запихнуть часть прикладного кода, то почему бы и нет.)

Pyotr
Offline
Зарегистрирован: 12.03.2014

К действиям подтолкнула тема про 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();
}

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Поспешил я. Так WDT отключается совсем.