ADC trigger source wirkungslos

OP #2541480
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
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
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)
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
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)
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
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)
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.