Forum: Mikrocontroller und Digitale Elektronik Bekomme ADC Noise Canceler beim ATMega16 nicht zum laufen


von Thomas F. (-tom-)


Lesenswert?

Ich versuche nun schon seit langem den AD-Wandler des ATMega16 im
"Noise Canceler"-Modus zu betreiben. Er wandelt aber nicht und ADIF
wird auch nicht gesetzt. Ich finde meinen Fehler einfach nicht.

Ich gehe folgendermaßen vor:
ADEN=1, ADATE=0 und den Teiler einstellen (125kHz)
ADMUX (externe Ref und single ended) einstellen


Wenn ich jetzt über ADSC-setzen eine einfache Wandlung starte, bekomme
ich das richtige Ergebnis.

Um nun den "Noise Canceler" zu benutzen, muss ich doch nur Interrupts
zulassen und im MCUCR-Register eine dezimale 80 reinschreiben (SM0=1 und
SE=1), oder verstehe ich das falsch? (Datenblatt Seite 31)
Mach ich das so, passiert nichts.
Kann mir jemand sagen, was ich im Datenblatt falsch verstanden oder
übersehen habe?

Und sehe ich das richtig, dass der UART die CPU im "Noise
Caneler"-Schlafzustand nicht wecken kann (Datenblatt Seite 32)?

Danke

Gruß

Thomas

von Thomas (Gast)


Lesenswert?

Also nach weiteren Versuchen, bin ich mir nun fast sicher, dass das
ATMega garnicht in den Schlafmodus wechselt und folglich auch keine
Wandlung startet. Gibt es bei den Sleep-Modes noch was zu beachten,
oder genugt einfach das setzen des SE-Bits und des entsprechenden
Sleepmodus über die SMx-Bits?

von johnny.m (Gast)


Lesenswert?

Du musst den µC mit sleep in den Schlummer schicken (bzw. in GCC-C mit
sleep();)

von johnny.m (Gast)


Lesenswert?

Sorry, muss natürlich sleep_cpu() heißen. Am besten schaust Du Dir die
Headerdatei sleep.h mal an.

von Thomas (Gast)


Lesenswert?

Ist das nicht das gleiche, wenn ich die Bit händisch setzte, d.h. nicht
diese Funktion benutze? Hab den code der fertigen sleep-Funktion gerade
nicht zur Hand, werde aber heute abend nochmal reinschauen.

Gruß

Thomas

von johnny.m (Gast)


Lesenswert?

Das hat mit den Bits nix zu tun. Der µC schläft erst dann ein, wenn er
den (Assembler-) Befehl 'sleep' hört. Das Setzen der Bits ist nur
Vorarbeit. sleep_cpu() (in GCC-C) macht nix anderes, als diesen Befehl
einzufügen. Falls Du in CodeVision programmierst, geht das über
#asm("sleep").

von Thomas (Gast)


Lesenswert?

Ahh, jetzt hab ich es verstanden. Wußte nicht, dass es da extra einen
Befehl für gibt. Ich dachte ein Schreiben ins Sleep-Mode-Register löst
das Schlafen automatisch aus. Aber es gibt ja tatsächlich einen extra
Befehl dafür. Dann wird einiges klarer.
Immer wieder liegt es nur daran, dass ich manches zu flüchtig lese.

Vielen Dank

Gruß

Thomas

von Thomas F. (-tom-)


Lesenswert?

Super, funktioniert wunderbar.

Danke johnny.m

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.