Gast
#186454
Hallo Forum, für meinen in Bau befindlichen Verstärker hab ich mir diese Kombination aus Real Time Clock und Scheduler gebastelt. Die Real Time Clock kommt ohne zusätzlichen Uhrenquarz aus. Die Uhrzeit wird mit Hilfe eines Timers mit Compare-Interrupt aus der normalen Oszillator-Frequenz gewonnen. Das beiliegende Demo-Programm ist für einen 3,6864MHz Quarz ausgelegt. Andere Frequenzen sollten sich relativ einfach über andere Prescaler / Compare-Match Kombinationen realisieren lassen. Im Moment wird ein 8-Bit Timer verwendet. Mit einem 16-Bit Timer sollte es möglich sein aus nahezu jeder üblichen Quarz-Frequen eien "genaue Sekunde" zu generieren. Außerdem lässt sich die RTC im Headerfile für unterschiedlich viele Interrupts pro Sekunde konfigurieren. Im Moment werden pro Sekunde 100 Interrupts ausgelöst. Eine so hohe Auflösung mag für die reine Uhr Funktionalität nicht nötig sein, ist aber für den Scheduler von Interresse, aber dazu später mehr. Die RTC stellt Jahr, Monat, Tag, Stunde, Minute, Sekunde und Sekundenbruchteil zur Verfügung. Außerdem gibt es ein paar Zusatzfunktionen um aus dem Datum den Wochentag zu ermitteln (die Berechnung erfolgt mit Hilfe des Doomsday Algorithmusses), ein beliebiges Datum mit der momentanen RTC-Zeit zu vergleichen, usw. Der Scheduler nutzt kein Array fester Größe um die zu erledigenden Aufgaben zu speichern sondern allokiert dynamisch Speicher für jeden Eintrag der hinzugefügt wird. Um einen Eintrag hinzuzufügen übergibt man dem Scheduler die Callback-Funktion, den Ausführungszeitpunkt und einen zusätzlichen benutzerdefinierbaren Parameter. Als Rückgabe bekommt man eine ID, die den Task eindeutig identifiziert. Mit dieser ID kann man Ausführungszeit, Übergabe-Paramter usw. später noch ändern. Die Callback-Funktion bekommt neben dem benutzederfinierbaren Parameter noch den Ausführungszeitpunkt übergeben. Dieser kann dann geändert werden. Über den Rückgabewert kann die Funktion steuern, ob sie nach der Ausführung aus der Liste gelöscht wird oder zum geänderten Zeitpunkt erneut ausgeführt werden soll. Der Ausführungszeitpunkt einer Aufgabe kann den gesamten Wertebereich der Real Time Clock umfassen. Also in 100ms oder in 5 Jahren. Diese Flexibilität hat leider ihren Preis: Ein Listeneintrag umfasst 17 Bytes zusätzlich benötigt malloc() noch 2 weitere Bytes, so dass pro Eintrag 19 Byte SRAM belegt werden. Die Uhr kann auch ohne den Scheduler verwendet werden, dafür muss nur ein #define in der rtc.h auskommentiert werden (hab ich aber noch nicht getestet). Das Demo-Programm veranschaulicht die wichtigsten Funktionen. Außerdem habe ich mich bemüht das ganze einigermaßen sorgfältig zu kommentieren :) Würde mich über Feedback / gefunden Bugs freuen :) mfg ape