Ich bin ein Zeichen!

News
TODO
Projekte
Mobile Stromversorgung
Primzahlen berechnen
Laser Versuche
LED Lampe
Solarzellen
Unterm Tisch Beleuchtung
avrgcc installieren
Lichterkette
FHR
Elektrozünder
fnordlicht
Böses Internet...
LED Matrix
getPrivateVariables
wardrive
aboutyou
Lyric
Quit Message
Links
Temperatur
ICQ ...
Muell
Unix
Meine Bücher
Murphy's Law
Zaurus
Hostnames
U23

avrgcc und avrdude installieren und benutzen


Es gibt bereits eine sehr gute Anleitung für das installieren vom avrgcc, aber sie ist etwas veraltet. Für den original Text siehe: http://www.tldp.org/linuxfocus/English/November2004/article352.shtml Ich werde im folgenden nur das nötigste von diesem Artikel kopieren.

Es gibt drei Teile. Im ersten Teil wird die Installation erklaert, im zweiten wird gezeigt wie man damit denn nun seine Programme fuer den MCU erstellt. Und im dritten Teil stehen noch ein paar typische Fehlermeldungen und die Loesungen.

== Teil 1==


Also los. Wir brauchen folgende Software:
Dateiname Downloadmoeglichkeit
binutils-2.16.1.tar.bz2 ftp://ftp.gnu.org/gnu/binutils
gcc-core-4.0.2.tar.bz2 ftp://ftp.gnu.org/gnu/gcc/gcc-4.0.2/
avr-libc-1.2.5.tar.bz2 http://savannah.nongnu.org/download/avr-libc/
Dort findet ihr auch das Manual fuer die avrlib
avrdude-5.0.tar.gz http://savannah.nongnu.org/download/avrdude/

Als erstes erstellen wir das Verzeichnis in das der avrgcc installiert wird:
# Als root:
mkdir /usr/local/avr

Und das Verzeichnis in dem die Programme liegen werden:

# Als root:
mkdir /usr/local/avr/bin

Dieses Verzeichnis wird auch gleich in die PATH Variable geschrieben:
export PATH=$PATH:/usr/local/avr/bin

Achtung, dieser Befehl ist nur in dieser eine Konsole in der ihr seit gueltig und auch nur solange wie sie offen ist. Um die Aenderung Systemweit wirksam zu machen muesst ihr in die Datei /etc/profile den PATH nachtragen. Bei mir sieht das z.B. so aus:

# Set the default system $PATH:
PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/usr/local/avr/bin"

Installation von binutils:


Mit den binutils bekommt ihr Programme wie z.b. avr-as (Assembler), avr-ld (Linker), avr-objcopy (Um die Hex-Files zu erstellen). Und so wirds gemacht:
tar jxf binutils-2.16.1.tar.bz2 (Das entpacken kann eine Weile dauern)
cd binutils-2.16.1/
mkdir obj-avr
cd obj-avr
../configure --target=avr --prefix=/usr/local/avr --disable-nls
make

# Als root:
make install

Installation vom avr-gcc

Der avr-gcc ist unser eigentlicher Compiler. Er installiert sich wie folgt:
tar jxf gcc-core-4.0.2.tar.bz2
cd gcc-4.0.2

mkdir obj-avr
cd obj-avr
../configure --target=avr --prefix=/usr/local/avr --disable-nls --enable-language=c

make

Hinweis: Falls ihr jetzt beim installieren Fehler bekommt die sich z.B so aeussern:
make[2]: avr-ranlib: Command not found
Dann liegt /usr/local/avr/bin wider erwarten nicht in PATH. Fuehrt diesen Befehl als root nochmal aus, dann sollte es gehen:
export PATH=$PATH:/usr/local/avr/bin
/Hinweis Ende

# Als root:
make install

Installation der avr C-library

tar jxf avr-libc-1.2.5.tar.bz2
cd avr-libc-1.2.5

PREFIX=/usr/local/avr
export PREFIX
sh -x ./doconf
./domake

cd build

# Als root:
make install

Installation vom avrdude


tar xzf avrdude-5.0.tar.gz
cd avrdude-5.0
./configure --prefix=/usr/local/avr
make

#Als root:
make install

Wer den avr910 Programmer benutzt, muss avrdude erst fit fuer einige neue Controller machen. (tini2313, mega162, ...). Dazu muesst ihr die Configdatei von avrdude anpassen. Ihr findet sie hier: /usr/local/avr/etc/avrdude.conf
Folgende Zeilen muessen ergaenzt werden:

#------------------------------------------------------------
# ATtiny2313
#------------------------------------------------------------

part
id = "t2313";
desc = "ATtiny2313";
stk500_devcode = 0x23;
## Try the STK500 devcode:
avr910_devcode = 0x23;


#------------------------------------------------------------
# ATmega8535
#------------------------------------------------------------

part
id = "m8535";
desc = "ATMEGA8535";
stk500_devcode = 0x64;
avr910_devcode = 0x69;

Genauso Verfahren für die ATMega 64, 162 und 169. Die devicecodes hiefür sind:
m64: avr910_devcode = 0x45;
m162: avr910_devcode = 0x62;
m169: avr910_devcode = 0x78;


