Fischertechnik
AVR
Raspberry Pi
Elektronik
Netzwerk
Sonstiges


















Impressum

Umschalten von Arduino-Bootloader auf AVRISP mkII
Arduino-Software hängt beim Starten
Funktionen wie millis(), delay() etc. ticken nicht richtig
Nachbau
Disassamblen des erzeugten Codes
Arduino für weitere Controller
Arduino für AT90USB624





Arduino-Tipps


Die Entwicklungsumgebung Arduino empfinde ich als sehr gut für kleine und mittlere Projekte geeignet und nutze sie entsprechend oft.
Dabei aber immer seltener mit der Original-Hardware und immer häufiger mit Selbstbauten oder Modulen wie dem Baby-Orangutan von Pololu oder diversen anderen mit ISP-Schnittstelle. Für diese nutze ich den AVRISP mkII von Atmel als Programiergerät, der wirklich gut und zuverlässig funktioniert. Ganz besonders schätze ich die Pegelwandler an der ISP-Schnittstelle, die bei 2,2 Volt Versorgungsspannung der Zielumgebung genauso gut funktionieren, wie bei 5 Volt. Die meisten "kompatiblen" Nachbauten verzichten auf die Pegelanpassung und setzen 5 Volt im Zielsystem voraus.
Seit der Erweiterung der Software für den ATmega644P nutze ich bei erhöhtem Ressourcenbedarf auch gerne Sanguino-Nachbauten; dieses hat den Nachteil, dass hier die Software deutlich hinter den Arduino-Versionen hinterher hinkt. Die Sanguino Version basiert auf der Version 18; die führende Arduino-Version ist bereits bei Version 22.
Für die mir wichtigen Funktionen spielt der Versionsstand allerdings bisher keine relevante Rolle. Mir ist die problemlose Arbeit mit der IDE wichtig und dazu gehört auch die intensive Nutzung des "Serial Monitor"; tickt mein Programm mal nicht so, wie ich es erwarte, kommt einfach eine Ausgabe (nach der anderen) ins Programm und ich kann verfolgen, was wohl schief geht. Im fertigen Programm benötige ich die Funktion der seriellen Schnittstelle (an USB) eher selten.
Der ATmega644P hat zwei serielle Schnittstellen, die auch beide aus der Sanguino-Umgebung programmiert und genutzt werden können. Hiermit habe ich z.B. einen RS485-Sniffer für bis zu 921.600 bps gebaut. Die eine Schnittstelle lauscht am RS485-Bus, die andere überträgt die Analyseergebnisse per Seriell-USB-Wandler zu weiteren Verarbeitung an einen Rechner. Der typischen Arduino-Takt ist nicht optimal für die Nutzung der heute üblichen Übertragungsraten auf seriellen Verbindungen. Ich bevorzuge hier die Taktfrequenz 14.745.600 Hz, die nur unwesentlich unterhalb der 16 MHz liegt, aber ein ganzes Vielfaches der üblichen Übertragungsraten ist z.B. 128 x 115.200 oder 768 x 19.200.

Umschalten von Arduino-Bootloader auf AVRISP mkII

Die Datei preferences.txt im (Windows 7-)Verzeichnis \Users\Benutzername\AppData\Roaming\Arduino auf der Systemplatte (häufig C:) enthält normalerweise eine Zeile:
upload.using=bootloader
Diese muss in
upload.using=avrispmkii
geändert werden.

Arduino-Software hängt beim Starten

Der Wechsel zwischen den unterschiedlichen Versionsständen ist vermutlich für das Startproblem verantwortlich. Hier hilft es die o.a. Datei (\Users\Benutzername\AppData\Roaming\Arduino\preferences.txt) einfach zu löschen. Danach müssen Sketch, Board und Serial Port neu eingestellt werden.

Funktionen wie millis(), delay() etc. ticken nicht richtig

Die Arduino-Hardware hat bisher offensichtlich immer nur 8 oder 16 MHz Systemtakt. Hierfür arbeiten die Timer-Funktionen fehlerfrei. Kommt aber ein "krummer" Takt ins Spiel, passen die Routinen nicht mehr.
In der Datei ...\hardware\arduino\cores\arduino\wiring.c sind die Routinen rund um Timer0 enthalten. Eine von mir erfolgreich eingesetzte Variante bei 14.745.600 Hz Takt ist, die Variable timer0_overflow_count mit zu nutzen; sie zählt, was ihr Name schon aussagt, nämlich den Überlauf des Timers 0.
Dieser hat 8 Bit und hängt mit einem Vorteiler am Systemtakt. Der Vorteiler steht auf 64. Die Variable zählt also Systemtakt / 16384.
Bei dem "Baurate-Takt" von 14,7456 MHz zählt die Variable mit 900 Hz hoch. Ein Tick des Timer0 entspricht 4,34μs.

