AVR XMega Tutorial

XMega Blockdiagramm

Auf dieser Seite möchte ich euch einen kleinen Einstieg in die Welt der XMegas ermöglichen. Diese Chips sind etwas anders aufgebaut als die „Standard“ Atmel Controller wie z.B. der Mega16 oder der Mega32.
Der XMega besitzt, im Gegensatz zum Mega8, 16 und 32, kein ISP Interface, sondern ein sogenanntes Programm and Debug Interface kurz PDI. Dieses Interface benötigt nur zwei Leitungen (PDI_CLK und PDI_Data).
Natürlich muss darauf geachten werden, dass das Programmiergerät dieses Interface unterstützt. Problemlos klappt dies mit dem Diamex All AVR Programmer oder dem Atmel AVR ISP mkII.
Für meine Programme verwende ich außschießich immer die aktuelle Version von AVR Studio 5 und als Chip verwende ich einen XMega128A1, sowie das AVR XPlained 128-A1 Board von Atmel.
Wenn der All AVR Programmer verwendet werden soll, müsst ihr darauf achten,dass ihr als Firmware mindestens Version 1.50 verwendet, da sonst die Kommunikation mit dem Chip nicht funktioniert und er weder programmiert noch die Fusebits verändert werden können.
In diesem Tutorial werde ich nicht groß auf die Programmiersprache „C“ eingehen. Wer dieses Tutorial durcharbeiten möchte, sollte zumindest Grundkenntnisse in dieser Sprache besitzen (keine Angst, da mein C selber nicht so ausgereift ist werde ich keine schweren und undurchschaubaren Programme zeigen ;) ).
Etwas komplexere Dinge, wie die Ansteuerung des USBs oder des Dotmatrix Displays werde ich (der Einfachheit halber) mit Hilfe der fertigen Libarys von Atmel realisieren (wieso sollte man sich auch die Mühe machen und was neu programmieren, wenn es das schon fertig gibt ;) ).

  1. Clocksystem
  2. I/O
  3. Interrupt & Eventsystem
  4. Timer
  5. RTC
  6. DAC
  7. UART
  8. ADC
  9. DMA
  10. SPI
  11. I²C (vorläufig)
  12. USB CDC
  13. Kalibration
  14. Dotmatrix Display
  15. QTouch

Wer Fehler findet kann sie mir gerne mitteilen und ich korrigiere sie dann.

 

-> Zurück zur Software

Alle Bilder stammen von Atmel.com

