Bootloader

Programmierung des Bootloaders auf den ATmega328 MCU

Programmierung mit Raspberry Pi

  • Anschluss, für jedes Signal einen 2k2…5k6 Widerstand in Reihe verwenden:

    RPi  -> Ziel MCU
    ----------------
    IO25 -> Reset
    IO11 -> SCK
    IO10 -> MOSI
    IO9  -> MISO
    GND  -> GND
    
  • AVRdude installieren (wenn nötig):

    $ sudo apt-get install avrdude
    
  • Die Datei avrdude.conf bearbeiten und folgende Zeilen unter dem Abschnitt PROGRAMMER DEFINITIONS hinzufügen:

    $ sudo nano /usr/local/etc/avrdude.conf
    
    programmer
      id    = "pi_isp";
      desc  = "GPIO bitbang";
      type  = "linuxgpio";
      reset = 25;
      sck   = 11;
      mosi  = 10;
      miso  = 9;
    ;
    
  • Bootloader herunterladen:

    $ wget https://github.com/watterott/RPi-UNO-HAT/raw/master/software/bloader.hex
    
  • Bootloader programmieren:

    $ avrdude -c pi_isp -p m328p -e -U flash:w:bloader.hex:i -U lfuse:w:0xFF:m -U hfuse:w:0xD6:m -U efuse:w:0x05:m -U lock:w:0x0F:m
    

    Wenn der Programmer nicht gefunden wird, kann die Ursache an mehreren avrdude Versionen liegen. In diesem Fall die Konfigurationsdatei als Parameter hinzufügen: -C /usr/local/etc/avrdude.conf

    Eine Warnung 0xFD != 0x05 bei der eFuse kann ignoriert werden (nein auswählen). Beide Werte sind die gleiche Einstellung, jedoch mit einer unterschiedlichen Schreibweise nicht verwendeter Bits.

    Wenn als Devicesignatur 1E 95 14 angezeigt wird, dann m328 als Typ (-p) verwenden (nicht m328p).

Programmierung mit Arduino Uno

  • Anschluss (Arduino Uno mit RPi über USB verbunden):

    RPi  -> Ziel MCU
    ----------------
    D10 -> Reset
    D13 -> SCK
    D11 -> MOSI
    D12 -> MISO
    GND -> GND
    
  • AVRdude installieren (wenn nötig):

    $ sudo apt-get install avrdude
    
  • Bootloader und ISP-Firmware herunterladen:

    $ wget https://github.com/watterott/RPi-UNO-HAT/raw/master/software/bloader.hex
    $ wget https://github.com/watterott/RPi-UNO-HAT/raw/master/software/isp.hex
    
  • ISP-Firmware auf Arduino Uno programmieren (USB-Device ttyACM0 or ttyUSB0):

    $ avrdude -c arduino -P /dev/ttyUSB0 -b 115200 -p m328p -e -U flash:w:isp.hex:i
    
  • Bootloader mit Arduino Uno programmieren (USB-Device ttyACM0 or ttyUSB0):

    $ avrdude -c stk500v1 -P /dev/ttyUSB0 -b 19200 -p m328p -e -U flash:w:bloader.hex:i -U lfuse:w:0xFF:m -U hfuse:w:0xD6:m -U efuse:w:0x05:m -U lock:w:0x0F:m
    

    Eine Warnung 0xFD != 0x05 bei der eFuse kann ignoriert werden (nein auswählen). Beide Werte sind die gleiche Einstellung, jedoch mit einer unterschiedlichen Schreibweise nicht verwendeter Bits.

    Wenn als Devicesignatur 1E 95 14 angezeigt wird, dann m328 als Typ (-p) verwenden (nicht m328p).

Bootloader Test

Auto-Reset für AVRdude wird benötigt, siehe hier. Die Devicesignatur eines ATmega328 lautet 0x1e950f.

  • Ausführen:

    $ avrdude -c arduino -P /dev/ttyAMA0 -b 57600 -p m328p -v
    
  • oder (abhängig vom System):

    $ avrdude -c arduino -P /dev/ttyS0 -b 57600 -p m328p -v