So schnell kann es gehen: gestern wußte ich noch nicht, wie man BASCOM schreibt und heute habe ich schon mein erstes Programm damit geschrieben ;-) Verwendet wurde die kostenlose Demo-Version mit 4K Code-Limit. Es reicht für einen reziproken Frequenzzähler mit ATmega328, wobei noch ca. 500 Byte frei bleiben. Gegenüber C gibt es einige Einschränkungen; insbesondere die Seiteneffekte beim Aufruf von Funktionen nerven nicht schlecht. Das kennt man schon garnicht mehr. Aktuell ist der Frequenzbereich auf 0,01 Hz - ca. 100 kHz begrenzt; schneller geht es mit BASCOM nicht. Die Ergebnisse sind immer 6-stellig, weshalb der ext. Quarz schon abgeglichen sein sollte oder besser ein TCXO verwendet wird. Ganz bequem kann man 'F_clock' auf einen sinnvollen Wert setzen: probieren und anpassen! Wer mag, kann das Programm noch für einen automatischen Vorteiler erweitern. Beispiele von mir dazu gibt es genug. Viel Spaß! Korrektur: bitte an den beiden Stellen, wo Timsk1.1 steht, auf Timsk1.0 ändern.
Als kleine Spielerei habe ich die Interruptverarbeitung optimiert, indem nur noch die Register gerettet werden, die offensichtlich benötigt werden. Ferner lassen sich Ausdrücke wie: "wert = wert + 1" durch "incr wert" beschleunigen. Die Obergrenze für Frequenzmessung steigt damit auf ca. 200 kHz. Neben Frequenz und Periode kann jetzt auch die Drehzahl ausgegeben werden. Die Ausgabe selber erzeugt nun einen formatierten String mit Dimensionsangabe. Daher ist nicht nur ein Print auf die serielle Schnittstelle, sondern auch z. B. eine Ausgabe auf ein angeschlossenes LCD möglich. Für die auf 4K Code begrenzte Version ist es besser, anstatt eines ATmega328 einen ATmega48/88 zu verwenden. Durch kürzere Adressierung wird deutlich Code gespart. Die gezeigte Version benötigt von einem ATmega48 rund 83%, wodurch noch Platz (knapp 700 Byte) für eigene Erweiterungen bleibt.
Die letzte Version ist noch einmal optimiert, indem beide Interruptroutinen nun komplett in Assembler geschrieben sind. Der Code wurde dadurch kleiner und die maximale Eingangsfrequenz liegt nun über 600 kHz mit einem ATmega48 @ 16 MHz. Das ist nicht schlecht!
Abschließend noch zwei Versionen mit Vorteiler. Eine einfache ohne Assembler-Befehle und eine bessere, die ohne Vorteiler knapp 1 MHz @ 20 MHz erreicht. Diese schafft mit passendem Vorteiler 0,005 mHz - 200 MHz. http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp12
m.n. schrieb: > Diese schafft mit passendem Vorteiler 0,005 mHz - 200 MHz. Ja, ein Vorteiler hat schon Vorteile. ;-) MfG Paul
Für hohe Frequenzen (> 10kHz) solltest Du besser fahren (weiter als 200kHz kommen), wenn Du statt Periodendauer die Impulse (mit dem ICP, ohne ICP-INterrupt) zählst.. Also prinzipiell - Timer1 mit dem ICP hochzählen, in der Overflow-ISR die Overflows mitzählen - Timer0 auf genau eine Sekunde Messzeit stellen (ISR für die Overflows) und starten Dabei beachten, dass zwischen diesen beiden Schritten auch schon Impulse anliegen (Anfangswert vom Timer1 bei der ersten Timer0-Auslösung am Ende abziehen). Wenn Du es gang gut machen willst, misst Du erstmal ungefähr, und benutzt dann eine der beiden Methoden (Periodendauer oder Torzeit wie oben beschrieben)
Paul Baumann schrieb: > Ja, ein Vorteiler hat schon Vorteile. > ;-) Sag ich doch. Ich hoffe, Du kannst beide gebrauchen ;-)
m.n. schrieb: > Sag ich doch. > Ich hoffe, Du kannst beide gebrauchen ;-) Ich habe schon vor langer Zeit einen Frequenzmesser gebaut, da brauchte ich auch beide. Aber: Trotzdem sehe ich mir die Quelltexte von Anderen gerne an, weil man meist etwas lernen kann, wie Ander das Problem lösen bzw. elegant umgehen. MfG Paul
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.