zepete: (Default)
[personal profile] zepete
Первая версия загрузчика arduino nano 3.0 мешала использованию WDT. Поэтому сейчас с arduino ide идет новая версия загрузчика, которая является загрузчиком optiboot 4.4 c дополнительными функциями, которые занимают дополнительные 512 байт и обнуляют регистр MCUSR, в котором хранятся сведения о причине перезагрузки mcu.

В интернетах много рецептов по установке optiboot, но они все очень сложные или не рабочие.

Мой способ намного проще.
1. Загрузить последнюю версию optiboot.





2. Создать в каталоге "arduino\hardware\arduino\avr\bootloaders\" папку "optiboot-8.0". Arduino - это путь к файлам arduino, например "c:\Program Files (x86)\arduino-1.8.13".

3. Из скаченного архива скопировать содержимое каталога "Optiboot-8.0\bootloaders\optiboot\" в папку arduino\hardware\arduino\avr\bootloaders\optiboot-8.0.

4. Добавить в файл arduino\hardware\arduino\avr\boards.txt следующий текст.


## Arduino Nano (OptiBoot 8.0) w/ ATmega328P
## --------------------------
nano.menu.cpu.atmega328opti=ATmega328P (optiboot 8.0)

nano.menu.cpu.atmega328opti.upload.maximum_size=32256
nano.menu.cpu.atmega328opti.upload.maximum_data_size=2048
nano.menu.cpu.atmega328opti.upload.speed=115200

nano.menu.cpu.atmega328opti.bootloader.low_fuses=0xFF
nano.menu.cpu.atmega328opti.bootloader.high_fuses=0xDE

nano.menu.cpu.atmega328opti.bootloader.extended_fuses=0xfd
nano.menu.cpu.atmega328opti.bootloader.file=optiboot-8.0/optiboot_atmega328.hex

nano.menu.cpu.atmega328opti.build.mcu=atmega328p



5. Запустить arduino и прошить загрузчик обычным образом. Только перед этим необходимо выбрать плату "arduino nano" и процессор "ATmega328P (optiboot 8.0)".









Зачем это надо.

Пример реализации доступа к регистру MCUSR.

#include <AVR\WDT.H>
#include <ARDUINO.H>

uint8_t mcusr_mirror __attribute__ ((section (".noinit")));
void get_mcusr(void) __attribute__ ((naked, used, section(".init3")));
void get_mcusr(void)
{
mcusr_mirror = MCUSR;
MCUSR = 0;
wdt_disable();
}

void setup() {
Serial.begin(9600);
if(bitRead(mcusr_mirror,WDRF))
Serial.println("Зависание");
else if(bitRead(mcusr_mirror,BORF))
Serial.println("Просадка напряжения");
else if(bitRead(mcusr_mirror,EXTRF))
Serial.println("Сигнал сброса");
else if(bitRead(mcusr_mirror,PORF))
Serial.println("Подача питания");
else
Serial.println("Неизвестно");




Замечания.
1. Если arduino установлена в program files, то нужны права администратора для записи туда файлов.
2. Arduino может отказаться прошивать программатором USBasp. Для исправления этого необходимо скачать avrdude с сайта "http://download.savannah.gnu.org/releases/avrdude/". Сыылка для скачивания файла avrdude-6.3-mingw32.zip. Содержимое этого архива (файлы avrdude.conf и avrdude.exe) скопировать в каталог arduino\hardware\tools\avr\bin.

Profile

zepete: (Default)
zepete

January 2026

S M T W T F S
    1 23
4 56 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 14th, 2026 07:12 am
Powered by Dreamwidth Studios