ADC Noise Canceler

Gast #182721
Lesenswert?

Hallo
Habe ein Problem mit dem Noise Canceler Mode des ATmega8. Wenn ich die
Wandlung "von Hand" :
ADCSRA |= (1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
anstarte fuzt alles.
Wenn ich jedoch den Sleep Mode aktiviere und auf den Interrupt warte
wacht er nicht mehr auf.
Habe noch keine Beispiele über dieses Problem gefunden.
Vielleicht hat schon jemand Erfahrungen gemacht.

Gruß Lars
Angehängte Dateien:
Gast #182724
Lesenswert?

Hallo Lars,
ohne den ganzen Code wird´s schwierig zu sagen. Vielleicht sehen wir
dann ja auch das von Jörg angefragte und von Dir bemerkte sei(); vor
der Endlosschleife...

Wenn Deine Funktion adc_init so verwendet wird wie der Name es sagt
(nämlich nur zum Initialisieren), dann "pennt" Dir der Chip ja schon
bei der Initialisierung ein.

Was sagt denn die Simulation (z.B. mit dem AVRStudio) zu Deinem
Programm? Vielleicht kannst Du ja schon da sehen, wo´s hängt. Ganz
nebenbei bemerkt bin ich am Anfang des Jahres auch mit dem Sleep-Mode
und dem ADC gescheitert, allerdings mit einem Tiny26. Leider
unterstützt das Studio bei der Simulation nicht das Wake-Up, so daß ich
dann zähneknirschend ohne Sleep-Modes gearbeitet habe. Aber andere
Fehler ließen sich schon finden ...

Gruß
Lutz
Gast #182725
Lesenswert?

Nur um Mißverständnissen vorzubeugen, da blöd formuliert:
<Wenn Deine Funktion adc_init so verwendet wird wie der Name es sagt
<(nämlich nur zum Initialisieren), dann "pennt" Dir der Chip ja
schon
<bei der Initialisierung ein.
Das gilt natürlich nur, wenn Dein sei(); dahinter kommt.

Weiterhin kannst Du statt
<adc_data = ADCL;
<adc_data += (ADCH<<8);
adc_data = ADC; schreiben (oder ADCW, steht in der zugehörigen
Headerdatei ioxx.h)
Gast #182726
Lesenswert?

Hallo
Oh man es können ja Probleme mit dem Sleep Mode auftreten an die man
noch nie gedacht hat.

Danke Lutz und Jörg
Der Chip ist schon beim Initialisieren eingepennt. Jetzt kann ich
immerhin messen.


Habe mal mein ganzes Projekt angehängt. Werde es wenn es fertig ist
auch in der Codesammlung posten.

Habe aber noch einige Probleme:
1. Ich verschicke meine Daten über Interruptgesteuerte UART an den PC.
Aktiviere ich jedoch den Sleep Mode für den Noise canceler ist da
Schluss mit senden. Der Buffer läuft sicherlich über und der uC hängt
sich auf. Deshalb wollte ich den Buffer leeren bevor ich neue Messungen
anstarte. (läuft noch nicht richitg)

2. Umwandlen der Messdaten in einen String ist noch fürchterlich. Das
muss noch schöner gehen.

Gruß Lars
Angehängte Dateien:
Gast #182727
Lesenswert?

Hallo

@Lutz Müller

  adc_data = ADCL;
  adc_data += (ADCH<<8);
durch
  adc_data = ADCW;
zu ersetzen funzt leider nicht. Es lässt sich kompilieren liefert aber
nicht das gleiche Ergebnis. ADCW ist in iom8.h als 16 Bit beschrieben.
Ich denke bei mir fehlen 2 vom Ergebnis.

Gruß Lars
Gast #182728
Lesenswert?

Hallo Lars,
bei
>Ich denke bei mir fehlen 2 vom Ergebnis.
kann ich nicht so ganz deuten. Was meinst Du damit? Bei Dir ist
adc_data  als unsigned int deklariert, also mit großer
Wahrscheinlichekeit 16 Bit. Wenn ich mich jetzt vertun sollte: Nimm
statt "unsigned int" "uint16_t" . Bitte beschreibe das Problem
genauer. In Deinem Ansatz liest Du erst das Lowbyte in adc_data, dann
schiebst Du das Highbyte um 8 Stellen (1 Byte) nach links. Das Gleiche
sollte der Compiler für Dich machen wenn Du adc_data = ADCW schreibst.
Kannst Dir ja mal das Assemblerlisting (.lss-Datei) des Compilers bei
beiden Varianten anschauen und vergleichen.

Gruß
Lutz

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren