Ziel dieser Arbeit ist die Erstellung, mit der Hilfe des Echtzeituhr-Moduls, auch Real Time Clock (RTC) genannt, einer digitalen Uhr auf einem 1.8' TFT Display. Ein weiterer Ziel dieser Arbeit ist die vertiefte Auseinandersetzung mit dem Datenblatt für die Echtzeituhr DS1302 und die Erstellung einer neuer Klasse für deren Funktionalität.
Inhaltsverzeichnis
Abbildungsverzeichnis
Tabellenverzeichnis
Abkürzungsverzeichnis
1 Einleitung
1.1 Hinführung
1.2 Ziel der Arbeit
1.3 Aufbau der Arbeit
2 Grundlagen
2.1 Arduino
2.1.1 Hardware
2.1.2 Software
2.2 TFT Display ST7735
2.3 Echtzeituhr-Modul DS1302
3 Bearbeitung
3.1 Anschließen RTC und TFT Display an Arduino
3.2 Klasse DS1302
3.2.1 Header Datei DS1302.h
3.2.2 Implementierungsdatei DS1302.cpp
3.3 Verwendung der Klasse DS1302
3.4 Die Uhr auf dem TFT Display
3.4.1 Funktion showClockFace()
3.4.2 Funktion showSetTime()
4 Schluss
4.1 Zusammenfassung der wichtigsten Ergebnisse
4.2 Kritische Betrachtung
Anhang A: Header Datei DS1302.h
Anhang B: Implementierungsdatei DS1302.cpp
Anhang C: Beispiel Sketch für RTC
Anhang D: Sketch der Uhr mit TFT Display
Abbildungsverzeichnis
Abbildung. 1: Arduino Leonardo (Quelle: www.arduino.ee)
Abbildung. 2: Arduino Leonardo von oben (Quelle: www.arduino.ee)
Abbildung. 3: Arduino IDE, neuen Tab erstellen
Abbildung. 4: 1.8' TFT Display (Quelle: www.conrad.de)
Abbildung. 5: TFT Display, Pinbelegung
Abbildung. 6: Arduino Leonardo, Pins für SPI
Abbildung. 7: RTC Modul DS1302 (Quelle: www.conrad.de)
Abbildung. 8: Serielle Datentransfer aus Datenblatt DS1302 (Quelle: www.ma- ximintegrated.com)
Abbildung. 9: Fertige Verdrahtung von RTC und TFT Display
Abbildung. 10: Messung mit Logikanalysator
Abbildung. 11: Codierung der Sekunde mit dem Wert 57
Abbildung. 12: Koordinatenursprung
Abbildung. 13: Uhr Hintergrund
Abbildung. 14: Die Uhr auf dem TFT Display
Abbildung. 15: Einstellung der Stunde
Abbildung. 16: Eine fertig aufgebaute Schaltung
Tabellenverzeichnis
Tabelle. 1: Wichtige Funktionen aus TFT_ST1135.h
Tabelle. 2: Schriftarten, definiert in User_Setup.h
Tabelle. 3: Adresse und Definition der Register aus dem Datenblatt DS1302 (Quelle: www.maximintegrated.com)
Abkürzungsverzeichnis
PWM Pulsweitenmodulation
SPI Serial Peripheral Interface
I/O Input / Output
TWI Two-Wire Interface
ICSP In Circuit Serial Programming
MOSI Master Out Slave In
MISO Master In Slave Out
SCK Serial Clock
SS Slave Select
CS Chip Select
RC Register Select
DC Data Command
RTC Real Time Clock
LSB Least Significant Bit
MSB Most Significant Bit
1 Einleitung
1.1 Hinführung
Mikrocontroller sind ans unseren Leben nicht wegzudenken. In allen Lebensbereichen, ob in Autos, in Flugzeugen oder Kaffeemaschine sind die Mikrocontroller zu treffen, wo sie meistens in sogenannte eingebettete Systeme integriert sind, ohne, dass sie direkt wahrgenommen werden.1 Für die Menschen, die sich zum ersten Mal mit Mikrocontrollern auseinandersetzen, gibt es einige Hürden. Zum einen braucht man einen speziellen Programmiergerät und zum anderen werden die meisten Mikrocontroller mit Assembler programmiert, was mehr Lernaufwand erfordert. Deswegen war 2005 Arduino geboren.1 2 Arduino ermöglicht einen einfachen Einstieg in die Mikrocontroller-Welt, weil man sich nicht tief mit Mikrocontroller auseinandersetzen musste und mit einer Programmiersprache, basierend auf C/C++, sehr schnell erste Lernerfolge erzielen konnte. Zum jetzigen Zeitpunkt existieren viele Arduino Varianten auf dem Markt: Arduino Uno, Arduino Mega, Arduino Leonardo (Abbildung 1) und viele Klone, wie z.B. Fundruino etc.
Abbildung in dieser Leseprobe nicht enthalten
Abb. 1: Arduino Leonardo (Quelle: www.arduino.ee)
Das Programm, auch Sketch genannt, wird in einer Entwicklungsumgebung Arduino IDE geschrieben. Es besteht aber auch die Möglichkeit das Programm mit anderen Editoren, wie z.B. Microsoft Visual Studio Code3 in Verbindung mit PlatformIO4, zu compilieren und auf Arduino zu übertragen.
1.2 Ziel der Arbeit
Ziel dieser Arbeit ist die Erstellung, mit der Hilfe des Echtzeituhr-Moduls, auch Real Time Clock (RTC) genannt, einer digitalen Uhr auf einem 1.8' TFT Display. Ein weiterer Ziel dieser Arbeit ist die vertiefte Auseinandersetzung mit dem Datenblatt für die Echtzeituhr DS1302 und die Erstellung einer neuer Klasse für deren Funktionalität.
1.3 Aufbau der Arbeit
Nach kurzer Einleitung werden die Grundlagen für die Verwendete Hardware und Software dargestellt. Im ersten Bearbeitungsteil wird der Übertragungsprotokoll für die Echtzeituhr erläutert und in einer neuer Klasse implementiert. Im zweiten Bearbeitungsteil wird die Uhr und die Menü zur Zeiteinstellung implementiert. Zum Schluss werden alle Ergebnisse zusammengefasst und kritisch betrachtet.
2 Grundlagen
2.1 Arduino
2.1.1 Hardware
In dieser Arbeit wird Arduino Leonardo verwendet. Dieser Board basiert auf dem Mikrocontroller ATmega32u4. Es bittet 20 digitale Input/Output (I/O) Pins, von denen 7 Pins eine Pulsweitenmodulation (PWM) ermöglichen und 12 Pins als analoge Eingänge nutzbar sind.5 Im Vergleich zu Arduino Uno ist der Mikrocontroller in der Platine fest gelötet, siehe die Abbildung 2.
Abbildung in dieser Leseprobe nicht enthalten
Abb. 2: Arduino Leonardo von oben (Quelle: www.arduino.ee)
Beide Boards, Arduino Uno und Leonardo, werden mit 16 MHz Taktfrequenz betrieben und haben gleich großen 32 KB Speicher, wobei bei Arduino Leonardo weniger zur Verfügung steht, weil der Bootloader mit 4 KB, im Vergleich zur Arduino Uno (0,5 KB) deutlich größer ist. Bootloader ist ein kleines Programm, welches in dem Mikrocontroller gespeichert ist und das Laden des Programms übernimmt.1 In der folgender Auflistung sind die wichtige Pins auf Arduino Leonardo aufgeführt.6 7
- Pins 2 (SDA) und 3 (SCL) Unterstützen die Kommunikation über Two-Wire Interface (TWI), auch I2C genannt,
- Pins 3, 5, 6, 9, 10, 11 und 13 unterstützen die PWM,
- Pins 0, 1, 2, 3 und 7 können für die externe Interrupts verwendet werden,
- Pins A0-A5, 4, 6, 8, 9, 10 und 12 können als analoge Eingänge benutzt werden,
- Pins für die Serial Peripheral Interface (SPI) Kommunikation befinden sich auf ICSP Header und anders als bei Arduino Uno sind zu keinen digitalen Pins angeschlossen.
2.1.2 Software
Wie bereits in der Einleitung beschrieben, wird der Sketch in dem Arduino IDE geschrieben. Jeder Sketch hat zwei obligatorische Funktionen:
Abbildung in dieser Leseprobe nicht enthalten
Damit der Sketch übersichtlich bleibt, besteht in Arduino IDE eine Möglichkeit die Funktionen in die separate Dateien zu speichern, in dem man in dem rechten Menü neuen Tab erstellt, siehe die Abbildung 3.
Abbildung in dieser Leseprobe nicht enthalten
Abb. 3: Arduino IDE, neuen Tab erstellen
2.2 TFT Display ST7735
In dieser Arbeit wurde ein 1.8' TFT Display verwendet, siehe die Abbildung 4. Die Auflösung beträgt 160 x 128 Pixel. Kommuniziert wird über SPI Schnittstelle.
Abbildung in dieser Leseprobe nicht enthalten
Abb. 4: 1.8' TFT Display (Quelle: www.conrad.de)
Die Bibliothek, die sich als geeignet für dieses Display erwiesen hat, ist von Bodmer und kann unter folgender Internet Adresse heruntergeladen werden:
https://github.com/Bodmer/TFT_ST7735
Das Display hat 11 Pins, wobei letzte vier Pins sind für den integrierten MicroSD Modul und werden in dieser Arbeit nicht betrachtet, siehe die Abbildung 5.
Die beiden ersten Pins werden an die Arduino 5 V und GND angeschlossen. Die Bezeichnung der Pins SCL und SDA ist verwirrend, weil hier über SPI und nicht über I2C kommuniziert wird. Deswegen werden beide Pins an Arduino SCK (Serial Clock) und an MOSI (Master Output Slave Input) angeschlossen. Beide Pins befinden sich auf dem ICSP Header, siehe die Abbildung 6.
Abbildung in dieser Leseprobe nicht enthalten
Abb. 6: Arduino Leonardo, Pins für SPI
In dem Ordner, wo die Bibliotheksdateien für das Display gespeichert sind, behndet sich eine Header Datei User_Setup.h. In dieser Datei werden die restlichen Pins dehniert, können aber nach Bedarf auch geändert werden:
- CS (Chip Select), auch oft SS (Slave Select) genannt, wird an Pin 10 angeschlossen,
- RES (Reset) wird an Pin 8 angeschlossen,
- RC/DC (Register Select/Data Command) wird an Pin 9 angeschlossen.
In gleicher Datei können auch nicht verwendete Schriften deaktiviert werden (mit // auskommentiert), damit wird viel Speicher im Mikrocontroller gespart. Die Header-Datei TFT_ST7735.h beinhaltet die Information über alle Funktionen, erforderlichen Parameter und Rückgabewerte.
Bei der Implementierung wird als erstes die Klasse für das Display und die Klasse für SPI Kommunikation eingebunden und ein neues Objekt erstellt:
Abbildung in dieser Leseprobe nicht enthalten
In der Tabelle 1 sind die wichtigste Funktionen zum Anzeigen des Textes und zum Zeichnen der geometrischen Formen kurz vorgestellt. Alle Funktionen sind auch in der Datei keywords.txt aufgelistet.
Abbildung in dieser Leseprobe nicht enthalten
Tab. 1: Wichtige Funktionen aus TFT STT735.h
Die Farbe color von dem Text und der geometrischen Körpern wird in einer Hexadezimalzahl angegeben. Werte für die Koordinate x und y, Höhe h, Breite w, Radius r werden als ganzzahlige Werte angegeben (int16t). Die Schriftart (font, siehe die Tabelle 1) wird mit einer int Zahl angegeben. In der Tabelle 2 sind die vorhandene Schriften dargestellt.
Abbildung in dieser Leseprobe nicht enthalten
Tab. 2: Schriftarten, dehniert in User Setup.h
2.3 Echtzeituhr-Modul DS1302
Die Zeit wird bei den Mikrocontrollern gemessen, indem beim Überlaufen eins Timers ein Interrupt ausgelöst wird. Ein 8 Bit Timer Zählt also bis 28 = 256. Durch die Verwendung der Vorteiler (prescaler) kann man Timer verlangsamen. Vorteiler kann auf die Werte 1,8, 64, 256 oder 1024 eingestellt werden.1 Arduino hat eine 16Mhz Taktfrequenz und mit einem Vorteiler N = 1024 ergibt sich ein Überlauf des Timers 61,03517 Mal pro Sekunde:
Abbildung in dieser Leseprobe nicht enthalten
Wie man sehen kann, ist dieser Wert keine Vielfache einer Sekunde und eine genaue Uhr nicht realisierbar ist. Aus diesem Grund wird in Uhren ein 32,768 kHz Quarz verwendet. Mit einem Vorteiler N = 64 ergibt sich ein Überlauf des Timers genau 2 Mal pro Sekunde:
Abbildung in dieser Leseprobe nicht enthalten
In dieser Arbeit verwendete RTC Modul DS1302 (siehe die Abbildung 7) wird mit einem 32,768 kHz Quarz betrieben und besitzt eine Batterie, d.h auch wenn Arduino ausgeschaltet ist oder RTC Modul nicht angeschlossen ist, läuft die Zeit in dem Modul weiter und muss nicht neu eingestellt werden.
Abbildung in dieser Leseprobe nicht enthalten
Abb. 7: RTC Modul DS1302 (Quelle: www.conrad.de)
RTC Modul hat fünf Pins. Erste zwei Pins, VCC und GND werden an die Arduinos GND und 5 V angeschlossen. Letzte drei Pins dienen zur seriellen Kommunikation:
- DAT Pin: dient zur seriellen Data Transfer (im Datenblatt als I/O bezeichnet),
- CLK Pin: Dient zur Synchronisation,
- RST Pin: Startet bzw. beendet eine Übertragung (im Datenblatt als CE bezeichnet).
In der Abbildung 8 ist der serielle Lesevorgang bzw. Schreibvorgang dargestellt. Beginnend mit Least Signihcant Bit (LSB) wird zuerst die Adresse gesendet. Danach werden, beginnend mit LSB, die Daten gesendet, bzw. gelesen.
Abbildung in dieser Leseprobe nicht enthalten
Abb. 8: Serielle Datentransfer aus Datenblatt DS1302
(Quelle: www.maximintegrated.com)
In der Tabelle 3 sind die Adressen und die Definitionen der Register aufgeführt. Die Adressen für das Lesen sind um eins inkrementierte Schreibadressen. Werte für Sekunde, Minute, Stunde, Datum, Monat und Jahr muss man in die Einer und in die Zehner zerlegen, was weiter im Kapitel „Bearbeitung“ näher betrachtet wird.
Abbildung in dieser Leseprobe nicht enthalten
Tab. 3: Adresse und Definition der Register aus dem Datenblatt DS1302 (Quelle: www.maximintegrated.com)
3 Bearbeitung
3.1 Anschließen RTC und TFT Display an Arduino
Wie oben bereits beschrieben, hat eine Echtzeituhr (RTC) fünf Pins. GND und VCC werden an Arduinos GND und 5 V angeschlossen. CLK wird an Pin 7, I/O an Pin 6 und CE an Pin 5 angeschlossen.
Die Pins GND und VCC des TFT Displays werden an Arduinos GND und 5 V angeschlossen. CS wird an Pin 10, RES an Pin 8 und RS/DS an Pin 9 angeschlossen. Pins SGL und SDA werden an Arduinos SPI Schnittstelle angeschlossen. SGL wird an SCK Pin und SDA wird an MOSI Pin angeschlossen. Anders als bei Arduino Uno sind diese Pins nicht mit den digitalen Ausgängen verbunden und müssen an ICSP Header angeschlossen werden, siehe die Abbildung 6.
Damit die Zeit Eingestellt werden kann, werden noch drei Taster angeschlossen. Erste Taste „SET“ wird an Pin 4 angeschlossen. Mit dieser Taste gelangt man in das Menü, wo die Zeit und das Datum eingestellt werden. Zweite Taste (Minus) und dritte Taste (Plus) werden an Pins 3 und 2 angeschlossen. Mit diesen Tasten werden die Zeitwerte eingestellt. Damit die Tasten einen Definierten Zustand (LOW) haben, wenn die Taste nicht gedruck ist, werden alle drei Taster durch jeweils einen 10k Pulldown Widerstand mit der Masse verbunden. In der Abbildung 9 ist die fertige Verdrahtung mit Arduino dargestellt.
Abbildung in dieser Leseprobe nicht enthalten
Abb. 9: Fertige Verdrahtung von RTC und TFT Display
3.2 Klasse DS1302
An dieser Stelle werden nur die Vorgehensweise bei der Klasse Erstellung und beispielhaft die Methoden zum Lesen und Schreiben der Werte für Sekunden, Minuten und Stunden dargestellt. Die fertige Klasse, mit Header Datei und Implementierungsdatei, ist im Anhang A (DS1302.h) und Anhang B (DS1302.cpp) aufgeführt.
Für die Headerdatei .h und und Implementierungsdatei .epp werden in Arduino IDE zwei neue Tabs angelegt.
3.2.1 Header Datei DS1302.h
Weil neue Klasse Arduinos interne Namen, wie z.B. LOW, HIGH, byte usw., nicht kennt, muss als erstes <arduino.h> eingebunden werden. Danach werden die Adressen dehniert:
Abbildung in dieser Leseprobe nicht enthalten
Als nächstes werden die private Attribute und Methoden festgelegt: Die Werte für die Zeit und das Datum werden in den Variablen seconds, minutes usw. gespeichert. Bevor die Daten zu DS1302 gesendet werden, müssen diese noch in Einer und Zehner zerlegt und in den Variablen secondsData, minutesData gespeichert werden. Objekt der Klasse wird mit drei Werten der Pins angelegt, deswegen werden noch drei Variablen benötigt. Für Schreibund Lesevorgang werden zwei private Methoden readData und writeData angelegt. Diesen Methoden werden die Adresse und eine Referenz auf eine Variable übergeben:
Abbildung in dieser Leseprobe nicht enthalten
Ins Public-Bereich kommen der Konstruktor und Methoden zum Lesen und Schreiben der Werte. Bei dem RTC DS1302 hat man freien Speicher (Von C0h bis FCh) zur Verfügung, wo z.B. die Zeit für den Wecker gespeichert werden kann. Mit der Methode writeToRam bzw. readFromRam werden die Werte geschrieben bzw. gelesen:
Abbildung in dieser Leseprobe nicht enthalten
Alle andere Methoden zum Lesen und Schreiben von Datum, Monat, Jahr, Wochentag und Methoden zum Setzen von Schreibschutz sind im Anhang A aufgeführt.
3.2.2 Implementierungsdatei DS1302.cpp
In der .epp Implementierungsdatei wird zuerst eine Header Datei eingebunden. Der Konstruktor zuweist die übergebene Daten (Pin Werte) an die Klassen Attribute. Zusätzlich werden alle Pins als Ausgang definiert und auf LOW gestellt.
Abbildung in dieser Leseprobe nicht enthalten
Die Funktionen readData() und writeData() implementieren einen, in der Abbildung 8 dargestellten, seriellen Datentransfer. Beide Funktionen sind in zwei Teile aufgeteilt: zuerst wird die Adresse an DS1302 gesendet und dann die Daten empfangen oder gesendet.
Die Funktion readData(): Die Funktion bekommt eine Adresse und eine Variable übergeben. Diese Variable wird als eine Referenz übergeben, d.h. die gelesene Daten werden direkt in die Variable gespeichert. Nachfolgend sind die einzelne Schritte aufgelistet:
1. Pin DS1302 IO PIN zu Ausgang ändern, weil zuerst die Adresse gesendet wird. Dieser Schritt ist nötig, weil der Pin später beim Senden zum Eingang geändert wird.
2. LSB der Adresse auf 1 ändern, damit wird die Adresse auf das Lesen umgestellt.
3. Pin DS1302 CE PIN auf HIGH ändern. Damit wird die Übertragung gestartet.
4. Beginnend mit LSB wird jedes Bit der Adresse in einer Schleife gesendet, dabei wird Clock Pin DS1302 CLK PIN auf HIGH und dann wieder auf LOW geändert. Die Übertragung findet bei steigender Flanke statt.
5. Ist der letzte Bit, Most Significant Bit (MSB), erreicht, wird Pin DS1302 IO PIN zu Eingang ändert.
6. Jetzt wird, beginnend mit LSB, jedes Bit der Daten in einer Schleife gesendet, zuerst aber Pin DS1302 CLK PIN von LOW auf HIGH ändern. Die Übertragung findet bei fallender Flanke statt.
7. Pin DS1302 CE PIN wird auf LOW geändert, damit wird die Übertragung beendet.
[...]
1 vgl. Zobel, Echtzeitsysteme, s. 15.
2 vgl. Wikipedia, Arduino (Plattform) — Wikipedia, die freie Enzyklopädie.
3 https://code.visualstudio.com
4 https://platformio.org
5 vgl. arduino.ee, Arduino Leonardo Technical specs.
6 vgl. Bartmann, Die elektronische Welt mit Arduino entdecken, s. 19.
7 vgl. arduino.cc, Arduino Leonardo Technical specs.
- Quote paper
- Andrej Mironov (Author), 2022, Echtzeituhr DS1302 mit der Ausgabe auf dem 1.8' TFT Display, Munich, GRIN Verlag, https://www.grin.com/document/1282311
-
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X.