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.
Hi Dein ADC läuft mit 4MHz. Das ist viel zu schnell. Der ADC-Clock sollte zwischen 50 und 200kHz liegen. MfG Spess
Deinen Code habe ich nur ganz schnell auf strukturelle Probleme überflogen: Du lässt Interrupts zu ("sei") und aktivierst
1 | ldi temp,(1<<OCIE2) |
2 | out TIMSK,temp |
, verwendest aber keine ISR und hast keinen Eintrag in der Interrupt-Vektortabelle dafür!
@ 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
Unter "Prescaling and Conversion Timing": "...requires an input clock frequency between 50kHz and 200kHz..."
OK Danke an alle. Ich werde das mit dem Prescaler mal probieren. Danke Torsten
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 ...
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
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
Hi Es wäre günstig, wenn du mal das aktuelle Programm postest. MfG Spess
Kommt sofort Vergiss den Teil unterhalb von Init_Beep_Timer1: der wird nicht aufgerufen hab nur vergessen den zu löschen
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.
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.
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
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.
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.
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.
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.
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.
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.
>cpi ZL,SRAM_START+SampleMenge*2 ;prüfe, ob alles aufaddiert ist
Weiss nicht wo SRAM_START liegt, aber low(...) wäre besser
@ 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 ?
Im PWM-Mode wird abgewartet, bis die aktuelle Periode zu Ende ist. Im CTC-Mode wird der Wert sofort übernommen.
Hi Tritt das knacken auf, wenn du die Frequenz veränderst, oder auch bei konstanter Frequenz? MfG Spess
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 ..
Hi Noch was: Sind die Abstände konstant oder unregelmässig? MfG Spess
sie sind unregelmäßig ich schätze so zwischen 1 - 20 Sekunden ist alles mal dabei
hab gerade mal den sehr naiven Test gemacht und einen neuen Prozessor in den Sockel gesteckt. Leider ohne Erfolg
auf der Betriebsspannung habe ich durch das Schalten des OC1A Ausganges einen Ripple von +/- 0,2V Ist das ein Problem ?
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
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.
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
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.