Hi
Wie genau kann man mit einem AVR eine Uhr realisieren, wenn der AVR noch
viele andere Aufgaben übernehmen muss?
Beispielsweise Ansteuerung eines Displays, WAV-Ausgabe, Kommunikation
teilweise mit Software emulierten Protokollen.
@ screw (Gast)
>Wie genau kann man mit einem AVR eine Uhr realisieren, wenn der AVR noch>viele andere Aufgaben übernehmen muss?
Sehr genau, 1ppm wenn es sein muss. Das macht im wesentlichen ein Timer.
Und wenn man die Grundlagen für den Interrupt beachtet, passiert da
nix.
AVR - Die genaue Sekunde / RTC>Beispielsweise Ansteuerung eines Displays, WAV-Ausgabe, Kommunikation>teilweise mit Software emulierten Protokollen.
Das sind alles Sachen, die in einem soliden Programm dennoch nicht dazu
führen dürfen, dass Interrutps verschluckt werden.
MFG
Falk
Mit Timern. Die laufen nebenher und zählen bei jedem Schritt ein
Register hoch. Wenn das überläuft oder einen bestimmten Wert erreicht
(z.B. jede Sekunde) wird ein Interrupt aufgerufen, der dann deine
Uhrzeit um eins erhöht.
Wenn der Rest zeitkritisch ist, sollte dieser Interrupt natürlich
möglichst kurz sein. Aber da der Controller sich "merkt" wenn ein
Interrupt aufgetreten ist bis er dann wirklich ausgeführt wird, kannst
du für bestimmte Sachen die Interrupts auch kurz aus- und dannach wieder
einschalten und so schlimm ist es ja nicht, wenn die Sekunde mal 100µs
später umschaltet ;)
Gut, dann kann ich das ja mit dem Hauptprozessor machen.
Ansonsten hätte ich nämlich einen extra Prozessor für die DCF77
Dekodierung und Uhrenfunktion genommen. z.B. einen kleinen Tiniy, der
dann vom Hauptprozessor einfach ausgelesen wird, wenn die Uhrzeit
gebraucht wird.
Das DCF 77 würde ich ohnehin nur bei einem extra "uhrenprozessor"
realisieren. Damit es sich wenigstens lohnt.
Wenn ich nur den Hauptprozessor verwende, holt er sich mehrmals am Tag
die Uhrzeit über die ISM Funkstrecke.
Sofern es grade keine technischen Probleme gibt.
Über die ISM Funkstrecke kann das Gerät nicht nur die Zeit holen,
sondern auch ins Internet. Über ein am Server oder Router
angeschlossenes Funk-RS232 Modul und ein Phyton Script.
Achja, der Internetzugang wird benötigt, um den Kalender zu
synchronisieren.
Es wird ein ganz besonderer Wecker, der mir morgens beim Aufstehen auf
dem Display schon anzeigt, was den Tag über so ansteht.
Er berücksichtigt ebenfalls Feiertage, meinen Schichtplan und
Urlaubstage.
screw schrieb:> Das DCF 77 würde ich ohnehin nur bei einem extra "uhrenprozessor"> realisieren. Damit es sich wenigstens lohnt.
Das muss ja nicht sein. Viele AVRs haben eine "Input Capture"-Funktion,
wo man per Hardware den Zeitpunkt eines externen Ereignisses
registrieren kann. Es ist dann nicht mehr nötig, zeitnah eine ISR zu
starten, um den Timerwert auszuwerten. Ausgewertet wird, "wenn Zeit ist"
- im günstigsten Fall halt nur einmal pro Sekunde.
Hmm, diese Input Captur Funktion habe ich noch nicht verwendet.
Ich habe einen DCF77 Decoder programmiert. Solange das Signal auf Low
ist, wird ein Zähler hochgezählt. Jenachdem in welchem Bereich der
Zähler ist, wird es dann als 0 oder 1 Signal interpretiert. Kurze Spikes
z.B. durch Funkenstörungen werden toleriert.
Die decodierten Bits werden dann in einen 64 Bit langen Speicherbereich
reinkopiert. Kommt der Minutenimpuls, wird ausgewertet. Das Ganze wird
mehrmals gemacht. Wenn dann die Empfangen Werte mehrere Minuten
zusammenpassen, wird das dann in die Uhr übernommen.
De Uhr ist bei mir auch nur ein Timerinterrupt, der einen
Millisekundenzähler hochzählt. Die Decodierung der Millsekunden seit
Tagesbeginn in Stunde, Minute, Sekunde wird erst bei Bedarf gemacht.
Wenn der AVR sonst nix zu tun hat, klappt das wunderbar. Ich war mir nur
nicht sicher, was passiert, wenn ich eine hohe Auslastung des AVR mit
anderen Aufgaben habe.
Detlev T. schrieb:> Viele AVRs haben eine "Input Capture"-Funktion,> wo man per Hardware den Zeitpunkt eines externen Ereignisses> registrieren kann.
Für DCF77 völlig ungeeignet. Wenn das Modul aufgrund von Störungen
spinnt, legt es den ganzen Controller lahm. Das DCF77-Signal kann von
einem ohnehin laufenden Timer-Interrupt kontrolliert werden.