www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik ADC an ATMega16 hat "Aussetzer"

Autor: Torsten B. (torty)
Datum:
Angehängte Dateien:

Hallo

Seit einigen Tagen brüte ich über folgendem Problem und komme nicht
weiter:

Mit einem ATMega16 möchte ich über den ADC0 eine Spannung (variabel über
ein Poti) messen und mit dem Wert einen Ton (Rechteck CO1A)
in der Frequenz modulieren. Ausgabe über Kollektorstufe und Kopfhörer.
Ich habe das Programm sehr ausführlich kommentiert, damit schnell klar
wird, was passiert.

Um noch mehr Rauschen zu eleminieren, werden bei jedem Durchlauf 8
Messungen gemacht und der gleitende Mittelwert daraus gebildet.

Hardwareseitig habe ich Vcc mit 2uF entkoppelt, AVcc über 47Ohm an Vcc
angeschlossen und mit 100nF entkoppelt. AREF ist ebenfalls mit 100nF
entkoppelt.
Die zu messende Spannung kommt im Testaufbau von einem 100k Poti und
wird über einen Tiefpass an ADC0 geführt. Die Werte des Tiefpasses habe
ich nicht mehr im Kopf (bin auf der Arbeit), aber die Grenzfrequenz lag
bei ca 3kHz.

Der uC läuft mit 4MHz.

Problem:

Die Spannung wird zwar vom ADC gemessen und auch in die Timer Register
geschrieben, jedoch kommt es während der Laufzeit immer wieder zu kurzen
Knackimpulsen.
Ich kann mir leider nicht mehr erklären, woher das kommt.
Wenn ich den Timer ohne ADC "piepen" lasse, ist alles OK. Kein knacken
im Kopfhörer zu vernehmen.

Hat die Software einen Bug ?
Wie würdet Ihr die Hardware für diese Aufgabe aufbauen ?

Mir ist klar, dass auch mit guter Filterung nicht ständig das gleiche
Sampleergebnis ausgegeben wird, auch wenn das Poti nicht verändert wird.
 Wenige LSBs Schwankungen würden jedoch nicht zu einem Aussetzen führen,
sondern lediglich die Frequenz anheben bzw. senken.

Danke für jeden ernst gemeinten Beitrag.
Torsten

Info für Flieger: Es soll ein elektronisches Variometer werden. Der
Luftdrucksensor ist noch in der Post.
Autor: spess53 (Gast)
Datum:

Hi

Dein ADC läuft mit 4MHz. Das ist viel zu schnell. Der ADC-Clock sollte
zwischen 50 und 200kHz liegen.

MfG Spess
Autor: Drachenbändiger (Gast)
Datum:

Deinen Code habe ich nur ganz schnell auf strukturelle Probleme
überflogen: Du lässt Interrupts zu ("sei") und aktivierst
ldi temp,(1<<OCIE2)
out TIMSK,temp
, verwendest aber keine ISR und hast keinen Eintrag in der
Interrupt-Vektortabelle dafür!
Autor: Torsten B. (torty)
Datum:

@ Drachenbändiger :

Das stimmt, ich  habe noch eine ISR im Code gehabt, die aber damit
nichts zu tun hatte. Ich habe den Code aufgeräumt, damit er für Euch
schneller zu lesen ist. Die Int Aktivierung habe ich leider vergessen.

@Spess:
Aha, das habe ich nicht gewusst.
Ich gehe davon aus, dass Du nicht die Frequenz meinst, mit der ich den
ADC starte. Hier habe ich ja "polling" angewendet.

Wo kann man das mit der ADC Clock lesen ? Habe ich das im DAtenblatt
übersehen, oder sind das Erfahrungswerte ?

Danke Torsten
Autor: Drachenbändiger (Gast)
Datum:

Unter "Prescaling and Conversion Timing":
"...requires an input clock frequency between 50kHz and 200kHz..."
Autor: Torsten B. (torty)
Datum:

OK Danke an alle.
Ich werde das mit dem Prescaler mal probieren.

