DomůArduinoArduino Nano a Optiboot

Protože jsem měl potřebu pro klony Arduino Nano používat Watchdog bylo třeba vyřešit nahrání jiného zavaděče Optiboot. Našel jsem několik postupů.Žádný mi nepřipadal komlexní na verzi Arduino IDE 1.6.x tak jsem to vycucal zde.

Nakonec ten nejjednodušší postup vychází z postupu popsaného zde (http://tnweb.tode.cz/optiboot-v-arduino-nano-a-pro-mini/).

Nakonec souboru Arduino\hardware\arduino\avr\boards.txt se jen přidá:

##############################################################

atmega328o.name=[Optiboot] Arduino Pro Mini (5V, 16 MHz) or Nano w/ ATmega328
atmega328o.upload.tool=avrdude
atmega328o.upload.protocol=arduino
atmega328o.upload.maximum_size=32256
atmega328o.upload.speed=115200
atmega328o.bootloader.tool=avrdude
atmega328o.bootloader.low_fuses=0xff
atmega328o.bootloader.high_fuses=0xde
atmega328o.bootloader.extended_fuses=0x05
atmega328o.bootloader.path=optiboot
atmega328o.bootloader.file=optiboot/optiboot_atmega328.hex 
atmega328o.bootloader.unlock_bits=0x3F
atmega328o.bootloader.lock_bits=0x0F
atmega328o.build.mcu=atmega328p
atmega328o.build.f_cpu=16000000L
atmega328o.build.board=AVR_ATMEGA328O
atmega328o.build.core=arduino:arduino
atmega328o.build.variant=arduino:eightanaloginputs

##############################################################

 

Potom využijeme druhé Arduino Nano jako programátor:

Arduino-isp-nanoNež se pustíme do připojování a programování čipů, musíme z Arduina udělat ISP programátor. Ten slouží k nahrávání programů do připojených čipů. To provedeme velmi jednoduše – z Examples otevřeme program ArduinoISP a nahrajeme ho do našeho Arduina (v tuto chváli je vybrán typ desky Arduino Nano). V dalším kroku musíme „identifikovat“ důležité piny, které při programování použijeme. Jsou to: MISO, MOSI, SCK a SS. Jejich umístění se u různých desek může lišit. Příklad rozmístění pinů vidíte v tabulce.

Model MISO MOSI SCK SS
Mega 50 51 52 53
UNO 12 11 13 10

Potom resetujeme připojení USB a zvolíme typ desky [Optiboot] Arduino Pro Mini (5V, 16 MHz) or Nano w/ ATmega328 a správný port COM. Dále zvolíme programátor „Arduino as ISP“  a dáme volbu Nástroje -> Vypálit zavaděč.

Po restartu můžete používat flashované Arduino jako desku [Optiboot] Arduino Pro Mini (5V, 16 MHz) or Nano w/ ATmega328 a staruje rychleji a je o něco víc místa pro program. Nyní lze používat i watchdog.

#include 
#include <avr/wdt.h>
/*
  watchdog timer example code.

  flashes LED three times quickly on boot up. Then goes thru a loop delaying
  an additional 250ms on each iteration. The LED is on during each delay.
  Once the delay is long enough, the WDT will reboot the MCU.
*/

const int                                onboardLED            = 13;

void setup() {

    int                                  k;

    // immediately disable watchdog timer so set will not get interrupted

    wdt_disable();

    // I often do serial i/o at startup to allow the user to make config changes of
    // various constants. This is often using fgets which will wait for user input.
    // any such 'slow' activity needs to be completed before enabling the watchdog timer.

    // the following forces a pause before enabling WDT. This gives the IDE a chance to
    // call the bootloader in case something dumb happens during development and the WDT
    // resets the MCU too quickly. Once the code is solid, remove this.

    delay(2L * 1000L);

    // enable the watchdog timer. There are a finite number of timeouts allowed (see wdt.h).
    // Notes I have seen say it is unwise to go below 250ms as you may get the WDT stuck in a
    // loop rebooting.
    // The timeouts I'm most likely to use are:
    // WDTO_1S
    // WDTO_2S
    // WDTO_4S
    // WDTO_8S

    wdt_enable(WDTO_4S);

    // initialize the digital pin as an output.
    // Pin 13 has an LED connected on most Arduino boards:

    pinMode(onboardLED, OUTPUT);

    // at bootup, flash LED 3 times quick so I know the reboot has occurred.

    for (k = 1; k <= 3; k = k + 1) {
        digitalWrite(onboardLED, HIGH);
        delay(250L);
        digitalWrite(onboardLED, LOW);
        delay(250L);
        }
    // delay a bit more so it is clear we are done with setup
    delay(750L);
    }

void loop() {

    int                                    k;

    // this loop simply turns the LED on and then waits k*250ms. As k increases, the amount of time
    // increases. Until finally the watch dog timer doesn't get reset quickly enough.
    for (k = 1; k<= 10000; k = k + 1) {
        // at the top of this infinite loop, reset the watchdog timer
        wdt_reset();
        digitalWrite(onboardLED, HIGH);
        delay(k*250L);
        digitalWrite(onboardLED, LOW);
        delay(250L);
        }
    }

Komentáře jsou zakázány.