Xmega: weitere Eindrücke. Der ATxmega32A4
Seit ein paar Tagen habe ich ATxmega32A4 Controller in der Hand. Durch die kleinere Bauform lassen sie sich vor allem beim Prototyping besser handeln und man kann leichter damit experimentieren. Also habe ich nochmal neu Fahrt aufgenommen und habe erste richtige Programmierversuche unternommen. Für die Experimente verwende ich meine SMD Adapterplatine auf Lochraster.
Nachdem ich endlich die ersten Hürden überwunden hatte lief das Programm, auch wenn es nicht viel tut. Aber man gewinnt einen Eindruck von dem Aufbau der neuen Xmega. Und dieser Eindruck sagt mir, dass die Xmega kaum noch Gemeinsamkeiten mit den alten ATmega AVR haben. Nicht einmal ein einfaches Programm mit einer blinkenden LED kann man 1 zu 1 übersetzen.
Das hat im Wesentlichen zwei Gründe: zum einen hat Atmel radikal in dem Registerchaos der alten AVR aufgeräumt, was wirklich dringend nötig war und einige Vorteile bringt. Zum zweiten gab es kaum eine Chance auf Abwärtskompatibilität aufgrund der vielen neuen Funktionen.
Nehmen wir als Beispiel die normalen IO Ports. Die alten AVR hatten für jeden Port 3 Register. PORT, DDR und PIN. Die Xmega haben für jeden Port einen Registersatz von 32 Registern, wovon derzeit 21 !!! belegt sind. Die drei alten Register sind noch vorhanden, heißen jetzt aber OUT, DIR und IN. Von der Funktion her sind sie fast unverändert. Einziger Unterschied ist, dass man den internen PullUp Widerstand nicht mehr durch Setzen des entsprechenden Bits in OUT (PORT) aktivieren kann. Für die Konfiguration steht jetzt jedem Pin ein komplettes Byte zur Seite, in dem man nicht nur den PullUp aktivieren kann sondern zwischen verschiedenen Verhaltensformen bei Ausgang oder Eingang definieren kann, ob der Pin invertiert werden soll usw. Vier weitere Register definieren das Verhalten in Verbindung mit Interrupts.
Den Registern OUT und DIR wurden jeweils drei zusätzliche Register spendiert. OUTSET, OUTCLR und OUTTGL bzw DIRSET, DIRCLR und DIRTGL. Diese Register ersparen mühsame Read-Modify-Write Operationen, um z.B. einzelne Bits zu setzen. Man schreibt einfach einen Wert in Form einer Bitmaske in das Register, der dem gewünschten Bitmuster entspricht, welches man ändern will. Der Controller setzt, löscht oder toggelt automatisch die entsprechenden Bits. Ein sehr nettes Feature, das wohl einiges an Codegröße und Ausführungszeit sparen kann.
Last but not least gibt es noch sogenannte virtuelle Ports. Da die Registersätze für die Ports im normalen Adressbereich liegen können Zugriffe nicht mit den Assembler Befehlen IN und OUT ausgeführt werden und benötigen dadurch mehr Takte. Mit den virtuellen Ports kann man die IN, OUT und DIR Register von bis zu vier Ports in den IO Adressbereich spiegeln, wodurch man wieder direkten Zugriff mit IN und OUT hat. Hier beißt sich jetzt die Katze etwas in den Schwanz. Man muss schauen, ob ein Read-Modify-Write auf die virtuellen Ports besser oder schlechter ist als die Verwendung von OUTSET, OUTCLR usw, da es für diese Register keine virtuellen Ports gibt. Aber ich vermute, die virtuellen Register verlieren hier.
Insgesamt sehen ich in den Xmega viel Potential. Die Vorteile liegen vor allem darin, dass man vorhandene Werkzeuge wie Compiler oder Programmierhardware (AVRISP mkII, Dragon, JTAGICE) nicht neu anschaffen muss und man bekommt ein erhebliches Plus an Performance und Features. Wer allerdings hofft, seine alten Programme mit wenigen Handgriffen portieren zu können dürfte wohl enttäuscht werden. So lange der Compiler nicht so etwas wie einen HAL (Hardware Abstraction Layer) bietet, der sämtliche Hardware Zugriffe kapselt, helfen nur erhebliche Änderungen am Programm oder am besten gleich eine von Grund auf neue Entwicklung. Letzteres dürfte vor allem dann sinnvoll sein, wenn die Anwendungen von den vielen neuen Features wie DMA, Events usw profitieren kann.
Tags: Atmel, ATxmega, AVR, Mikrocontroller, Xmega
Dezember 2nd, 2009 at 7:41 am
Danke für den interessanten Beitrag! Ich sehe in dem AtXMega ebenfalls viel Potential und hoffe auf eine weite Verbreitung in der Community.
April 22nd, 2010 at 8:57 pm
Hi,
ich hab schon einiges getestet und bin von den von den Xmegas relativ überzeugt. Die Registeranordnung ist einfach besser.
Gruß Flo