Getting started with AVR microcontrollers (using C, free tools and no IDE)

Oct 01, 2008 17:24


This is not a complete tutorial; it is intended to collect the information that I needed to get started and didn't find obvious, particularly explaining the operations needed to compile a program, and the most basic of syntax, operators, and IO operations to use microcontroller-specific operations from C/avr-gcc/avr-libc. It does not cover designing circuits or choosing a programmer.
Needed software

Get avr-gcc, avr-binutils, avr-libc, and avrdude. If you're on Mac OS X, all three are available through MacPorts.
Setup

Create ~/.avrduderc to specify what kind of programmer you have and where it's connected. Mine looks like this:

default_serial = "/dev/cu.KeySerial1"; default_programmer = "stk500v1";
default_serial is the device for the serial port the programmer is attached to; default_programmer is the type of programmer; see the manual section on command line options for programmer type names. You can also specify these on the command line, but I figure since these are specific to your computer it's better to leave them unspecified in makefiles.
Writing code
  • char is 8 bits and int is 16.
  • The entry point is the normal int main(void); you don't have to do any special initialization.
  • Special registers are exposed as variables - e.g. PORTD = 0 to do output.
  • All normal variables take up scarce RAM - for constant data, use the facilities in to store it in program space.
  • Basic IO: Each port has three registers. For some port x, DDRx specifies direction: a 1 bit makes the corresponding pin an output, whereas 0 makes it an input. Reading PINx takes input from the pins; writing PORTx sets output. If DDRx has a 1 bit, then PORTx controls internal pullups on those pins.
  • For further info on the functions of the chip, read the datasheet for it; the translation into C is mostly straightforward.
  • The avr-libc manual contains info on its avr-specific features.
  • The avr-libc demo projects are informative and well-explained.
Compiling

avr-gcc -mmcu=at90s8515 -Werror foo.c bar.c -o foo.elf
Substitute the part number of your target chip for at90s8515. I use -Werror to reduce the chances I'll run broken code on real hardware.

avr-objcopy -O ihex foo.elf foo.hex
This step discards the metadata the .elf file contains, leaving just the code, suitable for programming.
Programming (downloading)

avrdude -p 8515 -U flash:w:foo.hex
Substitute the part number of your target chip for 8515.

avr, electronics, timer project

Previous post Next post
Up