Toolchain
First step is always to streamline the toolchain to ease development.
There is a wide variety of tools available for writing code, will list these here eventually.
Programmer
AVRISP-U
The programming kit I am using is Kanda's STK200-X starter kit, which comes with the AVRISP-U ISP programmer. This programmer has an accompanying Windows AVRISP-U software (download link), which ideally should be linked as an external tool to Microchip Studio for rapid deployment.
Tip
The AVRISP-U software can be directly loaded with a compiled hex via the command line, but note the boilerplate directories and files required (extrapolated from existing integration):
./ +-- MYPROG.asmproj +-- Release # "Debug" also works +-- MYPROG.hex
- MYPROG.asmproj
<Project> <PropertyGroup> <avrdevice>ATmega16</avrdevice> </PropertyGroup> </Project>
avrisp-u C:\path\to\MYPROG.asmproj
This is useful to bypass the Microchip Studio integration (although you still can't remove the subsequent step to hit F5 for the actual programming).
- Makefile
PROGNAME=ledflash200 default: @mkdir -p Release avrasm2 -fI -o "Release/${PROGNAME}.hex" -W+ie -i m16def.inc ${PROGNAME}.asm @echo "<Project><PropertyGroup><avrdevice>ATmega16</avrdevice></PropertyGroup></Project>" >> ${PROGNAME}.asmproj avrisp-u ${PROGNAME}.asmproj
USBasp
The USBasp programmer is open source and only requires an ATmega8. This protocol is straightforward to flash with via AVRDUDE. See schematic below:
For Windows, since libusb
is a perennial issue, Zadig can be used to quickly install compatible USB drivers which USBASP can interface with. One can get pretty good mileage with libusb-win32
.
Note that the usbasp protocol is intended to run at higher speeds, but typical chips require programming speeds of at most 1/4 clock speeds. If the firmware of the usbasp programmer supports it, the clock rate can be reduced by specifying -B
in avrdude
.
AVRDUDE
AVRDUDE (Linux, Windows) is a utility program that provides a uniform interface for different hardware programmers on a platform-independent basis. For example, writing a flash program to an ATmega16 chip connected via the USBASP interface only requires the following command:
avrdude -p m16 -c usbasp -U flash:w:[PROGRAM].hex
Some devices may require additional library support from libusb
and libftdi1
, which is complicated to build from scratch. A working alternative is to use Greuel's fork of AVRDUDE which patches functionality of libusb
and libftdi1
to work on Windows.
AVRISP-U compatibility
To get it to work with Kanda's AVRISP-U programmer requires adding the following configuration (adapted from a rather dated 2014 version which mislabels the PID value and adds an extra serial number check), for AVRDUDE 7.0:
- avrdude.conf
programmer id = "avrisp-u"; desc = "Kanda AVRISP-U FT2232D-based programmer"; type = "avrftdi"; connection_type = usb; usbvid = 0x0403; usbpid = 0x6010; usbvendor = ""; usbproduct = ""; usbdev = "A"; usbsn = ""; #ISP-signals - lower ADBUS-Nibble (default) reset = 5; sck = 1; mosi = 2; miso = 3; #LED SIGNALs - higher ADBUS-Nibble pgmled = ~11; #Buffer Signal - ACBUS - Nibble buff = 6; ;
Now write whatever you want, note write tested using program in Intel hex format:
avrdude -p m16 -c avrisp-u -U flash:w:[PROGRAM].hex
Note
For sanity check, on Windows, the correct VID and PID values can be looked up in Device Manager, associated with the FTDI driver listed under "USB controllers", e.g.
Device USB\VID_0403&PID_6010&MI_00\7&2194c0b3&0&0000 was started. Driver Name: oem109.inf Class Guid: {36fc9e60-c465-11cf-8056-444553540000} Service: FTDIBUS Lower Filters: Upper Filters:
If pin-out configuration is wrong, the following message will be returned, so it is a good indicator of operation before actually programming anything:
> avrdude -p m16 -c avrisp-u E avrftdi_program_enable(889): Device is not responding to program enable. Check connection. avrdude.exe: initialization failed, rc=-1 Double check connections and try again, or use -F to override this check.
Warning
Programming with AVRDUDE via AVRISP-U works, but this workflow requires the following steps:
- Attach AVRISP-U programmer and write using AVRDUDE.
- Disconnect AVRISP-U programmer from the board.
- Connect USB 5V supply to the board.
The disconnection step is necessary because the programmer can also power on via the 5V rail form the board. When initially powered on, the programmer somehow overrides the flash program written to the chip. Disconnecting the 10-pin ISP every time before testing a program is not ideal, so better to stick to the AVRISP-U software on Windows, which can both power and write to the board.
DFU-PROGRAMMER
dfu-programmer is only applicable to certain models of chips which already come with a preloaded bootloader, so the chip can be induced into DFU mode to upload software in a non-conflicting flash memory space.
Assembler / Compiler
For ease of development, customized header files for the chip for which a program is written for should be used, which provide convenient definitions to chip-specific registers, ports, etc. These are supplied in Microchip Studio (paths below for version 7.0.2594):
- Assembly:
C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel\ATmega_DFP\1.1.130\avrasm\inc\m16def.inc
- C:
C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\avr\iom16a.h
AVRASM2
AVRASM2 is the OEM assembler for Atmel chips, which is packaged together with Microchip Studio (supersedes Atmel Studio). File is located at C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avrassembler\avrasm2.exe
, and compilation can be called with:
avrasm2 -fI -o "MYPROG.hex" -W+ie -i m16def.inc .\MYPROG.asm
The Microchip Studio GUI software itself is actually decently powerful, especially if you have a compatible programmer, and it also includes a simulator for debugging. Supports both C and Assembly.
AVR-GCC
The main method to retrieve precompiled binaries for AVR-GCC is currently from Microchip website. Otherwise one can also consider building it themselves from the source.
Tip
A good practice to separate compilation environment is by pulling up a separate shell with binaries loaded loaded in the path. Consider deploying with the following script:
- start_avrgcc.cmd
set Path=%Path%;C:\PATH\TO\avr8-gnu-toolchain\bin set Path=%Path%;C:\PATH\TO\avr8-gnu-toolchain\avr\bin start cmd
Note that the AVR-AS assembler binary exists, but this should not be called directly, instead using the AVR-GCC compiler to indirectly call the assembler.
Note
Instructions for Ubuntu 22.04 LTS. Install the compiler, AVR binary utilities, AVR C library, and the GNU AVR debugger:
sudo apt-get install gcc-avr binutils-avr avr-libc gdb-avr
Development boards
Atmel STK600
The STK600 is a development board provided by Atmel, and requires Microchip Studio for operation. Quick start guide for the STK600, instructions reproduced below for STK600-ATMEGA2560 device board (Microchip Studio should be installed):
- Use mounting screws/clips to secure the chip board (or routing board + chip adapter boards)
- Ensure the white dot of daughter board is located on the same corner
- If no external clock, flip the clock switch to INT
- Connect computer to the USB B port, and switch on the STK600
- In Microchip Studio, access the STK600 interface tool via Tools > Device Programming > STK600, and select ATmega2560 device and click apply.
- Under board settings tab, write 3.3V to VTarget (or corresponding to your board)
- For ISP programming, connect the 6-pin ISP interface and set the ISP frequency to no more than 1/4 of CPU clock frequency. The application can be uploaded from the tool