Calliope, verschiedene Echtzeituhren und MicroBlocks

Ich freue mich sehr, euch eine universelle Ansteuerung für verschiedene Echtzeituhren mit MicroBlocks zeigen zu können. Bei vielen Experimenten und Langzeitmessungen mit dem Calliope mini sollen Datum und Uhrzeit als Größen verfügbar sein und zusammen mit anderen Messwerten auf einem Display angezeigt oder aufgezeichnet werden. Die Uhrzeit kann als Parameter einen Wecker auslösen oder eine Messung starten. Eine Echtzeituhr (Real Time Clock) ist ein digitales Modul, bei dem die Zeit einmal eingestellt wird und anschließend batteriegepuffert weiterläuft. Mit einer Echtzeituhr ist die physikalische Zeit deswegen auch nach einem Neustart des Systems verfügbar.

In zwei Beiträgen Calliope, RTC DS1307 und MicroBlocks und Calliope, RTC PCF85063 und MicroBlocks hatte ich euch bereits zwei unterschiedliche Echtzeituhren vorgestellt und dafür auch zwei unterschiedliche Ansteuerungen programmiert. Gerade für Einsteiger und Nicht-Profis ist es aber schwierig, bei den vielen ganz unterschiedlichen Modulen und verschiedenen Herstellern den Überblick zu behalten. Ich habe deswegen eine universelle Ansteuerung entwickelt, die mit mehreren dieser Chips zurechtkommt.

Viele der Echtzeituhren werden über den i2c-Anschluss mit dem Microcontroller verbunden, und genau solche sind mit dem Calliope mini über den linken Grove-Anschluss A0 einfach zu verwenden. Die neue Ansteuerung funktioniert für die gängigen RTC-Chips DS1307, DS3231, PCF8523, PCF8563, PCF85063, RV1805 … und weitere könnten folgen. Die Ansteuerung erkennt selbstständig, welchen RTC-Chip ein Echtzeitmodul verwendet, und stellt die notwendigen Parameter in der Software automatisch ein.

Für den Informatik-Unterricht ist es übrigens eine besonders herausfordernde Aufgabe, verschiedene Echtzeituhren selber zu programmieren, die Unterschiede zwischen den Chips herauszufinden und programmtechnisch umzusetzen. Die entsprechenden Programmblöcke zum Schreiben und Lesen von i2c-Bausteinen sind in MicroBlocks verfügbar und sollen interaktiv für Experimente eingesetzt werden. Mit MicroBlocks können alle Baustein-Register direkt beschrieben und ausgelesen werden. Ein Compilieren und Übertragen eines Programms wie mit MakeCode, Python oder Arduino IDE ist bei MicoBlocks nicht notwendig. Befehlsblöcke werden direkt auf dem Microcontroller ausprobiert und zeigen unmittelbar dessen Reaktion oder die eines Zusatzchips.

Ganz im Sinne von Open Source kann bei MicroBlocks übrigens der Source-Code vieler Bibliotheken angezeigt und verändert werden. So ist auch die Bibliothek für die Echtzeituhren völlig offen. Alle inneren Programmstrukturen der Blöcke können analysiert, diskutiert, kritisiert und verbessert werden. Probiert es aus und schreibt von euren Erfahrungen.

2 „Gefällt mir“

Viel Erfolg wünsche ich euch oder euren Schüler/innen übrigens bei der direkten Programmierung der Register, beispielhaft hier mit dem RTC-Chip DS1307. Zuerst sieht der Programmablauf so aus, als ob das Programm erfolgreich die Register 0, 1 und 2 schreiben und lesen kann. Aber dann springt die Sekunde plötzlich direkt von 9 auf 16 um. Der Programmierer traut seinen Augen nicht … ein Fehler? Warum passiert das?

2 „Gefällt mir“

Ich bin mir nicht sicher, ob da was in microblocks nicht stimmt. Bei der Programmierung des Pakets für den Callibot tritt immer noch das Problem auf, dass er beim Beschreiben einer der RGB LEDs die linke vordere RGB-LED löscht.

Das Problem tritt in Makecode nicht auf. Man müsste mal mit nem Oszilloskop nachmessen was da nicht stimmt. Beschreibe mal nicht alle Register und teste dann. Oder teste mal mit einem anderen microcontroller!

Viel Erfolg!

Michael

Hi Michael,

nein, es ist kein Fehler von MicroBlocks! Und das Phänomen tritt mit jeden Microcontroller auf. Es ist eine Zahlenfolge aus dem Uhrenchip. Mir selber ist die Ursache für den Sekundensprung von 9 auf 16 klar, denn ich habe jetzt lange Zeit mit verschiedenen Uhrenchips experimentiert. Aber vielleicht mag ja jemand anderes auch knobeln.

Wenn man das Programm weiter beobachtet, gibt es kurze Zeit später einen Sekundensprung von 25 auf 32. Ich habe mir erlaubt, ein kleines Programm zu schreiben, dass die Registerinhalte solange sammelt, bis wieder die Null kommt und sich alles wiederholt. Ich denke, es ist eine wunderbar herausfordernde Aufgabe für den experimentellen Informatikunterricht.

Mir machen solche Überraschungen sehr viel Spaß!

Beste Grüße
Ralf

PS: Ein Blick ins Datenblatt zum Uhrenchip DS1307 verrät die Lösung!

1 „Gefällt mir“

Schade, bisher habe ich keine Lösungsidee für den Sekundensprung erhalten.

Hey.

Ich habe ein weiteres interessantes Echtzeituhr-Modul SD3031 von DFRobot gefunden. DFRobot: SD3031 RTC module

Natürlich habe ich das Modul SD3031 sofort ausprobiert. Es war nicht einfach das Datenblatt zu finden. https://datasheet.lcsc.com/lcsc/2205310930_WAVE-SD3031_C2988356.pdf

Das neue Modul SD3031 hat mehrere Eigenheiten, die es anders machen als die bisher betrachteten Module. Der SD3031 hat einen Schreibschutz, der standardmäßig aktiviert ist und sämtliche Einstellungen der Zeit- und Datumsregister verhindert. Ja, das ist eine interessante Idee! Zuerst muss man also den Schreibschutz aufheben, wofür man insgesamt 3 Bits in zwei Registern in der richtigen Reihenfolge auf 1 setzen muss.

Die Zeit- und Datumsregister sind genau wie beim DS1307 angeordnet. Die i2c-Adresse ist 50 (0x32). Standardmäßig läuft der SD3031 im 12-Sunden-Modus, so dass der Code zum Einstellen der Stunde angepasst werden muss. Desweiteren ist interessant, dass der SD3031 insgesamt 8 ID-Register besitzt. Man kann also das Modul mit der i2c-Adresse 50 (0x32) über diese ID-Register genau identifizieren. Darüber hinaus hat der SD3031 insgesamt 70 Register als Nutzer-RAM.

Die neue Library „Real Time Clock“ wird ab der nächsten Version von MicroBlocks enthalten sein. https://microblocks.fun/run-pilot/ . Die Library ist in deutscher Sprache verfügbar. Hier ist die neue Library zum direkten Download im Calliope-Forum. Viel Erfolg beim Experimentieren!

Real Time Clock 20250915.ubl (9,8 KB)

Beste Grüße
Ralf

2 „Gefällt mir“

Die Register sind BCD codiert. Aber von mir wolltest du das wahrscheinlich nicht wissen.

Sind die bei allen Uhr Modulen BCD codiert? Ich kenne nur eins und das reicht mir auch. Da gibt es ein Korrektur Register. Mit -32 bis +31 kann man die Genauigkeit erhöhen.

Manchmal zählen die Sekunden nicht von 0, 1, sondern 128, 129, …
Das ist das nächste Rätsel.

1 „Gefällt mir“

Ja, die Echtzeituhren verwenden in allen Zeit- und Datumsregistern das BCD-Format. Es ist eine eigentlich sehr veraltete Methode, Dezimalzahlen für Computer aufzubereiten, aber bei Uhrenmodulen wird sie weiterhin genutzt.

Deine Frage nach 128, 129, … im Sekundenregister lasse ich erst mal offen. Diese Zahlen sind mir erst gestern im Stundenregister des Uhrenmoduls SD3031 begegnet.

Aus der BCD-Codierung oder den seltsamen Werten 128, 129 … für die Sekunden lassen sich wunderbare Knobelaufgaben für die Schule ableiten.

1 „Gefällt mir“

Dachte das ist wegen den 7-Segment TreiberICs. Die benötigten BCD Codierung

1 „Gefällt mir“

Willst du eine Digitaluhr bauen, bekommt jede Ziffer 4 Bit. Eine relativ dumme Hardware kann die BCD Bytes aus dem Uhr Modul holen, in der Mitte teilen und auf die Treiber ICs verteilen.

Willst du die Uhrzeit als String, kommt so was raus:

def rtc_time_string():
    # je 4 Bit in einzelne Strings konvertieren
    time_string = str(RTC_BUFFER[2] >> 4) + str(RTC_BUFFER[2] & 0x0F) + ":" + str(RTC_BUFFER[1] >> 4) + str(RTC_BUFFER[1] & 0x0F) + ":" + str(RTC_BUFFER[0] >> 4) + str(RTC_BUFFER[0] & 0x0F)
    return time_string

Das ist Python in fischertechnik ROBO Pro Coding. Ich habe alle I²C Erweiterungen von mir abgeschrieben und kann die Module nun an fischertechnik Controller (RX und TXT 4.0) anschließen.

1 „Gefällt mir“