Forum: Projekte & Code Frequenz, Drehzahl, 4x7-Segment LED, Multiplex-Betrieb


von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

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ß!

von Bastler (Gast)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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 :-)

von Bastler (Gast)


Lesenswert?

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!

von m.n. (Gast)


Lesenswert?

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