Forum: Compiler & IDEs ADC Noise Canceler


von Lars (Gast)


Angehängte Dateien:

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

von Jörg Wunsch (Gast)


Lesenswert?

Und wo schaltest du die Interrupts auch ein?

von Lars (Gast)


Lesenswert?

Interrupts werden eingeschaltet
Einmal mit
sei();
vor der Endlosschleife. Andere Interrupts werden ohne Sleep Mode auch
ausgelöst. (Timer UART)

von Lutz Müller (Gast)


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

von Lutz Müller (Gast)


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)

von Lars (Gast)


Angehängte Dateien:

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

von Lars (Gast)


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

von Lutz Müller (Gast)


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

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.