Forum: Mikrocontroller und Digitale Elektronik Frequenzzähler mit Counter-Überlauf


von Chris (Gast)


Lesenswert?

Hallo,

Kürzlich habe ich ein Assembler Programm für den AT90S2313 geschrieben,
mit dem ein einfacher Frequenzzähler entstehen sollte. Das ganze hat
funktioniert mit 1s Meßzeit, realisiert per Warteschleife im
Hauptprogramm und Zählen der Überläufe des 16-Bit-Counters per
Überlauf-Interrupt, dann Auslesen der beiden Counter-Bytes. Die
Genauigkeit sollte 32 Bit betragen. Klar, mehr als 5MHz lassen sich so
nicht messen. Dann ist mir aufgefallen, daß bei jedem Interrupt sich
die Meßzeit verlängern muß, da zusätzlich die Befehle der
Interruptroutine beim Überlauf ausgeführt werden. Je höher der Meßwert,
desto größer die Ungenauigkeit nach oben hin. Wie würde man so etwas
korrekt programmieren? Falls der 8-Bit-Timer für die Meßzeit
herangezogen würde, könnten zwei Interrupts etwa gleichzeitig auftreten
oder man könnte welche verlieren. Die Grobmethode wäre das Vermindern
von Werten der Warteschleife durch die Interruptroutine. Also eine
Korrektur. Aber je nach Register-Überlauf ist der Wert für die
Verminderung auch nicht immer bekannt. Die Verwendung von Polling
bringt vermutlich ähnliche Probleme. Jedenfalls hat Kollege Sprut über
seinen Zähler mit dem PIC16F84 von Problemen und Tricks beim Auslesen
des Timer0 bei seinem 50MHz-Zähler berichtet aber nicht näher
ausgeführt.
http://www.sprut.de/electronic/pic/projekte/frequenz/freq.htm
Allerdings sieht in der PIC-Welt manches anders aus.
Ich bitte um Eure Ideen.

Gruß Chris

von Josef (Gast)


Lesenswert?

Besser du mißt die Periodendauer mit dem Timer (extern run).

Josef

von Chris (Gast)


Lesenswert?

Hallo Josef,

damit wären wir beim reziproken Frequenzzähler, der aber erst in einem
späteren Projekt geplant ist. Der eignet sich ja speziell, um niedrige
Frequenzen mit hoher Auflösung zu messen. Im oben genannten Fall sollen
aber Eingangsimpulse gezählt werden, so lange das Zähltor offen ist und
dieser Wert dann angezeigt werden. So wie man das klassisch mit CMOS-
oder TTL-Bausteinen früher als aufwändiges Bauprojekt gemacht hat. Die
geringe Auflösung bei niedrigen Frequenzen stört mich dabei nicht.

Gruß

von Peter D. (peda)


Lesenswert?

Wie Du schon richtig erkannt hast, funktionieren Warteschleifen nur ohne
Interrupts exakt.

Der 2313 hat ja 2 Timer, also kannst Du sie auch benutzen, einer als
Zeitbasis, der andere als Zähler.

Der Trick ist nur die Kaskadiereung per Softwareregister im Interrupt.

Z.B. bei T0 liest man zuerst das Highbyte (Softwareregister) und dann
den Timer aus.
Wenn der Timer nahe 0 ist (<0x80), kann es aber sein, daß just nach dem
Lesen des High-Registers ein Interrupt erfolgte und dieses hochgezählt
hat. Dann liest man es nochmal aus und alles ist in Butter.


Peter

von Bernhard S. (bernhard)


Lesenswert?

@Chris

Ich habe mich auch mit diesem Problem beschäftigt,
anfangs dachte ich, dass das Einganssignal einfach einen Interrupt
auslösen sollte um die Impulse zu zählen, aber das war der falsche Weg,
da die Interruptverarbeitung zu viele kostbare Prozessor-Takte
benötigte.

Die Lösung war: Einen 2-Byte-Timer extern takten lassen

Bis 5 MHz:

http://www.mikrocontroller.net/forum/read-4-230466.html

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.