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.