Forum: Mikrocontroller und Digitale Elektronik ADC trigger source wirkungslos


von Florian D. (fdsurfer)


Angehängte Dateien:

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

von Florian D. (fdsurfer)


Lesenswert?

Hallo,

es scheint am SLEEP mode zu liegen, denn wenn ich die Zeile 
sleep_mode(); auskommentiere wird nur noch nach einem TimerOverflow ein 
ADC Interrupt generiert....

Hat da wer eine Idee zu?

von Dietrich L. (dietrichl)


Lesenswert?

Florian Degler schrieb:
> sleep_mode(); ... Hat da wer eine Idee zu?

Dann schau mal im Datenblatt, was der mit sleep_mode() von Dir gewählte 
Mode alles abschaltet. Ich vermute mal, dass der ADC dann auch schläft 
(Vermutung! ich habe da nicht näher gesucht).

Gruß Dietrich

von Florian D. (fdsurfer)


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

von Florian D. (fdsurfer)


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.

von Volker B. (Firma: L-E-A) (vobs)


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.

von Florian D. (fdsurfer)


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

von Volker B. (Firma: L-E-A) (vobs)


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.

von Florian D. (fdsurfer)


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

von Volker B. (Firma: L-E-A) (vobs)


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.

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
Noch kein Account? Hier anmelden.