Installation

After building your DOTS module and having it checked, you can flash the microcontroller with the firmware. Install avrdude on your operating system. I am using a Mac with an AVRISP mkII to flash my modules. I had troubles using cheaper USBasp clones, though the firmware ships a PlatformIO environment for USBasp as well, so it should work with a reliable one.

Connect the ICSP pin header to the device, ensuring correct orientation by checking the pinout diagram. Do not connect the power header to a Eurorack power supply and the ICSP at the same time.

Setting Fuses

Before flashing the firmware, you need to set the correct fuses for the ATmega328P to work with the 16 MHz external crystal. This only has to be done once, the first time a fresh chip is programmed. The fuse settings are:

Low Fuse: 0xFF High Fuse: 0xD8 Extended Fuse: 0xFF

Use this avrdude command to set the fuses and flash the firmware (replace COM7 with your programmer's port and adjust the path to your .hex file):

avrdude.exe -c avrispmkII -p m328p -P COM7 -b 57600 -U flash:w:"path/to/dots.ino.hex":a -U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xFF:m

Note: This command flashes the .hex file without a bootloader and sets the fuses for 16 MHz external clock operation.

Two Programs, One Chip

The firmware is actually two separate programs sharing the same chip: the main sequencer and an EEPROM config program. The EEPROM config program is a small, standalone sketch that writes the default BPM, clock settings, and starter step/Euclidean patterns into EEPROM. Flash it once before the main program, otherwise the module boots with an empty pattern memory. You only need to redo it if you want to reset the module to factory defaults or ship a custom starting pattern.

The easiest way to do both in the right order is the included flash_module.sh script, which walks you through flashing the EEPROM config and the main program with either an AVRISP mkII or a USBasp programmer:

./flash_module.sh

Alternative Methods

The repository uses PlatformIO to manage environments. There are four: program_via_AVRISPmkII and program_via_USBasp build and upload the main sequencer, while eeprom_config_AVRISPmkII and eeprom_config_USBasp build and upload the EEPROM config program instead. Pick the pair matching your programmer, upload eeprom_config_* first, then program_via_*. This part could work right away or may require some troubleshooting. If the device signature is empty (0x000000), check for connection issues and try another cable. Do not move the device during this process. If you have just installed VSCode with avrdude and PlatformIO, try rebooting the system.

platformio run -e eeprom_config_AVRISPmkII --target upload platformio run -e program_via_AVRISPmkII --target upload

The release files also include an already compiled .hex file for the main program. You can use avrdude to flash it directly, but remember this only replaces the main sequencer, not the EEPROM patterns:

avrdude -c avrispmkII -p m328p -P usb -U flash:w:{{path-to-firmware}}/firmware.hex

If you are using the Arduino IDE, you may need to install the ATmega328P board.

Hints

  • 1
    Try different cables. Yes, I mean it
  • 2
    Check the board for any faulty solder joints
  • 3
    If you're having scrolling issues, note that encoder behavior varies — even 20-detent types differ by manufacturer. Try other models or adjust the code.
  • 4
    Forgot to flash the EEPROM config? The module still boots, just with empty patterns — flash eeprom_config_* once and it's fixed
  • 5
    Fuses only need to be set once per chip, not on every reflash