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