Bitte um Hilfe beim Xmega a1

Status
Für weitere Antworten geschlossen.
Hallo zusammen,

die AppNote AVR1300 sollte man sich schon durcharbeiten, da hatte ich ja auch schon im Beitrag 2 darauf hingewiesen.

Das erste erste Ergebnis sollte man nicht verwenden, das ist bei den AVRs ja auch so. Allerdings, wenn das erste Ergebnis völlig daneben liegen würde, wird das Endergebnis durch die Mittelung von 10 Messungen nicht so stark beeinflusst, wie es hier auftritt. Also liegt das Problem noch woanders.

Damit man überhaupt "in die Nähe" von 12 bit Auflösung kommt, muss man das ADC Modul kalibrieren. Mindestens muss man
  • das Kalibrierungsbyte in das Cal Register schreiben und
  • den DC Offset ermitteln und beim Ergebnis berücksichtigen (der Offset ist ziemlich groß)
Hat man beides gemacht, gilt das für das ganze ADC Modul (hier das Modul vom PortA).

Aber selbst wenn man das Kalibrierungsbyte nicht schreibt und den Offset nicht berücksichtigt, sollte nicht ein so großer Fehler auftreten. Die Ursache liegt also nicht nur hier.

Was man noch bedenken sollte: Wie schnell darf das ADC Modul getaktet werden?! -> Prescaler einstellen (fehlt hier).

Wenn ich ein bisschen mehr Zeit finde, schreibe ich mal einen Beispielcode für unser Mikrocontrollermodul Xmega-A1-USB, so dass man sich die Werte auch am PC anzeigen lassen kann, das wollte ich sowieso mal machen.

Grüße,
Dirk
 
Hallo Dirk,

Du hast recht, dass mit dem ersten Wert ist bei allen AVRs so.
Ich würde wahrscheinlich zunächst eine Ausgabe per USB machen (so wie Du es machen willst). Dem Debugger würde ich nicht trauen bei der Sache.

Ich hab mir gestern auch ein Modul http://alvidi.de/avr_xmodul_V2_0.html geordert, da ich demnächst ein neues Projekt starte.

Michael
 
@Michael:
wie meinst du das, per USB eine Ausgabe machen?


Ich werde mich heute Nachmittag mit der Kalibrierung beschäftigen und euch berichten.
Bei der Taktung ist mir wichtig das er so schnell wie möglich wandelt, und wenn man ihn nicht einstellt bzw. man kann ich auch auf 0 setzen arbeitet er am schnellsten oder täusch ich mich da?

Schönen Tag noch.
 
Also habe nun auch das Problem mit den falaschen Werten gelöst war ein Steckfehler -.-'

@Michael: ist es nötig in der FOR-Schleife jedes mal jedes mal die Conversationszeit abzuwarten? Würde es nicht reichen wenn man vor Beginn der Aufnahme der nutzvollen Werte, also vor der FOR einmal da Abwartet, dann die IF löscht und dann dann einen dummy liest?

Und zwecks der Taktung: Liege ich da richtig das wenn Prescaler nicht eingestellt bzw. auf 0 ist, dass ich die maximale Geschwindigkeit bekomme?
 
@Michael: ist es nötig in der FOR-Schleife jedes mal jedes mal die Conversationszeit abzuwarten? Würde es nicht reichen wenn man vor Beginn der Aufnahme der nutzvollen Werte, also vor der FOR einmal da Abwartet, dann die IF löscht und dann dann einen dummy liest?

Vielleicht kann ich hier auch helfen:
Nein. Du würdest wahrscheinlich 10 mal den selben Wert von der ersten Wandlung lesen, da neue Werte von weiteren Wandlungen noch nicht ferig sind. Ist eine Wandlung fertig und das Ergebnis im Result-Register gültig, wird das IF Flag gesetzt. Das Flag muss man wieder manuell zurücksetzen, wenn man keinen Interrupt nutzt. Zurücksetzen kann man es manuell, indem man an die Bitposition eine "1" schreibt.

Und zwecks der Taktung: Liege ich da richtig das wenn Prescaler nicht eingestellt bzw. auf 0 ist, dass ich die maximale Geschwindigkeit bekomme?

Der Vorteiler (Prescaler) nutzt die niederwertigsten drei Bits im Prescale-Register. Resetzustand ist 0b000 (entspricht SystemClock / 4), das ist der kleinste Prescaler. Ist die ADC Frequenz zu hoch, verfälscht dies das ADC Ergebnis (Bei XmegaA1 ist die maximal zulässige Frequenz 2MHz).

Dirk
 
@Michael:
wie meinst du das, per USB eine Ausgabe machen?
Na entweder ein serielles Kabel anschließen oder wenn vorhanden einen Wandler seriell-USB und dann die Werte zum PC ausgeben (am einfachsten per Hyperterminal).
Ich weiss nicht was Ihr für ein Modul habt und ob das evtl. bereits einen Pegelwandler zu RS232 hat, dann könnt Ihr einfach ein serielles Kabel anlöten.

Michael
 