Danke
Torsten
Autor: Torsten B. (torty)
Datum:

Hallo nochmal

Hatte mich schon gefreut, weil das mit dem Prescaler schon logisch
klang.
Hat das Problem jedoch leider nicht gelöst. Die Aussetzer beim Piepton
sind noch immer da.

Könnt Ihr noch einmal tief in Euch gehen ?? ;-)

Bin dankbar für jeden ernsten Tip

Danke
Torsten

Ich nehme an, dass der Prescaler NICHT vor jeder Conversation neu
gesetzt werden muss, oder ?

Hab gerade noch einmal die Taktung des Mega auf 1MHz gesetzt. Die
Aussetzer werden auch länger ! Vielleicht hilft das jemandem ...
Autor: spess53 (Gast)
Datum:

Hi

>out OCR1AL,Pressure_DATAL  ;Low-Byte mit Offset an Timer1
>out OCR1AH,Pressure_DATAH  ;High-Byte mit Offset an Timer1

Falsch. Das H-Register muss vor dem L-Register schrieben werden.

MfG Spess
Autor: Torsten B. (torty)
Datum:

Hi Spess

Danke auch für dieses wichtige Detail. Vielleicht brauche ich es später
noch mal. Das Stottern meiner Pieps hat es leider noch immer nicht
beseitigt.

Hast Du noch eine Idee ? Oder kommt DIr etwas koisch vor.
Bin die nächsten Stunden noch am Rechner. Wenn DU also noch Fragen hast
..
GERNE :-)

Ich hab den Vorteiler übrigens jetzt auf 32 gestellt -> ADC Clock 125kHz
@ 4MHz
Autor: spess53 (Gast)
Datum:

Hi

Es wäre günstig, wenn du mal das aktuelle Programm postest.

MfG Spess
Autor: Torsten B. (torty)
Datum:
Angehängte Dateien:

Kommt sofort

Vergiss den Teil unterhalb von
Init_Beep_Timer1:

der wird nicht aufgerufen
hab nur vergessen den zu löschen
Autor: Torsten B. (torty)
Datum:

Hab mal das Oszi an den OC1A Pin gehängt.
Der Timerausgang bleibt manchmal auf High-Pegel und manchmal auf
Low-Pegel stehen.
Vielleicht hilft das.
Autor: spess53 (Gast)
Datum:

Hi

>moreSamples: ...

Da fehlt ein 'ret'

MfG Spess
Autor: Torsten B. (torty)
Datum:
Angehängte Dateien:

Hast Recht und das wäre ein selten blöder Fehler gewesen.
In diesem Fall hat es aber nur zur Folge, dass der Mittelwert zwei Mal
in Folge berechnet wird.
Er stottert leider noch immer.
:-)

Hab noch mal die im Augenblick laufende Version mit Kommentaren
angehängt.
Autor: spess53 (Gast)
Datum:

Hi

>In diesem Fall hat es aber nur zur Folge, dass der Mittelwert zwei Mal
>in Folge berechnet wird.

Nein. Dein Stack läuft voll. Und dann wird der Controller unberechenbar.

MfG Spess
Autor: Torsten B. (torty)
Datum:

Ooops, DU hast natürlich Recht. Der Stack ...
Habs aber gerade noch einmal mit ret laufen lassen. Es macht im
akustischen Fehlerbild keinen Unterschied.

sobald ich die Funktion
Ring_beschreiben

nicht aufrufe, stottert nichts mehr. Aber dann kommen logischerweise
auch keine Werte vom ADC an.
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum:

Also

entweder

* du implementierst jetzt endlich mal eine ISR für den Output Compare
  für den Timer 2

* oder du verzichtest darauf, den Output Compare Interrupt für
  Timer 2 freizugeben

* oder du nimmst das sei raus, weil du ja keine Interrupt Handler hast


