Hallo, ich versuche gerade den ADC meines XMega128A1 (STK600, GNU C, AVR Studio4) zum laufen zu bringen. Jetzt gibts es nur laut Datenblatt scheinbar zwei Register mit denen man den ADC starten kann: 1. CTRLA - ADC Control Register A Dort kann man mit Bit 2 - 5 eine Conversion starten und 2. CTRL - ADC Channel Control Register Dort kann man mit Bit 7 eine Conversion starten Kann mir vielleicht jemand den Unterschied erklären bzw. wofür die beiden Möglichkeiten sind. Ich verstehe das im Datenblatt nämlich nicht so ganz. Danke schon mal.
Im CTRLA kannst du eben die vier kanäle starten vll für den sweep angenehmer hab bis jetz nru single conversions gemacht... Im CTRL vom jeweiligen channel nur diesen Channel. Wieso? naja das fragt man sich bei einigen dingen beim xmega wird sich bestimmt irgendwann ergeben
Aha, also bei CTRLA starte ich alle Kanäle gleichzeitig und bei CTRL nur einen bestimmten Kanal.
nein bei ctrla kannst du auch jeden kanal einzeln starten aber wie gesagt ich verwende nur einzelmessungen und mache dies in den channelregistern...
Scheinbar scheint mein ADC jetzt zu laufen. Der ADC soll nun noch eine ISR starten, in der ich den erhaltenen Wert auf meine LEDS ausgeben. Doch leider startet die ISR nicht. Das InterruptFlag des ADC wird aber laut Debugger gesetzt. Was mache ich falsch? Hier der Code: ... //ADC A initialisieren ADCA.CTRLA = 0x01; //aktivieren ADCA.CTRLB = 0x04; //unsigned mode und 8Bit ADCA.REFCTRL = 0x00; //internal 1.0V Reference ADCA.PRESCALER = 0x00; //Prescaler auf 4 ADCA.CH0.CTRL = 0x00; //inpurt mode internal ADCA.CH0.MUXCTRL = 0x00; //muxctrl auf temperature reference //Interrupts freigeben sei(); PMIC.CTRL=0x07; ... //ISR durch Counter 0 ISR(TCC0_OVF_vect) { ADCA.CH0.CTRL = 0x80; //ADCA Channel 0 starten } //ISR nach ausgeführter ADCA Wandlung ISR (ADCA_CH0_vect) { temp = ADCA_CH0RES; PORTA.OUT = temp; }
Du hast keinen Interrupt Level für den Channel eingestellt und dazu noch nicht wann ein Interrupt ausgelöst werden soll das kannst du im INTCTRL register des Kanals machen Merke: Xmega keine Interrupts ohne definiertes Interrupt level des Auslösers
Als Input für den ADC benutze ich aktuell die interne Temperature Reference, welche die Temperatur des XMegas angibt. Laut Datenblatt lässt sich diese Temperatur jetzt anhand des ADC Ausgabewertes wie folgt berechnen: T = TBD ⋅ ADCRESULT + TBD ADCRESULT ist der Ausgabewert des ADC, das ist klar. Aber was ist TBD?
Ich glaub ich habs jetzt schon selbst gefunden: TBD == to be defined :-( Die sind ja lustig...
naja die jungs von atmel brauchen halt noch ;) außerdem der Controller ist ja noch nichtmal auf dem Markt also was will man erwarten. Warscheinlich sind die Ergebnisse eh nicht so besonders genau. lass dir doch die Rohdaten über die LEDs anzeigen und schau ob die die Messungen wenigstens einigermaßen stabil sind... btw: 8-Bit ist schätzen :P
Das 8-Bit nicht sonderlich genau ist, ist klar. Aber ich wollte den ADC auch lediglich mal ausprobieren. Die Werte die dort rauskommen sind schon etwas seltsam. Wenn ich den XMega mit 32Mhz laufen lasse, dann ist er angeblich 31°C warm. Könnte stimmen. Wenn ich den XMega aber nur mit 32kHz laufen lassen, dann ist er angeblich nur 11°C warm (kalt), was bei ca. 20°C Umgebungstemperatur schon etwas unwahrscheinlich ist.
>Wenn ich den XMega aber nur mit 32kHz laufen lassen, dann ist >er angeblich nur 11°C warm (kalt)... ...was daran liegen könnte, daß Dein ADC einfach viiiiieeeel zu langsam getaktet ist, um noch korrekte Messungen machen zu können. Siehe Taktrate des ADC.
Mir leuchtet aber nicht ein, in wie fern die Taktrate des ADC mit dessen Genauigkeit zusammenhängt. Bei niedrigem Systemtakt dauert eine Umwandlung zwar sicher relativ lange, aber warum sinkt dadurch die Genauigkeit?
weil die interne sample&hold schaltung die spannung nicht so lange halten kann...
Genau. Aber das steht doch im Datenblatt - vielleicht nicht wortwörtlich, aber sinngemäß. BTW: Alex, nichts für ungut, aber willst Du jetzt zu jedem Modul des ATXMega, das Du ausprobieren willst, einen eigenen Thread aufmachen? Wo bleibt Deine Eigeninitiative?
@Travel Rec Eigeninitiative ist da, aber wenn man noch Anfänger ist, freut man sich über jeden Tip von etwas erfahreneren Leuten. Außerdem habe ich leider nicht ewig Zeit mich in diese Thematik einzuarbeiten. Und mal davon ganz abgesehen zwinge ich ja auch niemanden auf meine Fragen zu antworten ;-) Und ich glaube auch, das diese Threads auch für andere Anfänger und für Leute die sich mit den neuen XMegas beschäftigen wollen, interessant sein könnten.
Da stimme ich Dir grundlegend zu: Anfänger waren und sind wir alle mal. Aber wenn man sich an neue Dinge herantraut, geht man nicht gleich online und fragt, wie mach ich denn dies und wo finde ich das und warum geht das nicht... Das zeugt nämlich nicht gerade von Entdeckungsgeist und Spaß an der Materie. Wenn man Schritt für Schritt an die Sache heran geht und genau befolgt, was in den Datenblättern steht, dann kommt man auch zum Ziel. Das kann auch mal etwas dauern, aber dafür hat man´s hinterher auch begriffen. >Außerdem habe ich leider >nicht ewig Zeit mich in diese Thematik einzuarbeiten. Nun, das ist schade. Aber was bedeutet schon "ewig"? >Und ich glaube auch, das diese Threads auch für andere Anfänger und für >Leute die sich mit den neuen XMegas beschäftigen wollen, interessant >sein könnten. Ja. Bestimmt. Aber noch interessanter sind Threads, in denen bereits fundiertes Wissen weitergegeben wird, oder aber ein Artikel oder Tutorial. Das liest sich auch interessanter, als ein ständiges Frage-Antwort-Spiel, zumal wenn immer dieselben Fehler gemacht werden...
@Travelrec: Ich stimm dir da großteils schon aber das problem mit den xmegas ist zur zeit eben das im datenblatt einige informationen die ziemlich hiflreich wären noch nicht vorhanden sind und man ziemlich viel zeit braucht um weiter zu kommen wenn man nicht 100%ig in der Materie drin steckt... Beispielsweise gibt es ein Kalibrierungsregister für den ADC und das einzige was sinngemäß darüber im aktuellen datenblatt steht ist dass es für die kalibrierung verwendet werden kann aber stimmt schon was du sagst wenn was nicht klappt sollte man eben register für register der peripherie die zum einsatz kommen soll durchgehen und jedes bit überprüfen und wenn man dann den fehler findet lernt man umso einiges mehr als durch hingeworfene antworten jedoch stelle ich bei bestimmten teilen die ich in meinen ersten Versuchen mti dem Xmega gemacht habe gerne zur Verfügung es bleibt dann dem threadersteller überlassen ob er sich selber versuchen will oder es eben satt hat Das Problem von Alex ist eben dass er als Anfänger gleich einen so komplexen Prozessor an die Hand bekommen hat. Ist schon Hammer das Teil braucht aber erst einige Grundlagenarbeit bis man ihn wirklich so einsetzen kann wie es möglich ist.
>>...zur zeit eben das im datenblatt einige informationen die >>ziemlich hiflreich wären noch nicht vorhanden sind... Dafür gibt es das Manual und da steht fast alles drin. Was dort nicht drin steht, steht in den AppNotes auf www.atmel.com. Was dort nicht steht, kann man in den Datenblättern der ATMEGAs nachlesen, in denen auch viele Codebeispiele stehen. Viele Daten der im XMega verwendeten Technik kann man von den klassischen AVRs ableiten. >Beispielsweise gibt es ein Kalibrierungsregister für den ADC und das >einzige was sinngemäß darüber im aktuellen datenblatt steht ist dass es >für die kalibrierung verwendet werden kann Das stimmt. Ist zum Kalibrieren der Differenzmessung mit Gain. Single Ended und ohne Gain muß man nicht kalibrieren. Da gibt es höchstens einen kleinen Offset von 1...2 LSB. >Das Problem von Alex ist eben dass er als Anfänger gleich einen so >komplexen Prozessor an die Hand bekommen hat. Ist schon Hammer das Teil >braucht aber erst einige Grundlagenarbeit bis man ihn wirklich so >einsetzen kann wie es möglich ist. Da hat er mit dem XMega aber noch Glück gehabt. Der ist logisch auf jeden Fall zusammenhängender und verständlicher aufgebaut, als manche der älteren Megas. Die korrespondierenden Register stehen endlich blockorientiert an einer Stelle zusammen und nicht wild über den gesamten I/O und RAM-Bereich verstreut.
Ich habe das ohne ISR aber mit DMA transfer gemacht --> http://www.christoph-lauer.de/Homepage/Blog/Eintrage/2010/8/25_Microcontroller_based_Spectrumanalyzer.html
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.