![]() |
|
Ergänzungen, Tipps und TricksICSP und avrdudeavrdude muss mit besonderen Rechten ausgeführt werden. Ggf. hilft, mit su zu „root“ zu werden. Bootloader neu aufspielenUm 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 kopierenDas 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 SpeicherKnapper 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 speichernMöchte man Daten im Flash ablegen, verwendet man das Makro PROGMEM. Beispiel: const static uint8_t var[][8] PROGMEM = 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. Daten abrufenUm 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.
|