Aber eines von den 3-en wirst du wohl machen müssen, wenn du nicht
willst, dass dir der Timer 2 bei einem Output Compare einen Sprung in
die Wüste veranstaltet und du darauf angewiesen bist, dass der µC
irgendwie wieder von selbst auf die Füsse fällt und nach einer
Neuinitialisierung wieder den Betrieb aufnimmt nur um dann kurze Zeit
später durch einen nicht korrekt aufgefangenen Interrupt wieder aus der
Bahn geschmissen zu werden.
Autor: Torsten B. (torty)
Datum:

Ist doch alles hinter ";" gesetzt und damit unwirksam.

Sorry, in der Version eben noch nicht.

Hier noch einmal die aktuelle.


hab jetzt mal nur die Zeilen

  ;  sbi ADCSRA,ADSC

;warten2:       sbic ADCSRA,ADSC
;    rjmp warten2

in

Ring_beschreiben gelöscht.

Die Funktion ist es also auch nicht.

Einzig das Starten und das Warten auf den ADC sorgen hier für Probleme.

Hoffe, ich starpaziere Eure Nerven nicht zu sehr.
Autor: Torsten B. (torty)
Datum:
Angehängte Dateien:

hier die aktuelle Version
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum:

Wenn du Ring_beschreiben aufrufst, welchen Wert hat dann der Z-Pointer?

Bedenke bei deiner Antwort auch, dass der Z-Pointer durch die
nachfolgende Mittelwertbildung erneut verändert wird. Es ist daher
unklug davon auszugehen, dass der Z-Pointer bei Betreten der Funktion
schon richtig stehen wird.
Autor: Andy H. (vinculum) Benutzerseite
Datum:

Und dann würde ich mir nochmal angucken, wie man den Timer 1 neu setzt,
bevor er abgelaufen ist. Ich nehme all an, dass deine Schleife umein
vielfaches schneller ist, als der Output von Timer1.
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum:

Karl heinz Buchegger schrieb:
> Wenn du Ring_beschreiben aufrufst, welchen Wert hat dann der Z-Pointer?
>
> Bedenke bei deiner Antwort auch, dass der Z-Pointer durch die
> nachfolgende Mittelwertbildung erneut verändert wird. Es ist daher
> unklug davon auszugehen, dass der Z-Pointer bei Betreten der Funktion
> schon richtig stehen wird.

Ich ziehe meinen Einwand zurück.
Du pusht und popst den Z-Pointer korrekterweise in der
Mittelwertberechnung.
Autor: Andy H. (vinculum) Benutzerseite
Datum:

>cpi ZL,SRAM_START+SampleMenge*2  ;prüfe, ob alles aufaddiert ist

Weiss nicht wo SRAM_START liegt, aber low(...) wäre besser
Autor: Torsten B. (torty)
Datum:

@  Karl Heinz:
Z-Pointer wird beim ersten Mal gesetzt (auf SRAM_START)

bei allen anderen Durchläufen wird er nicht verändert, da er in
Gleitender_Mittelwert_10Bit durch  push/pop nicht verändert wird.

@ Andy:

Mir war bis jetzt nicht bewusst, dass man da was beachte muss.
Werde ich aber nachschlagen.
Ich glaube jedoch nicht, dass das hier das Problem ist, weil das
Programm ja ohne die Zeilen

            sbi ADCSRA,ADSC    ;ADC starten

warten2:    sbic ADCSRA,ADSC
      rjmp warten2    ;warten bis fertig

in
Ring_beschreiben

auch ohne Stottern läuft.

Wenn es am Timer liegen würde, sähe das Problem doch auch anders aus,
oder ?
Autor: Andy H. (vinculum) Benutzerseite
Datum:

Im PWM-Mode wird abgewartet, bis die aktuelle Periode zu Ende ist.
Im CTC-Mode wird der Wert sofort übernommen.
Autor: spess53 (Gast)
Datum:

Hi

Tritt das knacken auf, wenn du die Frequenz veränderst, oder auch bei
konstanter Frequenz?

MfG Spess
Autor: Torsten B. (torty)
Datum:

leider auch, wenn ich die Finger vom Poti lasse.

