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