Ok zunächst mal ein Danke an Dirk und Michael.

Also ich werden nach jeder Abtastung abwarten und dannach das IF-bit löschen so wie es mir der Michael empfohlen hat.

Weiters habe ich den Prescaler auf 0x03 gesetzt (DIV=32), also beträgt die maximale Frequenz die ich empfangen kann 62,5kHz. Ich benötige ja auch nur maximal 56kHz wie ich im ersten Beitrag beschrieben habe.

Über den miniUSB zu USB Anschluss kann ich keine Werte auf den PC ausgeben oder?

Feno
 
Ich benötige ja auch nur maximal 56kHz wie ich im ersten Beitrag beschrieben habe.
Das kommt darauf an, was Du mit den gesampelten Werten vorhast. Solltest Du mit den gesampelten Werten Frequenzanalysen machen wollen, mußt Du mindestens doppelt so schnell abtasten. Aber auch das wäre für den A1 ein Kinderspiel.
Hattest Du am Anfang nicht was vom 10mal so schneller Abtastung geschrieben?

Über den miniUSB zu USB Anschluss kann ich keine Werte auf den PC ausgeben oder?
Jawoll ja

Michael
 
Guten Morgen

Heute habe ich mal testen wollen wie schnell wirklich nun der ADC ist.
Habe einfach ein PORT angesteuert der in der FOR Schleife von Low auf High und umgekehrt sich ändert. Diesen Ausgang habe ich auf das Oszi gehängt und musste schockierend feststellen das es nur magere 15kHz sind :S

hat einer Ideen woran das liegen könnte?
Danke im vorhinein.

Feno
 
Hallo Feno,
Habe einfach ein PORT angesteuert der in der FOR Schleife von Low auf High und umgekehrt sich ändert. Diesen Ausgang habe ich auf das Oszi gehängt und musste schockierend feststellen das es nur magere 15kHz sind :S

hat einer Ideen woran das liegen könnte?

du hast eine Systemfrequenz von 2MHz. Der Prescaler ist auf DIV32 eingestellt, der ADC wird also mit 62500Hz getaktet. Im Freerunning-Mode benötigt der ADC 4 Takte für die Wandlung eines Channels. Die Wandlung erfolgt dann also mit einer Frequenz von 62500Hz/4 = 15625Hz.

Wenn du schneller wandeln möchtest, verwende einen kleineren Prescaler und vielleicht aktivierst du weitere ADC-Channels, bis zu vier sind ja möglich. Schau am besten mal in das Datenblatt im Kapitel ADC/Freerunning-Mode.

Dirk
 
ja und wie kann ich auf 500KSPS kommen, weil ich muss ca. 10x so schnell abtasten?
 
ja und wie kann ich auf 500KSPS kommen, weil ich muss ca. 10x so schnell abtasten?

Nunja, ich würde es mal so machen:

Der Xmega läuft ja auch mit einer höheren Frequenz als mit 2MHz. Schau mal, dass du eine höhere Frequenz einstellst. Danach stellst du den Prescaler so ein, dass du 2MHz ADC Takt erhältst. Im Freerunning-Mode hast du dann für einen Channel eine Frequenz von 500ksps.

Falls du nur 2MHz nutzen möchtest, hast du mit dem kleinsten Prescaler einen ADC Takt von 500kHz. Du müsstest eigentlich die anderen (virtuellen) Channels ebenfalls auf deinen ADC Pin schalten können. Im Freerunning-Mode werden die nacheinander gesampelt und gewandelt (quasi-parallel um einen ADC Takt verschoben), so dass du mit vier Channel auch 500ksps erhalten müsstest (das habe ich aber selber noch nicht gemacht).

Wie groß ist denn die Datenmenge die du wandeln möchtest, verarbeitest du die Daten direkt bzw. wo möchtest du die ablegen?

Dirk
 
und wie kann ich die frequenz höher stellen?

Ich weis nicht genau wie groß die Datenmenge eines Tastendrucks der Fernbedienung. Aufjedenfall will ich das Signal abtasten die max. Frequenz ist 56kHz. Dannach will ich den Wert über USB an mein fertiges Programm an einem PC schicken dort wird das in eine Tabelle gespeichert und visualisiert.
 
Schau dir mal die AppNote AVR1003 an und in Verbindung damit dieses Thema.

Das sind die Routinen von Atmel mit denen du Oszillator und PLL einstellen kannst. Wenn du die Routinen nutzen möchtest, musst du clocksys_driver.h einbinden (siehe auch Anhang vom oben angegebenen Thema).

Das ist nur ein Beispiel und setzt voraus, dass du einen 16MHz Quarz an XTAL1/2 angeschlossen hast.


CodeBox c

/******************************************************************
* System Clock 32MHz (XOSC Quarz 16MHz, PLL Faktor 2)
******************************************************************/

/* Nach dem Reset ist die Quelle des Systemtaktes der interne
2MHz RC-Oszillator (System Clock Selection: RC2MHz)
*/

// Oszillator XOSC konfigurieren (12..16MHz, 256 clocks startup time)
CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc,
false,
OSC_XOSCSEL_XTAL_256CLK_gc );

