ADC trigger source wirkungslos

OP #2541480
Lesenswert?

Hallo,

ich versuche mit einem ATmega32U4 bei jedem TIMER0 Overflow eine ADC 
Messung zu machen.
Ich habe in ISR(TIMER0_OVF_vect) und ISR(ADC_vect) jeweils einen Pin 
einen Puls erzeugen lassen. Damit sehe ich deutlich dass genau so wie 
geplant der Overflow alle 32 ms eintritt und einen Puls erzeugt. 
Allerdings scheint der ADC weiterhin im FREERUN mode zu laufen, denn er 
erzeugt spändig den Interrupt.
Ein ändern des Registers ADCSRB bringt überhaupt keinen Unterschied.
Kann mir wer sagen was ich da falsch mache?

Danke
Angehängte Dateien:
OP #2542830
Lesenswert?

Hi Dietrich,

Nein, das habe ich mir schon angeschaut und der Timer läuft ja auch brav 
weiter und erzeugt die Overflow Interrupts. Ich verwende den MODE IDLE, 
Damit sollte nur die CPU stehen und durch einen Interrupt wieder geweckt 
werden. Und genau das tut der ADC auch, er läuft wie im FREE_RUN und 
erzeugt permanent Interrupts...
OP #2552027
Lesenswert?

Hallo,

ich habe das Problem selber gefunden. Es lag tatsächlich am SLEEP. Im 
SLEEP mode IDLE läuft der ADC weiter wird aber sofort bei eintritt 
getriggert... D. h. der ADC ist nicht mehr von der eingestellten 
Trigger-Source abhängig, soldern triggert sich direkt selber. Er führt 
als free run durch.

Kann mir wer sagen was das soll? Warum kann der ADC nicht im SLEEP auf 
die gleiche trigger Source reagieren...?

Lösung von mir:
Da der TIMER brav weiter seinen Dienst verrichtet und zum gewünschten 
Zeitpunkt einen Inerrupt triggert habe ich den ADC in Single conversion 
gesetzt und starte im Interrupt eine ADC Conversion.
(Firma: L-E-A) #2552232
Lesenswert?

Hallo Florian,

ich hatte vor Jahren mit dem Mega16 bzw. 32 ein ähnliches Problem. Ich 
habe damals den ADC auf die PWM synchronisiert, der ADC lief aber 
scheinbar permanent durch. Die Ursache war ganz einfach: Wenn vom 
Interrupt der Trigger-Quelle kein Interrupthandler aufgerufen wird, dann 
muss der ADC-Handler das entsprechende Interruptflag löschen, also nicht 
nur das ADC-Irq-Flag, sondern auch noch das des triggernden Irqs.

Kann es sein, dass bei Dir im Sleep-Mode der Timer-0-Interrupt-Handler 
nicht mehr ausgeführt wird und somit das zugehörige Irq-Flag nicht mehr 
gelöscht wird?

Grüßle,
Volker.
OP #2552469
Lesenswert?

Hallo Volker,

nein, der TIMER löst auch aus dem SLEEP heraus den Inerrupt auf und 
weckt damit den Controller.
Es steht auch so im Datenblatt, wie ich oben beschrieben habe:

Zitat: "If the ADC is enabled, a conversion starts automatically
when this mode is entered."

Ich verstehe nur nicht was das soll!

Gruß,
Florian
(Firma: L-E-A) #2552518
Lesenswert?

Hallo Florian,

meine Frage war, ob der Timer-0-Interrupt-Handler auch ausgeführt wird 
wenn die MCU sich im Sleep-Mode befindet?

Falls nicht, musst Du das Timer-0-Interrupt-Flag im Sleepmode explizit 
duch den ADC-Interrupt-Handler löschen, da dieses Flag dann nicht durch 
das Beenden des Timer-0-Interrupt-Handlers automatisch gelöscht wird.

Grüßle,
Volker.
OP #2553361
Lesenswert?

Hallo Volker,

der Interrupt wird aus dem SLEEP mode heraus ausgeführt, zum richtigen 
Zeitpunkt. Das Interrupt Flag vom TIMER0_Overflow wird automatisch bei 
aufruf des Interrupt Handlers zurückgesetzt.

Meine ursprüngliche Frage konnte ich ja mittlerweile auch selbst 
beantworten. Jetzt suche ich nur noch nach einer Erklärung warum das:

Zitat: "If the ADC is enabled, a conversion starts automatically
when this mode is entered."

so sein soll....

Gruß,
Florian
(Firma: L-E-A) #2553583
Lesenswert?

Salut Florian,

Florian Degler schrieb:

> Zitat: "If the ADC is enabled, a conversion starts automatically
> when this mode is entered."

Das wird vermutlich der "Noise Reduction Mode" sein, den Atmel 
vollmundig bewirbt. It's not a bug, it's a feature...

Dann musst Du wohl oder übel den ADC aus dem Timer-0-Interrupt-Handler 
heraus starten, bwz. freigeben und danach die MCU wieder schlafen legen. 
Damit nutzt Du dann auch automatisch die "Noise Reduction".

Grüßle,
Volker.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren