Dann würde ich einen kleineren Prescaler verwenden und in der Timerinterruptroutine noch einen Zähler, der dann halt alle x mal eine Funktion aufruft.
MFG Moritz
Hallo Static,
Lad Dir doch mal dieses Programm runter.
https://www.roboternetz.de/phpBB2/dl...le&file_id=169
Es erstellt dir gleich den Quelllcode für die Timer.
Damit wirst Du feststellen dass bei 16MHz mit dem Timer0 keine Frequenz mit 1Hz möglich ist..
Du kannst aber 100Hz verwenden und damit Deine Drehzahl messen und dann einfach mal 100 nehmen.
Funktioniert bei hohen Drehzahlen ganz gut.
Gruß
m.artmann
Dann würde ich einen kleineren Prescaler verwenden und in der Timerinterruptroutine noch einen Zähler, der dann halt alle x mal eine Funktion aufruft.
MFG Moritz
So hab ich es dann auch gemacht, RCO. Mit 100Hz messen würde natürlich auch gehen, aber das ist eigentlich nicht nötig.
Hi,
hab sowas schonmal gemacht um einen Frequenzzähler zu bauen, der sollte nur bis 250Hz können, geht aber wesentlich höher, Habe dazu den impuls am eingang auch auf nen interrupt gemacht, damit ich im hauptprogramm mehr zeit habe und dann einfach 1mal pro sekunde (timer) nachgeschaut wie oft der interrupt kam. kann ja morgen mal bei interesse den code posten..
Ich machs jetzt auch mit Interrupts, da ich sonst angst habe Impulse zu verpassen. Hab aber noch Probleme mit dein scheiß Tastern , die liefern anscheind auf einmal keine sauberen Impulse mehr da müssen wohl doch Lichtschranken dran.
debounce doch: guck mal im handbuch nach oder hardwaremäßig mit kondensator!
Martin
Linus Torvalds, Entwickler von LinuxIch will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
Also die Sache mit der Timer-Berechnung kann man auch einfacher machen.
Beispiel:
8 MHz Quarz
Prescale = 1024
16 Bit-Timer = 65536 (8 Bit = 255)
8^6 / 1024 / 65536 = x
1/x = Zeit in Sec = 8,39 sec
Stellst Du nun den (16-Bit) Timer immer auf 57736 ein, bleiben ihm nur noch 7800 Takte bis zum Überlauf. Danach wird er wieder auf 57736 eingestellt und nicht auf null, wie er es sonst machen würde!
In Bascom also einfach
Timer1 = 57736
eingeben
Dann errechnet sich:
8^6 / 1024 / 7800 = x
1/x = 1,00 Sec
(...und ein paar Nachkommastellen)
Beim 8 Bit-Timer wird eben nicht bis 65536 gezählt, sondern nur bis 255. Deshlab wählt man hier ein anderen Prescale und einen anderen Vorwert (57736 geht also nicht beim 8 Bit-Timer!)
Oder anders gesagt
8-Bit = Byte
16-Bit = Word
Hoffe, das Hilft wenigstens für die Praxis!?
Meinst vermutlich 8 * 10^68^6 / 1024 / 65536 = x
1/x = Zeit in Sec = 8,39 sec
Ich erkenne hier keinen Unterschied zu meinem Vorschlag! Du verwendest halt einen größeren Prescaler. Wenn man genau rechnet, kommt man übrigens auf 7812,5! Deshalb habe ich ja gerade den 256 Prescaler gewählt, damit glatte Zahlen rauskommen!Stellst Du nun den (16-Bit) Timer immer auf 57736 ein, bleiben ihm nur noch 7800 Takte bis zum Überlauf.
7812,5 x 4 = 31250 (genau mein Wert)
Das nützt ja nix, der Timer geht nach dem Überlaufen von selber auf null! Schließlich zählt er ja hoch!Danach wird er wieder auf 57736 eingestellt und nicht auf null, wie er es sonst machen würde!
In Bascom also einfach
Timer1 = 57736
eingeben
Hab ich ja auch geschrieben, muss aber halt nach jedem Interrupt neu geschriben werden:Timer1 = Timervorgabe
MFG MoritzTimer1_isr:
Timer1 = Timervorgabe
'Hier passiert jetzt was mit deinem Zaehlerstand
Zaehlerstand = 0
Return
danke, die Software funktioniert jetzt ohne größere Probleme.
Lesezeichen