AVR-microcontroller programming under Ubuntu
A programming device will be required for uploading firmware to uc. The easiest option is STK-200. How to assemble read here. It is pretty simple:
This one was assembled by me:
There is one drawback in this program loader: LPT-port required. Another option is USB-ASP. Scheme, circuit board, and how to assemble read on http://easyelectronics.ru or elsewhere.
I'll use a board on which ATMEGA8535, led and button are placed for demonstration.
As for software, You'll need a compiler for AVR C and a program to communicate with programming device. Look what we have in Ubuntu repositories for AVR:
apt-cache search avr
avr-evtd - AVR watchdog daemon for Linkstation/Kuroboxes binutils-avr - Binary utilities supporting Atmel's AVR targets flashrom - Identify, read, write, erase, and verify BIOS/ROM/flash chips gdb-avr - The GNU Debugger for avr libusbprog-dev - Development files for libusbprog libusbprog0 - Library for programming the USBprog hardware usbprog - Firmware programming tool for the USBprog hardware usbprog-gui - GUI firmware programming tool for the USBprog hardware avarice - Використання GDB з Atmel JTAG ICE для AVR avr-libc - Стандартна бібліотека мови Сі для розробки на Atmel AVR avra - Асемблер для мікроконтролерів Atmel AVR avrdude - Утиліта для програмування мікроконтролерів Atmel AVR avrdude-doc - documentation for avrdude avrp - Утиліта для програмування мікроконтролерів Atmel AVR avrprog - Утиліта для програмування мікроконтролерів Atmel AVR gcc-avr - GNU-компілятор мови Сі (кросскомпілятор для AVR) sdcc - Компілятор Сі для мікроконтролерів sdcc-doc - Small Device C Compiler (documentation) sdcc-libraries - Small Device C Compiler (libraries) simulavr - Емулятор мікроконтролерів Atmel uisp - Маленький внутрішньосхемний програматор для мікроконтролерів Atmel AVR arduino - AVR development board IDE and built-in libraries
Install avr-gcc compiler and libraries:
sudo apt-get update sudo apt-get install avr-libc
To work with USB-ASP program loader we need avrdude package:
sudo apt-get install avrdude
Lets write a program and load it to the device. As an example: led flashes once per second. The led is connected to microcontroller's pin 1, and I use a crystal oscillator 4 MHz.
locate
Sometimes I look into io.h (in my case iom8535.h) to find necessary register names, but first we need to find it:
bash
locate iom8535.h
Output:
/usr/lib/avr/include/avr/iom8535.h
Look how interrupts and registers are called.
The program:
#include "avr/io.h" #define F_CPU 4000000UL #include "util/delay.h" #include "avr/interrupt.h" // interrupt handler (timer 1 on compare) ISR(TIMER1_COMPA_vect) { PORTB= 0; _delay_ms(200); PORTB= 1; } int main() { // ports configuration DDRB=1; PORTB=0; // timer 1 configuration OCR1AH= 0x0f; OCR1AL= 0x42; // 1 second timeout TIMSK= 1<<OCIE1A; // Interrupt on compare enable TCCR1B= 1<<WGM12 | 1<<CS10 | 1<<CS12; // CTC-mode. prescaler - 1024 and start! sei(); while(1); return 0; }
Compile:
avr-gcc -mmcu=atmega8535 -Os -o main.o main.c
Here we specify the model of the microcontroller, level of code optimization, file input and output respectively. To view all supported microcontrollers:
avr-gcc --target-help
Link:
avr-objcopy -O ihex main.o main.hex
Here we specified the output file type - intel hex, name of the input and output files. If you have multiple source files, then you need to compile each of them and specify all the obtained object files to avr-objcopy.
Load the program into the uc:
sudo avrdude -p m8535 -c usbasp -U flash:w:main.hex
Note the sudo, Ubuntu, by default, will not allow avrdude to work with USB-ports without root privileges (adding rule to /etc/udev/rules.d/ can solve the issue).
Here we have specified programming device (use stk200 for STK-200), specified target memory we want to write into (flash for flash, lfuze or hfuse for fuses), w - write, and path to file.
Entering all those commands everytime in console is tiring, I recommend to use make utility instead.
Makefile:
main.hex: main.o avr-objcopy -O ihex main.o main.hex main.o: main.c avr-gcc -mmcu=atmega8535 -Os -o main.o main.c load: sudo avrdude -p m8535 -c usbasp -U flash:w:main.hex
Now we can compile as follows:
make
And upload the program:
sudo make load
Compilling assembler (AVRA):
avra -I $(INCLUDEDIR) -fI -o $(FILE) $(FILE)