Die Frequenz ist dann auch (zumindest hörbar konstant)

Ich dachte zuerst auch, dass es eventuell höherfrequente Impulse vom
Schleifer des Potis sein könnten "Bürstenfeuer" sozusagen ..
Autor: spess53 (Gast)
Datum:

Hi

Noch was: Sind die Abstände konstant oder unregelmässig?

MfG Spess
Autor: Torsten B. (torty)
Datum:

sie sind unregelmäßig

ich schätze so zwischen 1 - 20 Sekunden ist alles mal dabei
Autor: Torsten B. (torty)
Datum:

hab gerade mal den sehr naiven Test gemacht und einen neuen Prozessor in
den Sockel gesteckt. Leider ohne Erfolg
Autor: Torsten B. (torty)
Datum:

auf der Betriebsspannung habe ich durch das Schalten des OC1A Ausganges
einen Ripple von +/- 0,2V
Ist das ein Problem ?
Autor: spess53 (Gast)
Datum:

Hi

>auf der Betriebsspannung habe ich durch das Schalten des OC1A Ausganges
>einen Ripple von +/- 0,2V
>Ist das ein Problem ?

Nicht unbedingt. Ich hoffe aber, das dein Controller ordentlich
abgeblockt ist.
Ehrlich gesagt, fällt mir im Moment nicht mehr allzuviel ein.

MfG Spess
Autor: Andy H. (vinculum) Benutzerseite
Datum:

Also nochmal der CTC mode - wie oben schon gesagt:

If the new value written to OCR1A or ICR1 is lower than the current
value of
TCNT1, the counter will miss the compare match. The counter will then
have to count to its maximum value (0xFFFF) and wrap around starting at
0x0000 before the compare match can occur.
In many cases this feature is not desirable. An alternative will then be
to use the fast PWM mode using OCR1A for defining TOP (WGM13:0 = 15)
since the OCR1A then will be double buffered.

Da du ständig auf OCR1A schreibst, wird dieser Zustand öfter passieren.
Du musst also PWM mode nehmen. Dass der ADC trotz der Filterung im WErt
schwankt, musst du mit einkalkulieren.
Autor: spess53 (Gast)
Datum:

Hi

Doch noch eine Frage um letzte Klarheiten zu beseitigen: Im Titel hast
du von Aussetzern geschrieben (im Text allerdings von Knacken). Sind es
wirklich Aussetzer? Und wenn ja, wie lang etwa?

MfG Spess
Autor: Heiko (Gast)
Datum:

Was mir spontan einfällt, ist daß der ADC für einen Eingangswiderstand
von 10K optimiert ist. Vielleicht ist dein 100K Poti zu groß um die
Eingangskapazität zuverlässig zu laden.
Autor: spess53 (Gast)
Datum:

Hi

Die Störungen gibt es, lt. Torsten, auch, wenn die Eingangsspannung
nicht geändert wird. Da wird auch nichts umgeladen.

@Andy In diese Richtung geht meine Vermutung auch.

MfG Spess
Autor: uwegw (Gast)
Datum:

Ich vermute auch den compare miss als Ursache. Bei 4MHz und prescaler 8
braucht der Timer immerhin ~130ms um überzulaufen... das könnte echt gut
hinkommen.
Autor: Torsten B. (torty)
Datum:

Liebe Gemeinde

Ich möchte allen Beteiligten sehr herzlich für Ihre Zeit und Mühe
danken.

Ich hatte heute morgen zwar nur wenige Minuten Zeit die letzten Beiträge
zu lesen, umzusetzen und zu testen, aber allem Anschein nach hat Andy
mit seiner CTC / Fast PWM Einschätzung Recht gehabt. Ich habe die Bits
gesetzt und die Schaltung arbeitet, wie ich es erwartet habe. Alles gut.

Danke aber auch an alle anderen, da ich auf diese Weise auf eine Menge
anderer Fehler aufmerksam geworden bin, die wahrscheinlich später zu
Problemen geführt hätten.

Grüße
Torsten

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email ü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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net