Микроконтроллер, watchdog и bootloader

Для управления приложением я использую плату Arduino Pro Mini с микроконтроллером ATMega328P (5V, 16MHz). Купил на Aliexpress в магазине Consumer Electronics Store  Store No.336447.

Arduino Pro Mini 328P 5V 16MHz

Удобная диаграмма !ProMini. Datasheet контроллера Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.

Программирование осуществляется при помощи Arduino IDE. Подключение к компьютеру осуществляется через USB порт при помощи USB to TTL UART модуля, например, на микросхеме CP2102 (CP2102 datasheet). Купил на Aliexpress в магазине ModuleFans Store No.612195.

USB TTL UART

 

Подключение к USB осуществляется по схеме:

ArduinoUSBTTL

Поскольку предполагается автономная работа в течение длительного времени, необходимо решить задачу перезагрузки контроллера в случае его зависания. Для этого используется watchdog timer. Идея простая: в таймер записывается время (максимально 8 секунд) и таймер начинает его уменьшать. Нужно до достижении 0 сбросить таймер. Если таймер не сброшен, то это означает, что контроллер завис. При достижении 0 контроллер перезагружается. Вот код, реализующий эту функцию:

//* (c) Victor Makarov, 2015
#include <avr/wdt.h>

void setup() {
    wdt_enable(WDTO_8S); // Установка таймера Watchdog на 8 секунд
}

void loop() {

    //  Какие-либо полезные действия

    // Сброс таймера Watchdog. Если управление не получено в течение
    // 8 секунд от предыдущего вызова - будет осуществлена перезагрузка.
    wdt_reset();
}

Однако существует проблема в стандартном bootloader Arduino. Он неправильно работает с этим таймером. При перезагрузке этот таймер устанавливается на 15мс и загрузчик должен его выключить. Однако загрузчик Arduino этого не делает и контроллер не успев запустить прикладную программу снова уходит в перезагрузку.

Для решения этой проблемы я установил загрузчик Optiboot. Сам загрузчик и инструкции по установке можно скачать здесь. Я использовал одну плату Arduino Pro Mini для установки Optiboot на другую плату. Шаги по установке Optiboot:

1) Скачать загрузчик, скопировать папку optiboot в /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/avr/bootloaders. Старую папку предварительно переименовать в optiboot.bak (на всякий случай).

2) Отредактировать файл /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/avr/boards.txt. Предварительно сделать его резервную копию boards.txt.bak. Я удалил из него разделы всех плат, которыми не пользуюсь и добавил новый раздел для  Arduino Pro Mini с загрузчиком Optiboot:

pro328o.name=[Optiboot] Arduino Pro Mini (5V, 16 MHz) w/ ATmega328p
pro328o.upload.tool=avrdude
pro328o.upload.protocol=arduino
pro328o.upload.maximum_size=32256
pro328o.upload.speed=115200
pro328o.bootloader.tool=avrdude
pro328o.bootloader.low_fuses=0xff
pro328o.bootloader.high_fuses=0xd6
pro328o.bootloader.extended_fuses=0x05
pro328o.bootloader.file=optiboot/optiboot_atmega328.hex
pro328o.bootloader.unlock_bits=0x3F
pro328o.bootloader.lock_bits=0x0F
pro328o.build.mcu=atmega328p
pro328o.build.f_cpu=16000000L
pro328o.build.core=arduino:arduino
pro328o.build.variant=arduino:standard

Обращаю внимание на скорость 115200. Стандартно Arduino IDE загружает на меньшей скорости и если не исправить, то загрузка программ в Arduino не получится.

3) Использовать другую Arduino Pro Mini как программатор. Скетч программатора находится в примерах Arduino IDE.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *