Forum: Projekte & Code reziproker Frequenzzähler mit BASCOM-AVR


von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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!

von m.n. (Gast)


Lesenswert?

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

von Paul B. (paul_baumann)


Lesenswert?

m.n. schrieb:
> Diese schafft mit passendem Vorteiler 0,005 mHz - 200 MHz.

Ja, ein Vorteiler hat schon Vorteile.
;-)

MfG Paul

von Rainer U. (r-u)


Lesenswert?

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)

von m.n. (Gast)


Lesenswert?

Paul Baumann schrieb:
> Ja, ein Vorteiler hat schon Vorteile.
> ;-)

Sag ich doch.
Ich hoffe, Du kannst beide gebrauchen ;-)

von Paul B. (paul_baumann)


Lesenswert?

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
Noch kein Account? Hier anmelden.