Hallo zusammen,
ich hab einen ATMega2560, AtmelStudio 6.1 und ein JTAGICE3.
Ich möchte den ADC im SingleConversion-Mode betreiben.
Sowohl im Init als auch in der ISR benutze ich folgende Zeile:
ADATE ist also nicht gesetzt, sondern ich will die Wandlung explizit per
ADSC starten.
Soweit die Theorie.
Das seltsame ist nun:
Auch wenn ich die Zeile so ändere, dass ADSC nicht auf 1 gesetzt wird,
läuft trotzdem die Wandlung los und der Interrupt kommt zyklisch.
Das klingt für mich nach "Free Running"-Mode.
Wenn ich aber mit dem Debugger in der ISR anhalte und mir ADSCRA ansehe,
dann steht da 0x8F drinn, d.h. weder ADSC noch ADATE gesetzt?!
Hat jemand eine Idee?
moin,
könnte damit zusammenhängen das am ADIF Flag rumgefummelt wird. Normal
wird dieses durch die Hardware, nach Abschluss einer Wandlung, gesetzt.
MfG
Hi
>Wenn ich aber mit dem Debugger in der ISR anhalte und mir ADSCRA ansehe,>dann steht da 0x8F drinn, d.h. weder ADSC noch ADATE gesetzt?!
An der Stelle wäre ADSC ja auch schon wieder gelöscht. Zeig deinen
kompletten Quelltext.
MfG spess
Hi
>könnte damit zusammenhängen das am ADIF Flag rumgefummelt wird. Normal>wird dieses durch die Hardware, nach Abschluss einer Wandlung, gesetzt.
1<<ADIF löscht ADIF.
MfG Spess
Hi
>Ich zitiere aus dem Datenblatt:>In Free Running mode, ...
Ich denke ADATE ist nicht gesetzt. Und im Single Conversion- und
Autotrigger-Mode ist ADSC nur während der Conversation auf High.
MfG Spess
Bronco schrieb:> ich hab einen ATMega2560, AtmelStudio 6.1 und ein JTAGICE3.
Vielleicht ist das Problem die Version 6.1 vom Atmel-Studio? Ich habe
diesen Rotz nach einer Woche des Herumärgerns wieder gelöscht, nachdem
der
gleiche (Assembler) Quelltext in AVR-Studio 4.16 genau das machte, was
ich auch geschrieben habe.
Neuer ist nicht unbedingt besser.
MfG Paul
Der PortA7 toggelt mit ca. 230µs, was der berechnten Wandelzeit (128 /
8MHz * 14,5 = 232µs) entspricht.
Und die gewandelten Werte (im alten Code) entsprechen auch angelegten
Spannungen.
Was ich nicht verstehe:
- Warum läuft der ADC überhaupt los (kein ADSC gesetzt)?
- Warum wandelt er zyklisch (kein ADATE gesetzt)?
PS: Disassembly besagt:
[avrarm]
ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) |
(1<<ADPS0);
00000097 LDI R24,0x8F Load immediate
00000098 STS 0x007A,R24 Store direct to data space
DDRA |= 0x80;
0000009A SBI 0x01,7 Set bit in I/O register
0000009B RET Subroutine return
[/avrarm]
Hi
>Warum läuft der ADC überhaupt los (kein ADSC gesetzt)?
Macht er nicht.
> Warum wandelt er zyklisch (kein ADATE gesetzt)?
Macht er auch nicht.
ADCs haben kein geheimes Eigenleben.
Nochmal: Zeig dein komplette Programm.
>Der PortA7 toggelt mit ca. 230µs, was der berechnten Wandelzeit (128 />8MHz * 14,5 = 232µs) entspricht.
Es sind aber nur 13,5 ADC-Takte ->216µs.
MfG Spess
spess53 schrieb:> Nochmal: Zeig dein komplette Programm.
Kann ich leider nicht, gehört der Firma und die ist da kritisch...
> Es sind aber nur 13,5 ADC-Takte ->216µs.
Ich dachte immer, es wären 13 + 1,5 Sample&Hold...
Naja, ehrlich sagt hatte ich gar nicht so genau auf's Oszi geschaut...
Hi
>Kann ich leider nicht, gehört der Firma und die ist da kritisch...
Dann mach halt ein Testprogramm mit dem ADC. Ich benutze zwar nicht den
ATMega2560 sondern 'nur' den ATMega1281, aber eins weiß ich genau: mit
den gezeigten Codezeilen wird weder der ADC gestartet noch macht er
Autotrigger.
MfG Spess
Hallo,
meine Erklärung zum aktivem Start der ADC-Wandlung findet sich im
Datenblatt:
S.277 Starting a Conversion
A conversion can thus be triggered without causing an interrupt.
However, the Interrupt Flag must be cleared in order to trigger a new
conversion at the next interrupt event.
Idle mode. If the ADC is enabled, a conversion starts automatically
when this mode is entered.
Stromsparen immer nur, wenn nötig und immer erst, wenn alles andere
perfekt läuft, hinzufügen.
Hi
>meine Erklärung zum aktivem Start der ADC-Wandlung findet sich im>Datenblatt:>S.277 Starting a Conversion>A conversion can thus be triggered without causing an interrupt.>However, the Interrupt Flag must be cleared in order to trigger a new>conversion at the next interrupt event.
Das steht im aktuellen Datenblatt auf S.270. Und das heißt, das wenn
Autotrigger ohne ADC-Interrupt verwendet wird, ADIF manuell
zurüchzusetzen ist. Dürfte hier kaum das Problem sein.
MfG Spess
Hi
>Idle mode. If the ADC is enabled, a conversion starts automatically>when this mode is entered.
An der Stelle hätte ich als letztes gesucht. Mal sehen, was der TO dazu
sagt.
MfG Spess
Peter Dannegger schrieb:> Idle mode. If the ADC is enabled, a conversion starts automatically> when this mode is entered.
Volltreffer! Das hätte ich jetzt auch nicht gedacht!
Und er hat nicht die Attitüde eines Caesar.
Aber auch mit Spess hätte man den Sieg errungen, nur ein bisschen
später:
> Dann mach halt ein Testprogramm mit dem ADC.
Damit vielleicht aber auch früher, wenn nämlich schon im Vorfeld das
Programm auf das Wesentliche reduziert worden wäre; wohlgemerkt dasProgramm, nicht der hier vorgestellte Teil, den man selbst für
wesentlich hält.