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
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?
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?
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.