Nachbau

Für die Arduino/-Sanguino-Nachbauten habe ich mir inzwischen mehrere FTDI Basic Breakout besorgt. Ich habe sowohl die 3,3 Volt-, als auch die 5 Volt-Variante und versorge während der Entwicklung meist die gesamte Schaltung über den FTDI Basic Breakout. Nach Abschluss der Entwicklung stecke ich den Adapter wieder ab und schließe stattdessen eine geeignete Stromversorgung am nun freien Stecker an.
FTDI Breakout von Sparkfun
Ein FTDI Basic Breakout kostet etwas über 10 Euro; ich habe meine bei Watterott bestellt.
Beim FTDI Basic Breakout kommt der gleiche USB-Chip zum Einsatz wie beim Arduino Duemilanove und der Nachbau benötigt nur ganz wenige Bauteile:
  • 1 x 10kΩ
  • 4 x 100nF
  • 2 x 22pF
  • 1 x 16MHz (bei 3,3V 8 MHz)
  • ATMEL ATmega328P (oder ATmega168 bzw. ATmega644P)
  • passender Sockel (28pol schmal oder 40pol) hierzu
  • 1 x 6polige Stiftleiste gewinkelt (bei ganz wenig Platz auch stehende Montage)
  • 1 x Lochrasterplatine

Schaltung

FTDI:
DTR über 100nF an Reset (Pin 1 bei 168/328, Pin 9 bei 644P)
RXI an TXD (Pin 3 bei 168/328, Pin 15 bei 644P)
TXO an RXD (Pin 2 bei 168/328, Pin 14 bei 644P)
5V an Vcc (Pin 7 168/328, Pin 10 bei 644P)
CTS wird nicht benötigt
GND an GND (Pin 8 168/328, Pin 11 bei 644P)
ATmega:
An den Anschlüssen XTAL 1 und 2 kommt der Quarz mit je einem 22pF Kondensator an GND. AVcc kann unterm Chip mit Vcc verbunden werden; der Pin liegt leicht versetzt, passt aber trotzdem problemlos. Auf der AVcc-Seite des Chips kommt jetzt noch je ein 100nF Kondensator zwischen Masse und AVcc bzw. ARef. Wenn GND auf dieser Seite nicht weiter benötigt bzw. belastet wird, kann ausgenutzt werden, dass GND innerhalb des ATmega bereits durchverbunden ist.
Der letzte 100nF-Kondensator kommt auf der Vcc-Seite direkt zwischen GND und Vcc.
Zwischen Reset und Vcc kommt noch der 10kΩ-Widerstand.
Erweiterung 1: Reset-Taster
Ein Reset-Taster (Reset an GND) ist eigentlich nicht notwendig; speziell in der Entwicklungsphase mit dem FTDI Basic Breakout erfolgt ja mittels DTR ein automatischer Reset bei jedem Download und jeder Aktivierung des Serial Monitor. Bei intensiver Nutzung von Arrays, Zeigern etc. habe ich ihn aber dann doch vermisst. Trivial zu realisieren; falls der Platz auf der Platine nicht mehr da ist, Jumperkabel von Masse kurz an den Reset-Pin halten.
Erweiterung 2: Verpolungsschutz der Versorgungsspannung
Der Verpolungsschutz des Arduino-Originals mit einem P-Channel-MOSFET ist genial: Drain an die Spannungszuführung, Source an VCC der Schaltung und Gate an GND (eigentlich noch komplizierter; für Nachbau und Lob des Originals soll diese Betrachtung aber reichen). Auf den ersten Blick scheint Drain mit Source vertauscht, dieses ist aber richtig und gewollt. Beim Einschalten wird die parasitäre Diode des MOSFET zur Versorgung der Schaltung genutzt. Damit bekommt der "innenliegende" Source-Anschluss Spannung gegenüber dem an GND liegenden Gate. Die Spannung reicht, um den Source-Drain-Kanal leitend zu machen und zwar in beide Richtungen. Die Diode wird so überbrückt und der Schutz arbeitet nahezu ohne Spannungsverlust.
Sollte die Spannung falschherum angeschlossen werden, sperrt sowohl die Diode, als auch der Source-Drain-Kanal. Theoretisch mögliche Restströme liegen im μA-Bereich und reichen nicht zur Zerstörung.

