Forum: Mikrocontroller und Digitale Elektronik AVR: Eine Erfahrung mit SLEEP/IDLE Mode


von SuperUser (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hagen R. (hagen)


Lesenswert?

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

von SuperUser (Gast)


Lesenswert?

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

von SuperUser (Gast)


Lesenswert?

Bingo, auch im Idle Mode:

Data-Sheet:
If the ADC is enabled, a conversion starts automatically when this mode
is entered.

von Hagen R. (hagen)


Lesenswert?

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