Hallo, ich wollte euch mal an meinen SLEEP Mode Erfahrungen mit dem AVR (atmega128) teilhaben lassen. Ich habe lange (sehr lange) nach der Ursache für dieses Problem gesucht. In der Software gibt es zwei Interrupts: a) ein Timer Interrupt (Timer 0). Dieser läuft periodisch und startet eine single ADC Wandlung. b) Den ADC EOC Interrupt. Dieser wird vom ADC EOC getriggert und dort werden die A/D Daten verarbeitet. Der ADC Interrupt kann von anderen Interrupts unterbrochen werden! Dieses Zusammenspiel von zwei Interrupts ist notwendig, weil mit dem ADC alleine nicht die erforderliche Abtastfrequenz einstellbar ist. Die Freigabe der Interrupts im ADC-Int. ist notwendig, da der ADC unbedingt äquidistant abtasten muss. Was hat das ganze mit SLEEP zu tun? -> ohne SLEEP gehts, mit SLEEP nicht. Dabei benutze ich SLEEP Fall den Idle-Mode. Was genau passiert, kann man auf dem beigefügten Bild sehen. Die Interrupt-Laufzeiten wurden jeweils über einen Port nach aussen signalisiert und aufgezeichnet. Irgendwie bringt der SLEEP Mode den ADC Interrupt durcheinander. Timer 0 läuft noch sauber durch, aber der ADC-Interrupt spielt verrückt. Eine Erklärung dafür habe ich derzeit noch nicht....
Noise Reduction Mode nennt sich das. Im ADCSR Register bitte den ADC über ADEN ausschalten, ansonsten startet nämlich der Aufruf von Sleep den ADC und nicht das Setzen vom ADSC Bit im ADCSR Register !! Solange nämlich per ADEN Bit der ADC eingeschaltet ist würde ein Aufruf von Sleep den ADC automatisch starten. Also ADEN Flag löschen, wenn du das nicht möchtest. Gruß Hagen
Hallo Hagen, wie ich schon schrieb, ich benutze den IDLE Mode, d.h. bits SM0..SM2 im MCUCR Register sind alle 0. (Noise Reduction Mode wäre 001) Allerdings bleibt das ADEN gesetzt, da ich ja auf den ADC warte... Hmmm, vielleicht verhält sich der ADC im Sleep Mode ähnlich wie im NRM...
Bingo, auch im Idle Mode: Data-Sheet: If the ADC is enabled, a conversion starts automatically when this mode is entered.
Sag ich doch ;) Ich persönlich gehe nur über den sleep, wenn es sich machen lässt. Starte ebenfalls den ADC im Timer. Der sleep-noise reduction Modus hält aber zusätzlich einige Clocks an, so auch den Timer 1 auf einem M128 zb. Allerdings finde ich es auch konzeptionell nicht io. das man dieses Verhalten in den ADC registern nicht explizit ein/ausschalten kann. Denn das dauernde Ein-/Ausschalten des ADCs über ADEN hat seine Seiteneffekte, besonders wenn man über ADMUX an der Referenz rumsprielt. Erst letztens habe ich nämlich arge Schwierigkeiten bekommen als ich verschiedene Mesungen abwechslend ->single ended Conversion mit AVcc als VRef, und differntiel Conversion mit 2.56V als VRef, benutzen wollte. Die gängige Meinung das an ARef ein 100nF Kondensator dran sollte kann dann eine böse Falle werden. Denn das Umladen dieses Kondensators dauert einige Zeit und derZzeitpunkt an dem dieser Cap umgeaden wird ist exakt der Moment in dem der ADC on ist, die gepufferten Register ADMUX etc.pp. beim Start des ADC erst übernomen werden. D.h. ändert man im ADMUX die Referenz so erfolgt die Übernahme dieser Änderung erst beim Starten eines neuen Samplings. Da aber der Cap an ARef mit 100nF bei schnellen Mesungen zu groß ist dauert das Einschwingen der ARef zu lange und verfälscht die ADC Resutate ins sinnlose. Die einzisgte Lösung ist dann eine ausreichend lange -> ADC Prescaler -> Messung als Dummy-Messung durchzuführen. Und eben den Cap an ARef kleiner zu machen. Gruß Hagen
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.