Ergänzungen, Tipps und Tricks

Inhaltsverzeichnis

Vorweg

Beispiel

Software holen und installieren

Programmieren

EEPROM.h

Wire.h (I²C)

Servo.h

Links
Ergänzungen, Tipps und Tricks

Ergänzungen, Tipps und Tricks

ICSP und avrdude

avrdude muss mit besonderen Rechten ausgeführt werden. Ggf. hilft, mit su zu „root“ zu werden.

Bootloader neu aufspielen

Um einen Ersatz-ATmega zum Arduino-ATmega zu machen, muss der Bootloader neu aufgespielt werden. Mit einem AVR-ISP mk II (Bild) kann man das über den ICSP-Anschluss erledigen. Für einen ATmega328p sieht der Befehl dann beispielsweise so aus:

avrdude -pm328p -Pusb -e -Uflash:w:[…]/optiboot_atmega328.hex -cavrisp2

Code kopieren

Das Kopieren des Programms eines ATmega328p in die Datei copy.hex und das Schreiben in einen anderen Mikrocontroller erledigen die Befehle

avrdude -pm328p -Pusb -Uflash:r:./copy.hex:i -cavrisp2

und

avrdude -pm328p -Pusb -Uflash:w:./copy.hex:i -cavrisp2

Knapper Speicher

Knapper Speicher ist das Problem, mit dem man sich wahrscheinlich am häufigsten befassen muss und oft tritt dieses Problem derart massiv in Erscheinung, dass es jede anderweitige Entwicklung unmöglich macht.

Bei lediglich 2 kB RAM (beim ATmega328, 1 kB beim ATmega168) ist das keine Überraschung. Eine mögliche Lösung dieses Problems besteht darin, Daten im Flash-Speicher („Flash“) abzulegen und von dort abzurufen. Da es normalerweise darum geht, möglichst viel Speicher zu sparen, wird man dort häufig Dinge ablegen, die groß sind – also eher Feldvariablen (Arrays) als Einzelwerte.

Daten speichern

Möchte man Daten im Flash ablegen, verwendet man das Makro PROGMEM. Beispiel:

const static uint8_t var[][8] PROGMEM =
 {
   { 1, 2, 3, 4, 5, 6, 7, 8 }, ...
 };

Der Inhalt einer so angelegten Variablen wird im Flash untergebracht und belegt auf diese Weise kein RAM.

Das Makro PROGMEM ist eine Spezialität der C-Bibliothek des Compilers – um es verwenden zu können, muss man die Header-Datei avr/pgmspace.h einbinden:

#include <avr/pgmspace.h>

Im Flash abgelegte Variablen werden zu Konstanten, d. h. auf sie kann nur lesend zugegriffen werden.

Damit der Compiler davon erfährt, deklariert man solche Variablen wie im Beispiel am besten als const.

Daten abrufen

Um auf Daten zuzugreifen, die im Flash gespeichert sind, geht man wie folgt vor:

Man nimmt das, was man normalerweise schreiben würde, um auf ein Element des Arrays zuzugreifen …

byte data=var[5][4];

… bildet dann die Adresse …

const byte* addr=&(var[5][4]);

… und benutzt diese Adresse als Argument für das entsprechende Zugriffsmakro:

data=pgm_read_byte(&(var[5][4]));

Es existiert eine ganze Reihe solcher Zugriffsmakros (alle beginnend mit „pgm_read_“). Welches dieser Makros passt, hängt von der Art der abgefragten Daten ab.

Der entsprechende Abschnitt der Dokumentation der C-Bibliothek befindet sich hier: http://www.nongnu.org/avr-libc/user-manual/pgmspace.html.


Nach oben Inhaltsverzeichnis

Valid HTML 4.01 Transitional