mikrocontroller.net

Forum: Compiler & IDEs Frequenzauswertung mittels ext. Interrupt macht komisches


Autor: Jodel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich messe eine Frequenz mit Hilfe des externen Interrupts am Atmega32. 
Ich gehe her und lasse den Timer bis zum Überlauf laufen und zähle die 
Impulse in dieser Zeit. das Verfahren funktioniert auch super - bis zu 
einer Frequenz von ziehmlich genau 11,5kHz. Bis dahin wird die richtige 
Anzahl von Impulsen gezählt. Mein 16 Bit Timer läuft mit einem Teiler 
von 64 -> also 524ms bis zu einem Überlauf.
D.h. bei einer Frequenz von 1kHz werden 524 Impulse angezeigt.
Bei 12kHz bekoomme ich beispielsweise einen Wert von 12580 anstatt von 
6288...

Jetzt bin ich hergegangen und hab den Timer variiert. Das Ergebnis war 
sehr seltsam: Wenn ich den Timer mit einem Prescaler von 8 laufen lasse, 
müsste er bei 1kHz 65 Impulse zählen. Angezeigt werden allerdings 393. 
Stelle ich einen Prescaler von 256 ein zeigt er die richtigen 2097 
Impulse an.

Kann mir das jemand erklären? Bin grad bissl verzweifelt...

Herzlichen Dank!

MFG

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Programm?

Autor: Jodel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist ein bisschen lang - aber ich such mal die Auswertung selbst raus.. 
mom

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besser wäre es, wenn du aus dem ganzen Frequenzmess-Teil
ein eigenständiges Projekt machst, dort nachschaust, ob der
Fehler immer noch besteht und das dann postest.

Dein Fehler kann alles mögliche sein. Bis auf die Basis-
Ausgaberoutinen (egal ob LCD oder UART) würde ich mal
alles in Frage stellen.

Vorab: Mit welcher Frequenz taktet dein µC?
(Damit man mal selbst ein paar Rechnereien anstellen kann)

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

Bewertung
0 lesenswert
nicht lesenswert
Anbei das Programm - besser gesagt Auszüge davon! Ich hoffe das reicht 
an Code. Programmablauf:

Mit dem Timer wird die Frequenz gemessen. Ist dies erfolgt werden die 
jeweiligen Interrupts abgeschaltet - danach wird eine AD-Wandlung 
ausgeführt.
anschließend ein paar Berechnungen und eine Ausgabe.
Und dann geht das ganze wieder von vorne los.

MFG und vielen DANK!!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier
      TCCR1B &= (1<<CS10) | (1<<CS11) | (1<<CS12);      //Timer stoppen
macht alles mögliche, aber sicher nicht den Timer stoppen.

      TCCR1B &= ~( (1<<CS10) | (1<<CS11) | (1<<CS12) );      //Timer


Selbiges hier:
      GICR &= (1<<INT2);                    //ext. Int. abschalten
Das löscht alle Bits, ausser dem INT2 Bit

      GICR &= ~(1<<INT2);                    //ext. Int. abschalten

Zum Rest kann man nicht viel sagen. Dazu ist der Ausschnitt
nicht aussagekräftig genug.

Autor: Jodel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt!

Danek - Das seltsame ist nur, wenn ich die ~ davor schreib, funktioniert 
die Auswertung in meinem bisherigen Programm nicht mehr.

Hab jetzt mal als eignständiges Programm geschrieben - da läuft alles 
prima.. (werd ich ab sofort immer machen)

Ich begeb mich dann mal auf Fehlersuche in meinem Hauptprogramm!

dankeschön soweit!!

Falls es sonst noch Ideen für Fehlerquellen gibt - immer her damit :)

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

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Also ich hab das ganze jetzt nochmal bisschen getestet - leider mit 
mäßigem Erfolg!

Wenn ich die Frequenz per externem Interrupt auswerte habe ich folgenden 
Effekt:
Bei einem Timerprescaler von 64 kann ich bis ca. 11 kHz die Frequenz 
richtig auswerten. Ab dieser Frequenz wird bis 20kHz exakt der doppelte 
Wert angezeigt. Oberhalb von 20 kHz der dreifache Wert angezeigt. D.h. 
es wird genau doppelt bzw. dreimal so lange gemessen - und ich versteh 
absolut nicht warum.
Wird nun die Messzeit verlängert (höherer Prescaler) sieht man den 
Effekt erst bei einer höheren Frequenz, reziprok bei einem niedrigeren 
Prescaler ist der Effekt fürher zu sehen.

Ich hab mal den Quellcode angehängt - allerdings habe ich bei den ganzen 
Berechnungsroutinen lediglich die Funktionsrümpfe dastehen um das ganze 
etwas übersichtlicher zu halten. Wäre super wenn sich das mal jemand 
anschauen könnte und mir Tipps geben könnte - falls noch Informationen 
oder so gewünscht sind nur raus damit!

Herzlichen Dank und guten Rutsch.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Jodel (Gast)

>Bei einem Timerprescaler von 64 kann ich bis ca. 11 kHz die Frequenz
>richtig auswerten. Ab dieser Frequenz wird bis 20kHz exakt der doppelte
>Wert angezeigt. Oberhalb von 20 kHz der dreifache Wert angezeigt. D.h.

Zählerüberlauf?

MFG
Falk

Autor: Jodel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich versteh nicht genau was du meinst - es ist jetzt so, dass nach einem 
Zählerüberlauf(Interrupt) mit dem restlichen Programm fortgefahren 
werden soll.
Es hat allerdings den Anschein, dass das Programm bei best. Freuqenzen 
diesen Interrupt mal weglässt - warum auch immer...

MFG und vielen Dank

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.