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


von Jodel (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Programm?

von Jodel (Gast)


Lesenswert?

Ist ein bisschen lang - aber ich such mal die Auswertung selbst raus.. 
mom

von Karl H. (kbuchegg)


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)

von Jodel (Gast)


Angehängte Dateien:

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!!

von Karl H. (kbuchegg)


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.

von Jodel (Gast)


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 :)

von Jodel (Gast)


Angehängte Dateien:

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.

von Falk B. (falk)


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

von Jodel (Gast)


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

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.