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
Besser du mißt die Periodendauer mit dem Timer (extern run). Josef
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ß
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.