Für die Nutzung der Arduino-Entwicklungsumgebung empfehle ich wenigstens in der Anfangsphase eine Tabelle der Arduino-Pins bereitzuhalten. Die digitalen Anschlüsse 0-13 entsprechen Port D0, D1 .. D7, B0, B1 .. B5. Die analogen Anschlüsse 0-5 entsprechen Port C0 bis C5; diese sind übrigens auch als digitale Anschlüsse 14 bis 19 ansprechbar.
Pin-Zuordnung ATmega zu Arduino

Disassamblen des erzeugten Codes

Bei besonders kritischen Anwendungen kann es hilfreich sein, mal einen Blick auf den erzeugten Code zu werfen. bei den etwas älteren Arduino-Versionen gibt es im jeweiligen Sketch-Ordner ein Verzeichnis applet, in dem sich u.a. die übersetzte Datei im "Executable and Linkable Format" (ELF) befindet. Diese lässt sich in Assemler-Code zurückübersetzen:
\Program Files\Arduino\arduino-0022\hardware\tools\avr\bin\avr-objdump.exe -D Drehencoder.elf > Drehencoder.asm
\Users\chris\AppData\Local\Temp\build7423959169431762065.tmp>"\Program Files\Arduino\arduino-1.0.1\hardware\tools\avr\bin\avr-objdump.exe" -D tsop1740_nur_Analyse.cpp.elf > liste
Bei den neueren Versionen werden diese Dateien nur temporär abgelegt und liegen hier:
C:\Benutzer\.....\AppData\Local\Temp\build.....tmp\sketchname.cpp.elf

Arduino für weitere Controller

Die Entwicklungsumgebung lässt sich relativ leicht für andere Controller, als die auf den Arduino-Boards verwendeten, erweitern. Dieses erfolgt im Arduino-Verzeichnis des Benutzers durch einen zusätzlichen Ordner hardware und darin liegenden Unterordnern für neue Umgebungen. In den Unterordnern muss einerseits eine Datei boards.txt angelegt werden, die das Tools/Board-Menu oberhalb der Standardboards erweitert und andererseits ein Ordner cores.
Solche eigenen Erweiterungen bleiben bei einem Versionswechsel der Entwicklungsumgebung vollständig erhalten; allerdings vererben sich die Weiterentwicklungen natürlich nicht automatisch an die selbst definierten Umgebungen.
Die erste derartige Erweiterung, die ich gefunden habe, ist die Erweiterung für die ATtiny45 und 85 beim Stöbern auf den Seiten von Matt Richardson. und seinen diversen Beiträgen für Make. Die ATtiny45/85-Erweiterung findet sich beim MIT.
Arduino-Tool-Boards-Menu
In der aktuellen Version 0023 der Entwicklungsumgebung scheint es noch erforderlich zu sein, die gesamte cores-Umgebung bereitzustellen. In der kommenden Version 1.0 wird es wohl noch einfacher, wie das Beispiel für die ATtiny44/45/84/85 auf github zeigt. Dort gibt es ein Unterverzeichnis variants in dem dann ausschließlich die Abweichungen vom Standard hinterlegt werden.
OpenKubus USB-Stick

Arduino für AT90USB624

Inzwischen habe ich auch Gefallen an den AT90USBxx-Controllern gefunden und mir eine OpenKubus-Hardware besorgt. Für 12,90€ gibt es in Form eines USB-Sticks einen AT90USB646 mit 64k Flash, 16 MHz-Takt, einer Leuchtdiode und einem Taster.
Die Controller werden von ATMEL mit einem USB-Bootloader ausgeliefert, zu dem es auch ein passendes "Brenn"-Programm mit dem Namen FLIP gibt. Um diesen Bootloader zu aktivieren, muss der Anschluss E2 beim Starten auf Masse (GND) liegen und dann wieder auf HIGH gehen.
Entsprechend liegt der einzige Taster genau an diesem PIN E2; die LED ist zwischen Versorgungsspannung und Port D6 eingebaut und leuchtet demnach, wenn der Port D6 auf LOW gelegt wird.
Screenshot von Blinkprogramm