// Oszillator XOSC enable
CLKSYS_Enable( OSC_XOSCEN_bm );

// Warten bis der Oszillator bereit ist
do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );

// PLL source ist XOSC, Multiplikator x2
CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 2 );

// Enable PLL
CLKSYS_Enable( OSC_PLLEN_bm );

// Prescalers konfigurieren
CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );

// Warten bis PLL locked
do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );

// Main Clock Source ist Ausgang von PLL
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );

// Nun ist der System Clock 32MHz !

 
Sind diese Einstellungen für das Oszi notwenidig um die Geschwindigkeit zu erhöhen??
Es muss doch irgendwas geben wie man diesen xmega in maximal geschwindikeit betreiben lassen kann. Das ist ja eine seiner Haupteigenschaft und der Grund wieso ich dieses Modul gekauft habe.

Schöne Grüße
 
Hallo feno,

das sind nicht die Einstellungen für das oder ein Mikrocontrollermodul, sondern die Einstellungen für den XmegaA Mikrocontroller.

Der Xmega Mikrocontroller unterscheidet sich bei der Wahl der Systemtaktquelle von "normalen" AVRs. Die Systemtaktquelle wird nicht mehr über Fusebits, sondern per Software eingestellt.

Die Einstellung der Systemtaktquelle nimmt man am Programmanfang vor. Das funktioniert so bei allen XmegaA Mikrocontrollern, egal ob es sich um den A1, A3 oder A4 handelt. Nach Reset ist die Systemtaktquelle immer der interne 2MHz RC-Oszillator. (Auch bei "normalen" AVR Mikrocontrollern ist die Quelle des Systemtaktes der interne RC Oszillator, die Frequenz ist immer kleiner als die höchst mögliche)

Ich vermute mal du hast unser Mikrocontrollermodul (Xmega-A1-USB)? Wenn ja, kannst du das Programmbeispiel von meinem vorherigen Beitrag eins zu eins übernehmen. Das Beispiel ist auch kommentiert. Hier wird der Oszillator XTAL1/2 aktiviert, der dann mit 16MHz läuft, die 16MHz werden intern an die PLL geschaltet, wo dann die 32MHz erzeugt werden. Diese 32MHz von der PLL werden dann als Systemtaktquelle geschaltet. Das Programmbeispiel kannst du natürlich auch für andere Module, Platinen, Controllerumgebungen verwenden, du müsstest nur berücksichtigen, ob ein Quarz an XTAL1/2 angeschlossen ist und welche Frequenz dieser hat. Schau dir das Beispiel einfach mal an. Im übrigen empfehle ich dir auch einen Blick in die Atmel ApplicationNotes. Alleine aus dem Datenblatt zum Beispiel mit dem ADC umgehen, ist kaum möglich, man braucht immer mal Beispiele.

Grüße,
Dirk
 
Hallo Leute..

Gerade wollte ich das mit dem Oszi ausprobieren, doch das AVR Studio erkennt meinen Debugger nicht.
Es komm dieser Fehler: JTAGICE mkII: USB connection skipped. Each instance of AVR Studio can only have one active USB device at a time.

Habe mehrere Sachen ausprobiert wie zB AVR deinstallieren installieren, da es ja vor kurzen ein Update gab. Einen anderen Xmega a1 habe ich auch ausprobiert.

Habt ihr eine Idee oder Ahnung ?

Danke
Feno
 
Hallo,

was sagt denn der Gerätetreiber, wenn du den JTAGICEmkII an USB anschließt. Du musst hier unter "Jungo" schauen. Gibt es dort einen Eintrag JTAGICEmkII? Ggf. den Treiber aktualsieren.

Dirk
 
Hallo

Habe das Problem gelöst indem ich einen anderen JTAGICE mk2 angesteckt habe, komischerweise funktioniert jetzt der alte auch wieder.

Ich habe nun die Oszi Einstellungen hinprogrammiert clksys_driver.h -*.c einimplementiert. Jetzt bin ich auf zirka 450kHz das reicht mir im vorhinein.
Aber nun sind die eingelesen Werte komplett falsch. Der Wertebereich liegt bei 0-128?

Muss ich vll was umstellen ?

Danke
 
Naja,

man kann den ADC des XmegaA auch auf 8Bit Auflösung einstellen oder das Ergebnis linksbündig im 16 Bit Result-Register anordnen. Wenn du hier nichts verstellt hast, sind die Register nach Reset so konfiguriert, dass du 12Bit Aulösung hast und das Ergebnis rechtsbündig angeordnet ist.

Welchen Prescaler hast du nun verwendet? Wie bist du auf die Frequenz der ADC-Wandlung gekommen? Wie kommst du an das ADC Ergebnis dran (mit Debugger auf RESH/L)?

Woran es nun liegen kann, dass du nur Werte von 0 bis 128 erhältst, weiss ich leider nicht. Der aktuelle Sourcecode wäre hilfreich.

Dirk
 
Status
Für weitere Antworten geschlossen.

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)