Forum: Mikrocontroller und Digitale Elektronik Tiny26 wacht aus ADC noise reduction nicht mehr auf :-(


von Paul H. (powl)


Angehängte Dateien:

Lesenswert?

Hi!


Um dem Rauschen von meiner I/O Peripherie etwas entgegen zu wirken 
wollte ich während der kram an ist in den ADC noise reduction sleep mode 
gehen.

Der ADC ist aktiviert, Interrupt auch. Löse ich den ADC manuell aus dann 
funktioniert alles.
1
  ; Sleep Mode aktivieren
2
  ldi    R16, (1 << SE) | (1 << SM0)
3
  out    MCUCR, R16

Hier habe ich den Noise reduction mode eingestellt. Mein Timer löst alle 
viertel Sekunden einen interrupt aus in dem der ADC gestartet wird. 
Anstatt hier das ADCSR bit zu setzen gehe ich per sleep einfach in den 
noise reduction mode.

Leider wacht der AVR davon nie wieder auf :-( Eigntlich sollte er doch 
dann an der stelle weitermachen an der er aufgehört hat oder? Aber er 
macht dann garnix mehr. Woran könnte das denn liegen?

Im Code im Anhang ist noch eine TWI Master Routine von mir die mir das 
ganze auf der LED-Anzeige ausgibt.

mfg PoWl

von Jörg X. (Gast)


Lesenswert?

> sbi    ADSC, ADCSR  ?
das soll doch gaaaaanz sicher
    sbi ADCSR, ADSC
heißen? -- also ERST Register DANN Bit...


hth. Jörg

von Paul H. (powl)


Lesenswert?

Oh danke für den Hinweis, hab das tatsächlich vertauscht :-) Der 
Assembler hats jedoch trotzdem richtig kompiliert und der sbi-befehl ist 
sowieso auskommentiert aber danke :-)

Hat denn niemand ne Ahnung woran das liegen könnte dass mein AVR aus dem 
Sleep-Mode nich wieder aufwacht? :-(

Das SleepEnable-Bit ist gesetzt, der ADC noise reduction Mode 
ausgewählt. Der ADC ist mit ADEN auch aktiv.

Wird die MCU eignetlich vom Interrupt wieder zurückgerufen? Da der ADC 
von der Timer-ISR aus gestartet wird sind hier interrupts noch nicht 
aktiv. Liegt das daran?

mfg PoWl

von Hannes L. (hannes)


Lesenswert?

Also das komplette Analysieren Deines Programms ist mir jetzt zu mühsam.

Aber:

Ich setze den Befehl SLEEP (meist/immer) in der Mainloop ein. Das 
sichert ab, das alle ISRs ordentlich verlassen wurden und alle Jobs (per 
Jobflags) erledigt sind. Ich nutze SLEEP im Idle-Mode (meist) bereits 
für ganz einfache Programme, wenn alle Jobs der Mainloop erledigt sind, 
schicke ich den AVR schlafen. Der nächste Interrupt weckt ihn dann 
wieder und vor dem nächsten Interrupt kann sowiso kein neuer Job (über 
Jobflags) in Auftrag gegeben werden.

In Deinem Fall müsste beim Start des ADC der Sleep-Mode von Idle auf 
ADC-Noise-red. umgeschaltet werden. Laut Datenblatt (Seite 41) sollte 
der ADC bereits eingeschaltet, aber nicht gestartet sein, dann startet 
er beim Aufruf von Sleep (wenn Mode ADC-Noise-red. voreingestellt ist) 
automatisch. Ist der ADC-Interrupt korrekt initialisiert, dann wird der 
AVR auch ordentlich geweckt. In der ADC-ISR muss der Sleepmode natürlich 
sofort wieder auf Idle umgeschaltet werden, damit beim nächsten Sleep 
ein Timer das Wecken schafft.
Übrigens: Während ACD-Sleep bleiben die Timer stehen (deren Takt wird ja 
deaktiviert). Es kann durchaus möglich sein, dass eine Korrektur der 
Timer erforderlich ist.

Ein Beispiel mit umschaltbarem Sleep-Mode findest Du hier:
http://www.hanneslux.de/avr/divers/index.html
Es ist allerdings nicht mit Tiny26 und auch nicht mit ADC-Noise-red., 
sondern mit Tiny15 und "Tiefschlaf" (Wecken per ext-Int).

...

von Paul H. (powl)


Lesenswert?

ich habs.. das I-bit im SREG musste aktiviert sein :-) jetzt gehts^^

danke trotzdem ;-) mfg powl

von Hannes L. (hannes)


Lesenswert?

Paul Hamacher wrote:
> ich habs.. das I-bit im SREG musste aktiviert sein :-)

Ja sicher doch, deshalb auch der Hinweis, Sleep in der Mainloop 
aufzurufen. Das I-Flag alleine reicht aber nicht.

> jetzt gehts^^

Wirklich???

Denn falls Du Sleep immernoch in der ISR aufrufst, wirst Du mit 
Stacksalat rechnen müssen.

>
> danke trotzdem ;-) mfg powl

Nix zu danken

...

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.