23 thoughts on “AVR XMega Tutorial
  1. Pingback: Arbeiten am CAN-Bus, XMega Turtorial und an der Nixie Uhr | Kampis Elektroecke

  2. Hallo,
    ich finde Dein Tutorial echt klasse. Es beschreibt die notwendigen Funktionen sehr gut und ohne viel overhead.
    In einem Projekt mit einem ATXMega 128 brauch ich gerade die internen ADC’s. Leider scheint dazu das Tutorial noch nicht fertig zu sein.
    Weist Du schon ungefähr wann du dies fertig machen wirst? (je eher umso besser für mich)
    VG Tobias

    • Danke für das Lob :)
      Sobald ich etwas Zeit über habe, wollte ich das Tutorial ergänzen.
      Falls aber dennoch Fragen da sein sollten oder Hilfe benötigt wird schreibt mir ruhig eine E-Mail :)

  3. Hallo,
    Ich schließe mich meinem Vorredner an, das Tutorial auf dieser Seite hat mir bisher wirklich sehr geholfen. Einfach super!

    Ich bin relativ neu bei der Mikrokontrollerprogrammierung und probiere gerade I2C auf einem Xmega32 zum laufen zu bekommen. Mit dem Xmega möchte ich einen Beschleunigungssensor MPU-6050 über I2C auslesen. Es gibt viele verschiedene Ansätze wie man das bewerkstelligen kann, aber alle Projekte, die ich gesehen habe, benutzen einen Arduino. Sogar die I2cdevlib-Bibliothek ist eigentlich nur für Arduino gedacht und ich bin ehrlich gesagt ein bisschen überfordert, wenn ich diese Bibliothek für das AtmelAvr Studio konvertieren soll ;)

    Kannst du mir Tipps geben, oder kennst du schon vorgefertigte Bibliotheken für I2C und den MPU-6050?
    Ich programmiere mit einem AVRICE und dem Atmelstudio 6.

    Ich freue mich über eine Antwort!
    Viele Grüße
    Matthias

    • Hallo Matthias,

      fertige Libs habe ich leider nicht und den Sensor an sich kenne ich auch nichts.
      Den I²C vom XMega habe ich bisher auch noch nicht benutzt. Ich muss mal schauen wie der funktioniert aber ich denke mal nicht groß anders als beim Mega32.
      Wobei brauchst du den genau Hilfe?
      Geht es um die Initialisierung des Buses oder um die Datenübertragung?

      Ich wollte am Wochenende mal (vorausgesetzt ich komme dazu) die Kommunikation von einem XMega und einem PCF8574 bzw. einem EEPROM via I²C herstellen und dokumentieren.
      Vielleicht hilft dir das ja schon weiter :)

      Gruß
      Daniel

      • Danke für die Antwort!

        Momentan stecke ich sogar noch bei der Initialisierung des Busses fest. Ich habe auf atmel.com ein Beispiel gefunden, wie man es hinbekommt, dass ein ATXmega mit sich selbst über I2C kommuniziert, aber das hilft mir nicht sonderlich weiter.

        Du kannst ja auch mal wenn du willst einen Blick auf den Code, den ich gerade zum Testen verwende, werfen. Ich habe ihn größtenteils aus dem Atmelbeispiel (www.atmel.com/Images/AVR1308.zip, http://www.atmel.com/Images/doc8054.pdf) zusammengebastelt. Der interessante Teil steht in der Main Funktion (ab Zeile 102):

        http://pastebin.com/UPZDBx9Z

        Bis jetzt funktioniert der Code noch nicht. Mein Mikrocontroller bleibt in der Schleife Zeile 141 hängen. Irgendetwas scheint da noch nicht zu passen
        Ich wollte, nachdem die Kommunkikation beendet wurde, den übermittelten Wert mit meinem Debugger auslesen.

        Doch eines verstehe ich noch nicht an dem Code: Im Atmelbeispiel wurde die Slave-Adresse 0x55 definiert (bei meinem Code in Zeile 13):

        #define SLAVE_ADDRESS 0x55 //nur Beispiel

        Aber auf was bezieht sich diese Adresse? Ist das die Adresse des ATXMega TWI Interface? Oder wurde sie einfach willkürlich gewählt? Dazu finde ich auch nichts in den Datenblättern

        Gerne können wir diese Unterhaltung auch per Email fortführen, auf dieser Seite wird es vielleicht schnell unübersichtlich. Oder ich gedulde mich einfach so lange, bis du dein I2C-Versuch dokumentiert hast ;)

        Viele Grüße
        Matthias

        • Hey,

          ja führen wir die Unterhaltung mal per Mail weiter.
          Die Adresse 0x55 sollte ein willkürlich gewählter Wert sein.
          Da der Chip selber keine Adresspins hat (wie ein I²C Device) musst du die Adresse Softwareseitig vergeben.
          Ich weiß auch nicht ob eine Kommunikation zwischen zwei Mastern bzw. zwei µC wirklich das einfachste ist um mit dem I²C anzufangen :)
          Ich würde erstmal klein anfangen, sprich einen PCF8574 oder eine RTC bzw. ein EEPROM anquatschen und schauen das man den Bus zum laufen bekommt.
          Sobald der Bus am laufen ist kann man weiter machen aber du musst halt erstmal eine funktionierende Grundlage schaffen sonst suchst du dir einen Wolf.

          Gruß
          Daniel

  4. echt super deine sammlung. kannst du auch mal was zum usb mit atxmega128a1U reinstellen? ich such schon überall, und find nix..

    ich würde gerne meine UART schnittstelle gegen CDC eintauschen, somit entfällt der ft232rl :)

    • Hey,

      ja kann ich gerne machen.
      Aber das dauert noch, da ich mir erstmal neue Hardware zulegen muss (mein Experimentierboard mit USB und allem ist kaputt :( ).

        • Hey,

          ich dachte an das XMegaB3U (oder so).
          Aber vor nächstem Jahr mache ich da eh nichts dran und Anfang nächsten Jahres ist Klausurzeit, sprich es dauert wirklich noch eine Weile :)

          Gruß
          Daniel

  5. eigentlich ist das fast egal welchen man nimmt, sind fast alle gleich.
    nächst Jahr klopft ja schon an :)
    alles Gute bei den Klausuren ;)
    bis bald

    • Hey,

      schau mal ins AVR Studio 5. Da gibt es viele Beispiele zum CDC (sind zwar für den XMega A3BU aber so als Anregung sollten die doch helfen denke ich :) ).

      • ja, der unterschied zu „deinen tutorials“ und ASF ist, dass dein Code schlanker ist und man jede Zeile versteht. ASF Examples sind mir zu wuchtig und in 1000 einzelne Funktionen verteilt. Ich sag nur, check mal Dein Timer Tut, welches ich wirklich super überschaubar finde :) Danke dafür

        • Hehe ja das stimmt :)
          Ich setze mich damit demnächst mal etwas auseinander (erstmal will ich mein 3. Raspberry fit für XMBC machen ;) und die Klausuren hinter mich bringen).

  6. Hallo,
    ein tolles Tutorial für die Xmega. Hat mir schon einiges geholfen.
    Leider komme ich jetzt mit den analog comparator nicht weiter. Ich benötige die Window Funktion, wobei ich für den oberen und unteren Grenzwert gerne den internen DAC verwenden würde. Hast du da schon etwas gemacht?
    Danke und viele Grüße
    Manfred

    • Hallo Manfred,

      freut mich das dir das Tut etwas weiter geholfen hat.
      Mit dem Komparator habe ich leider noch nichts gemacht, daher habe ich da keine wirklichen Erfahrungen mit gemacht :(

      Gruß
      Daniel

  7. Ich steige erst bei 8-bit AVR (XMEGA-A3BU Evaluation Board) ein, komme aber nicht so recht mi t AVR Atmel Studio 6 aus.

    Da ich zu Linux tendiere würde ich eher gerne mit Geany arbeiten.

    Gibt’s bei Dir Erfarhrungen ? Einige meinen, AVR Atmel Studio 4 sei weniger überfrachtet, aber irgendwie ist AS6 erdrückend.

    Ich bin dankbar für etwaige Tipps

    • Hallo David,

      mit Geany habe ich noch nicht gearbeitet, aber du kannst natürlich jede IDE mit AVR Plugin nutzen. Ich nutze AS6, da ich das Syntaxhighlighten etc. ganz praktisch finde (auch wenn AS6 wirklich stark überfrachtet ist…).

      Gruß
      Daniel

  8. Mit Atmel AS-6 habe ich abgeschlossen, absolut massivst überfrachtet und ich blicke kaum durch. Das AVR XMega-A3BU Eval.Board hat mich aber sehr fasziniert, daher will ich weiter machen. Außer für Eclipse, was gibt es für AVR-Plugins (Linux)?

    Und was hälst Du auch von AVRWin?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.