www.mikrocontroller.net

Forum: Compiler & IDEs ADC Noise Canceler


Autor: Lars (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wo schaltest du die Interrupts auch ein?

Autor: Lars (Gast)
Datum:

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

Autor: Lutz Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lutz Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Lars (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lutz Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.