Ziel des Projekts war die Entwicklung einer binären Uhr mit Anzeige- und Einstellmöglichkeiten für den Wochentag, die Uhrzeit und das Datum für die 5x5-Matrix des Microbit. Um die Ganggenauigkeit sicherzustellen, sollte ein preiswertes Real Time Clock-System verwendet werden.
Bemerkungen zur Hardware
Das verwendete RTC-System TinyRTC mit dem DS1307 ist sehr preiswert verfügbar. Es stellt sich aber heraus, dass es nicht richtig funktionierte. Erst durch die von Gerald Parak auf Amazon beschriebenen Modifikationen behielt das Modul auch beim Trennen vom Stromnetz die Uhrzeit. Da auf meinem Modul R7 nicht bestückt war, habe ich einfach den ausgelöteten R6 für R7 eingelötet.
Bemerkungen zum Einsatz des Calliope
Leider benutzt der Calliope einen Gyrosensor vom Typ Bosch BMX055, der die gleiche I2C-Adresse benötigt, wie der DS1307. Daher ist das Modul derzeit nicht am Calliope nutzbar.
Anzeige der Uhrzeit und des Datums
Sobald des System Strom erhält, wird die Uhrzeit aus dem RTC ausgelesen und binär angezeigt. Dazu wurde die Spalten des Displays als Uhrzeitmodus von links nach rechts wie folgt eingeteilt:
- 1. Spalte: Wochentag binär, beginnend bei Sonntag = 1, Montag = 2, usw.
- 2. Spalte: Stundenanzeige binär: LED unten ist 2^0, darüber 2^1 usw.
- 3. Spalte: Doppelpunkt als Sekundentaktanzeige
- 4. und 5. Spalte: Minutenanzeige binär, beginnend in der 5. Spalte unten rechts mit 2^0. Die LED in der vierten Spalte unten wird zur Darstellung von 2^5 = 32 verwendet.
Solange man den Taster B drückt, wird das Display als Datumsmodus genutzt und wie folgt geteilt:
- 1. Spalte: Tag binär, LED unten ist 2^0, darüber 2^1 usw.
- 2. Spalte: leer
- 3. Spalte: Monat binär, LED unten ist 2^0, darüber 2^1 usw.
- 4. Spalte: leer
- 5. Spalte: Jahr (zweistellig, also ohne 20) binär, LED unten ist 2^0, darüber 2^1 usw.
Stellen von Uhrzeit und Datum
Alle Angaben lassen sich wie folgt stellen:
- Drücken Taster A wechselt in den Modus 1 zum Stellen der Minuten. Das Display zeigt statt des blinkenden Doppelpunktes ganz oben einen Punkt. Drücken Taster B erhöht die Minutenanzeige zyklisch.
- Erneutes Drücken Taster A wechselt in den Modus 2 (Punkt in der mittleren Spalte rückt dabei eine Stelle nach unten) zum Stellen der Stunde. Drücken Taster B erhöht die Stundenanzeige zyklisch.
- Drücken Taster A wechselt in den Modus 3 zum Stellen des Wochentages. Das Display zeigt statt des blinkenden Doppelpunktes in der Mitte einen Punkt. Drücken Taster B erhöht die Wochentaganzeige zyklisch.
- Drücken Taster A wechselt in den Modus 4 zum Stellen des Tages. Das Display wechselt in den Datumsmodus und zeigt zusätzlich in der zweiten Spalte oben einen Punkt an. Drücken Taster B erhöht die Tagesanzeige zyklisch.
- Drücken Taster A wechselt in den Modus 5 zum Stellen des Monats. Der Punkt in der zweiten Spalte rutscht eine Stelle nach untern. Drücken Taster B erhöht die Monatsanzeige zyklisch.
- Drücken Taster A wechselt in den Modus 6 zum Stellen des Monats. Der Punkt in der zweiten Spalte rutscht eine Stelle nach untern. Drücken Taster B erhöht die Jahresanzeige zyklisch.
- Erneutes Drücken Taster A beendet den Einstellmodus. Die Sekunden werden automatisch auf 0 gesetzt und im RTC gespeichert.
Bemerkungen zu Quelltext
Der Quelltext lässt sich durch die Verwendung von Funktionen und Bitoperationen weiter optimieren. Ziel war es aber, stets nur mit den zur Verfügung gestellten Blöcken des grafischen Programmiersystems auszukommen. Im folgenden Text beginnt die Bit- und Registerzählung wie im Datenblatt auch mit Null.
Initialisierung
Einige Variablen werden initialisiert und mit Werten belegt. Anschließend wird der Sekundenwert aus dem RTC ausgelesen und zurückgeschrieben. Dabei wird das siebte (also letzte) Bit auf 0 gesetzt und der ggf. deaktivierte Oszilator des Moduls eingeschaltet. Anschließend wird im Register 7 die Bits 7 und 4 auf 1 und die anderen auf 0 gesetzt. Dadurch gibt das Modul den Sekundentakt am Pin SQ aus. Die Zählschleife liest alle Werte aus dem RTC und schreibt diese in das Feld in der Reihenfolge der RTC-Register, also Sekunde, Minute, Stunde, Wochentag, Tag, Monat, Jahr.
Hauptprogramm
In einer Endlosschleife erfolgt die Prüfung, ob die Taste A zum Stellen der Uhr gedrückt wurde. Diese Information befindet sich in der Variable merkerA. Zum Stellen werden alle Daten in das Feld eingetragen. Als erstes wird der Sekundenwert auf 0 gesetzt und die Anzeige gelöscht. Das Durchlaufen der sechs Einstellmodi erfolgt in der Zählschleife, wobei in Abhängigkeit vom Modus die entsprechende Anzeige erscheinen muss (erste Bedingung der Schleife). In der kopfgesteuerten Schleife wird nun in Abhängigkeit vom Modus der zu verändernde Wert sobald die Taste B gedrückt wurde erhöht und bei Überschreitung des jeweiligen Höchstwertes normiert. Außerdem erfolgt das Durchschalten der Hinweis-LED und das Weiterschalten bei Druck auf A. Die Pause dient der Entprellung der Tasten A und B. Sind alle Werte aktuell, so werden diese in der Zählschleife in die BCD-Darstellung umgerechnet und in den RTC geschrieben. Da Blockly keine Angabe des Registers zulässt, muss eine 16bit-Zahl geschrieben werden, die im vorderen Byte die Registernummer enthält! Anschließend wird der Einstellmodus verlassen.
Im Anzeigemodus angekommen wird solange Taste B gedrückt ist, die Datumsanzeige angezeigt, ansonsten die reguläre Zeitanzeige. Bei Taktwechsel an Pin P1 wird die Doppelpunktanzeige an-/aus geschaltet und dazwischen die genaue Zeit aus dem RTC ausgelesen und im Feld gespeichert. Damit sollte auch ein Schaltjahrwechsel korrekt erfolgen.
Funktionen
Die beiden Funktionen dienen der Anzeige von Uhrzeit (anzeigen) und datum (anzeigen2). Beide Funktionen schalten zunächst alle unnötigen Pixel aus. Anschließend werden die Anzeigen entsprechend der Feldwerte berechnet und die LED geschalten. Die Funktion "on button A pressed" wurde genutzt, um besser in den Einstellmodus zu gelangen. Sie stellt eine Art Interrupt Request dar.
Updates
Die TinyRTC-Platine kann am Anschluss SQ den Sekundentakt liefern. Dieser wird zu P1 geführt und zur Weiterschaltung sowie Sekundentaktanzeige genutzt. Außerdem wurden Initialisierungsbefehle für das Modul aufgenommen.
Comments
Please log in or sign up to comment.