Die gezeigte Schaltung benötigt nur wenige Bauteile, um einen reziproken Frequenzzähler mit 4-stelliger LED-Anzeige zu bauen. Eingangsfrequenzen von 0,1Hz – ca. 300kHz bzw. Drehzahlen von 6,000Upm – 999,9kUpm können gemessen werden. Das reziproke Meßverfahren sorgt dabei für schnelle Meßraten bei hoher Auflösung. Als Prozessor reicht ein ATmega48. Die .hex-Datei kann aber auch für einen ATmega88 verwendet werden. Die maximale Meßrate ist auf 3 Messungen/s eingestellt. Minimal ist eine Periode notwendig, sodass z.B. bei Frequenzen von 1Hz 'nur' jede Sekunde ein neues, 4-stelliges Ergebnis angezeigt wird. Bei Frequenzen >= 1kHz oder Drehzahlen >=1kUpm signalisiert eine LED, dass das Ergebnis mit dem Faktor 1000 abzulesen ist. Um bei konstanten Signalen die laufenden Messungen zu signalisieren, blinkt der '.' ganz rechts im Takt der Messung und bleibt dabei ca. 1/6s eingeschaltet. Bei fehlendem Eingangssignal oder bei Frequenzen < 0,100Hz erscheint in der Anzeige der Text 'tout'. Um unterschiedliche LED-Anzeigen und ggf. invertierende Treiber zu berücksichtigen, kann man die Pegel per #define anpassen. Ebenso können die Taktfrequenz, die Mutiplexrate oder auch die Skalierung des Ergebnisses angepaßt werden. Die Kommentare im Quelltext weisen auf diese Optionen hin. Viel Spaß!
Sorry für mein rumgemäkelt, aber warum ist eine lokale Variable in main() volatile? Wer außerhalb hat darauf Zugriff? Nur mal so zum nachdenken. Nicht immer wenn man INTs benutzt, braucht man das. Nur wenn eine Variable jederzeit von einer ISR geändert werden kann, dann muß man das dem Compiler per "volatile" sagen. Vielleicht ist der aber auch so schlau zu merken, daß das im konkreten Fall gar nicht sein kann.
Bastler schrieb: > Sorry für mein rumgemäkelt, aber warum ist eine lokale Variable in > main() volatile? Solange weder die Codegröße noch die Ausführungsgeschwindigkeit eine Rolle spielen vermeidet man damit jegliche Fehlfunktion durch Opimierung, inbesondere wenn noch hier und dort Veränderungen probiert werden. Folglich habe ich auch viele andere Variablen global gelassen und als volatile deklariert. Die Codegröße liegt mit volatile bei 2932 Byte und ohne bei 2918. Geld für ungenutzten Speicher gibt es nicht zurück :-)
Es ging eigentlich nicht um die Codegröße, sondern um die Frage, ob man verstanden hat, was
1 | volatile
|
macht. Das ist kein Voodoo-Zauber gegen Fehlfunktion, sondern das was klar definiertes für das oben beschriebene Problem. Aber das will nicht jeder wissen. Schade!
Bei einer 4-stelligen Anzeige sollte ein Quarztakt eigentlich schon ohne Abgleich brauchbare Resultate liefern. Für den, der es perfekt mag, gibt es eine Version mit automatischen Abgleich auf ein externes 1Hz Referenzsignal, vorzugsweise das 1pps-Signal aus einem GPS-Empfänger. Die aktuelle Version ist hier zu finden: http://www.mino-elektronik.de/7-Segment-Variationen/LCD.htm#led4
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.