Werbung ;)
Wer sich uebrigends einen eigenen avr910 Programmer bauen will, dem sei diese Seite ans Herz gelegt: http://www.klaus-leidinger.de/mp/Mikrocontroller/AVR-Prog/AVR-Programmer.html Ich habe die Version genommen und um ein Buffer erweitert. Die Bauanleitung dafuer gibt es bald auf unserer Roboterseite.http://wiki.fatal-fury.de/
/ Werbung Ende

Somit haetten wir nun alles was wir brauchen installiert.

== TEIL 2 ==


Hier erstmal ein winziges Beispielprogramm fuer den ATTiny2313.

/*
 *  blink.c
 *  ATTiny2313 mit 1 MHz
 *  PORTB wird ueber ein Timer alle 0.263s ein- und ausgeschaltet. Das entspricht  3.81Hz
 */

#include 
#include 
#include 
#include 

SIGNAL(SIG_TIMER0_OVF)
{

  PORTB =~ PORTB; // PORTB inventieren

}

int main()
{

  DDRB  = 0xFF; // PORTB als Ausgang schalten
  PORTB = 0x00; // Alle Ausgaenge auf 0 schalten

  TCCR0B |= (1 << CS02) | (1 << CS00); //Prescaler auf 1024 stellen
  TIMSK  |= (1 << TOIE0);              // Timer 0 Overflow Interrupt enable

  sei(); // Interrupts einschalten

  for(;;); //ever

}
Den Quelltext nehmt ihr und speichert ihn in die Datei blink.c.
Jetzt kommt das Makefile. Ich habe schonmal ein einfaches vorbereitet:
TARGET=blink
MCU=attiny2313
CC=avr-gcc
OBJCOPY=avr-objcopy
CFLAGS=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues -save-temps

all: $(TARGET).hex

$(TARGET).hex : $(TARGET).out
	$(OBJCOPY) -R .eeprom -O ihex $(TARGET).out $(TARGET).hex

$(TARGET).out : $(TARGET).o
	$(CC) $(CFLAGS) -o $(TARGET).out -Wl,-Map,$(TARGET).map $(TARGET).o

$(TARGET).o : $(TARGET).c
	$(CC) $(CFLAGS) -c $(TARGET).c


load: $(TARGET).hex
	avrdude -p t2313 -c avr910 -U flash:w:$(TARGET).hex -v

clean:
	rm -f *.o *.map *.out *.hex *.s *.i
Das speichert ihr in der Datei Makefile im selben Ordner in der auch die Datei blink.c liegt. Dann einfach in der Konsole make tippen und es sollte compiliert werden. Mit make load wird das Hexfile dann in den MCU uebertragen.

Und nun zur Erklaerung.

MCU=attiny2313 ist eine Variable mit dem Inhalt attiny2313. Ueberall wo jetzte $(TARGET) steht, wird der Variabelninhalt benutzt. Genauso funktioniert das auch mit CC, OBJCOPY und CFLAGS. Nachdem ihr make erfolgreich ausgefuehrt habt, liegt in dem Ordner nun die Hexfile und eine Datei mit der Endung .s . Darin sind die Assemblerbefehle die der Compiler aus dem C-Code gemacht hat. Wer so etwas nicht braucht, der kann den Parameter -save-temps in der Variable CFLAGS getrost entfernen.

Wenn ihr make load ausfuert wird avrdude gestarte. -p gibt an um welchen MCU es sich handelt. Mit -c gebt ihr an um welchen Programmer es sich handelt. Hier koennte z.B stk500 stehen. -U flash:w:$(TARGET).hex bedeutet einfach, das dass Programm in den Flash geschrieben werden soll. w steht fuer schreiben, r fuer lesen und v fuer verify. Dann kommt die Variable $(TARGET) die besagt welche Datei genau uebertragen werden soll. Und am Schluss steht noch ein -v. v Bedeutet Verbose Output und gibt euch mehr Informationen auf der Konsole aus.

Mit make clean werden alle Temp Dateien geloescht.

== TEIL 3==

FEHLER
sollten eigentlich keine vorkommen. Wenn doch, vergewissert euch, dass ihr euch genau an die Anleitung gehalten und nichts falsch abgeschrieben habt.
Hier ein paar typische Fehlermeldungen und ihr Loesungen:

Wenn ihr Fehlermeldungen ala "Permission denied" erhaltet, hab ihr nicht die Rechte um diesen Befehl auszufueren. Hoechswahrscheinlich muesst ihr den Befehl als root ausfueren.

make[2]: avr-ranlib: Command not found
/usr/local/avr/bin liegt nicht in $PATH. Folgendes Command ausfueren:
export PATH=$PATH:/usr/local/avr/bin

programmer is not responding
Es kann keine Verbindung zum Programmer aufgenommen werden. Defektes Kabel, Programmer an der falschen Schnittstelle angeschlossen (default: /dev/ttyS0), kein Strom am Programmer etc.

can't open device "/dev/ttyS0": Permission denied
Als normaler User darf man auf die Serielle Schnittstelle nicht lesen oder schreiben. Folgenden Befehl als root ausfueren:
chmod 666 /dev/ttyS0