DS3231 – Anschluss einer Echtzeituhr. Uhr – Designer auf einem hochpräzisen (extrem genauen I2C) Chip DS3231 SDA- und SCL-Pins auf verschiedenen Arduino-Boards

💖 Gefällt es dir? Teilen Sie den Link mit Ihren Freunden

Warum ist das alles nötig?

60 Sekunden * 60 Minuten * 24 Stunden * 365 Tage = 31.536.000 Sekunden pro Jahr.

Für jede dieser Millionen können 2 Sekunden in die eine oder andere Richtung gehen. Teilen Sie 31,5 Millionen durch eine Million und multiplizieren Sie mit 2: Wir erhalten 63 Sekunden pro Jahr (maximal). Akzeptable Option? Sehr. Aber alle sechs Monate würde ich die Zeit so synchronisieren, dass sie in eine Minute passt.

Wie kann man generell die Uhrzeit an der Moduluhr einstellen?

Traditionell wurde die Zeit ab dem DS3107-Modul mithilfe einer Arduino-Skizze aus den Beispielen für die Verwendung der Bibliothek festgelegt. Der Algorithmus ist wie folgt: Öffnen Sie die Skizze, klicken Sie auf „Kompilieren und Hochladen“, und wenn der Controller zum ersten Mal gestartet wird, wird die Zeit eingestellt. Bleibt die Frage: Um wie viel Uhr? Wie kann Arduino genau wissen, welche Zeit eingestellt werden muss? Und es ist ganz einfach: Zeit für die Erstellung der Skizze. Allerdings sehe ich bei diesem Ansatz mehrere Nachteile:
  • Die Kompilierungszeit hängt von der „Leistung“ des Computers ab;
  • Die Downloadzeit hängt von der Geschwindigkeit ab, mit der die kompilierte Skizze auf das Arduino-Board übertragen wird.
  • Die hochgeladene Skizze ist „wegwerfbar“ (sie verfällt sofort nach dem Hochladen auf Arduino).
Wie können Sie diese Einschränkungen umgehen? Wenn Sie beispielsweise die Kompilierungszeit kennen (experimentell festlegen), können Sie die Uhr auf dem Computer auf diese Zeit „vorwärtstreiben“. Führen Sie dann die Kompilierung aus, flashen Sie das Board und die Zeit wird eingestellt. Der Vorteil der Methode liegt in ihrer relativen Einfachheit. Nachteile – relativ umständliche, relativ ungenaue, einmalige Methode.

Was fällt Ihnen sonst noch ein? Sie können beispielsweise die benötigte Zeit in der Skizze manuell einstellen, einen Knopf zum Drücken vorsehen richtiger Moment stellt die angegebene Zeit „von Hand“ ein, zum Beispiel 2 Minuten ab dem aktuellen Moment: Während die Skizze „ausgefüllt“ wird und wir uns darauf vorbereiten, den sehr notwendigen Moment des Drückens der Taste manuell zu verfolgen, vergehen genau diese paar Minuten . Und dann, indem Sie auf die Uhr am Computer schauen, warten Sie auf „genau diesen“ Moment, um den Knopf zu drücken. Vorteile: schwieriger vorherige Methode, aber immer noch relativ einfach, aber genauer als die erste Methode. Nachteile – diese Methode ist noch umständlicher, dauert länger und ist immer noch eine „einmalige“ Skizze.

Wer ist schuld und was ist zu tun?

Nachdem ich mir diese beiden rhetorischen Fragen gestellt hatte, suchte ich im Internet nach jemandem, der bereits die Zeitsynchronisation des Uhrenmoduls mit dem Computer geschrieben hatte. Und wie Sie wissen: Wer sucht, findet immer. Ich habe eine Option mit gefunden. Theoretisch ist alles einfach: Eine normale „Batchdatei“ analysiert die aktuelle Vollzeit, die mit der „ersten“ Methode erhalten wurde (da Sie neben der Zeit selbst auch ein Datum benötigen), erhöht die Zeit um 2 Sekunden und „ fährt“ eine leere Schleife, bis diese neue eintrifft, „plus_two_seconds“, Zeit, Daten in den COM-Port zu „werfen“. Darüber hinaus wird die „neue plus_two_seconds“-Zeit auf andere Weise erfasst (über %time%, falls es jemanden interessiert). Aber über die „Pfosten“ einer solchen Entscheidung später. Die in den COM-Port „ausgeworfenen“ Daten werden von Arduino analysiert und stellen dann die Zeit im Modul ein. Alles scheint einfach, logisch und bequem. Aber es gibt ein sehr schlechtes Wort „ABER“. All dies scheint von einem Deutschen geschrieben worden zu sein, und seine regionalen Standards in Windows unterscheiden sich von „unseren“, und insbesondere wird der Bruchteil durch einen Punkt und nicht durch ein Komma getrennt. Beim Start mit inländischen regionalen Standards funktioniert die Batchdatei nicht, da darin die Zeit zum Verlassen der Leerschleife durch die Vergleichsbedingung mit XX:XX:XX.xxx beschrieben wird. Nun, Sie müssen ein Komma anstelle eines Punkts setzen – und das war’s: „Ich habe alles repariert.“ Aber das ist noch nicht alles (Sie können nachschauen, wer sich sonst noch daran erinnert, was für ein Übel es ist, in „Batch-Büchern“ zu programmieren). Die Körperdatei muss ernsthafter korrigiert werden. Und ich habe es mit „Rückspulmatten“ und einem „Handbuch“ für DOS behoben. Der „Batnik“ hat es behoben, aber der Sketch funktionierte immer noch nicht – die Zeit stand nicht fest. Das heißt, es wurden Daten an den Port gesendet, Arduino hat sie gesehen, aber „etwas ist schiefgelaufen“.

Werfen wir einen Blick darauf, was die Batchdatei an Arduino sendet und in welchem ​​Format (als Referenz).

Fall 83: //S = Zweiter Fall 68: //D = Minute (Daghigheh auf Persisch) Fall 72: //H = Stunde Fall 84: //T = Tag des Monats (Tag auf Deutsch) Fall 77: /// M = Monat Fall 74: /// J = Jahr (Jahr auf Deutsch)
Daten werden im Format S**~D**~H**~T*~M**~J****~ gesendet, wobei ~ für 2 Bytes Wagenrücklauf steht. Insgesamt 31 Byte. Es scheint nicht viel zu sein, die Daten werden schnell gesendet.

Allerdings gibt es auch eine Unannehmlichkeit – wie Sie sehen, wird der Wochentag nicht gesendet. Nur der Tag des Monats. Es wird ein Problem geben, Uhren mit Alarmen zu implementieren, die von den Wochentagen abhängen. Der Wochentag muss in der Skizze „von Hand“ eingestellt werden, was wiederum auf eine gewisse „Wegwerfbarkeit“ der Skizze, ihre Minderwertigkeit, hinweist.

Als ich die Faktoren zusammenzählte – die Minderwertigkeit der Skizze „aus der Fabrik“, ihre Weigerung, normal zu funktionieren, die Notwendigkeit, die „Körperdatei“ für „unsere“ Breitengrade zu korrigieren – beschloss ich, alles selbst zu entwickeln. Und wenn ja, dann kann ich die Mängel beheben und das Datenformat optimieren.

Software und Hardware.

Damit alles funktioniert, benötigen Sie 2 Komponenten: ein Programm für Windows und eine Arduino-Hardware-Software-Kombination.

Zunächst allgemeine Daten zum Austauschprotokoll. Nachdem ich das zu sendende Datenformat frei wählen konnte, entschied ich, dass das Senden von 31 Bytes an Informationen nicht sinnvoll sei, und reduzierte die übertragenen Daten auf 4 Bytes. War das genug? Was können Sie in 4 Bytes einfügen? Ja, das reicht. Es passt alles hinein, was Sie brauchen. Ich bin sicher, viele haben erraten, was 4 Bytes sind. Für diejenigen, die es nicht erraten haben, zitiere ich einen Auszug aus einem Artikel aus Wikipedia:

UNIX-Zeit (POSIX-Zeit) – ein System zur Beschreibung von Zeitpunkten, das in UNIX und anderen POSIX-kompatiblen Systemen übernommen wurde Betriebssysteme. Definiert als die Anzahl der Sekunden, die seit Mitternacht (00:00:00 UTC) am 1. Januar 1970 (Donnerstag) vergangen sind.
Die UNIX-Zeit wird als Ganzzahl dargestellt, die mit jeder verstrichenen Sekunde zunimmt, ohne dass Berechnungen zur Bestimmung von Jahr, Monat, Tag, Stunde oder Minute erforderlich sind, um die Lesbarkeit für den Menschen zu gewährleisten. Die moderne UNIX-Zeit stimmt mit UTC überein – die Zählung erfolgt in SI-Sekunden.

Die Ganzzahl, die die UNIX-Zeit speichert, nimmt also 4 Bytes ein, was ausreicht, um bis zu 2.147.483.648 Sekunden zu halten. Und dann möglich potenzielle Probleme. Warum Potenzial? Denn dies ist die Schwelle, bei der die Zahl Vielleicht als negativ interpretiert werden (wie einst bei den iPhones vieler neugieriger Kameraden). Vielleicht, aber es wird nicht unbedingt passieren – es hängt davon ab, ob die Hände der Programmierer an der von der Natur bereitgestellten Stelle wachsen. Die angegebene Sekundenzahl entspricht 03:14:08 19.01.2038. Bis zu diesem Zeitpunkt können Sie langsam auf eine 64-Bit-Version des Betriebssystems umsteigen, bei der die Zeit in einer 8-Byte-Variablen gespeichert wird, die problemlos die nächsten 292 Milliarden Jahre überdauern wird. Es besteht die Möglichkeit, dass dies für unser Leben ausreicht. Und dann müssen Sie auf die 128-Bit-Version von UNIX aktualisieren.

Welche Probleme habe ich durch diese Option gelöst? Erstens wurde die Anzahl der übertragenen Bytes erheblich reduziert, was die Genauigkeit der Zeiteinstellung um Millisekunden erhöht. Großartig, oder? Und zweitens: Ich habe (wahrscheinlich) die Linux-Kompatibilität erleichtert. Zu meiner Schande kann ich mich nicht an Linux gewöhnen und nutze meist nur Windows. Ich kann ein Weiterleitungsprogramm für genau dieses Windows schreiben, aber nicht für Linux. Aber ich glaube, dass man unter Linux viel einfacher als unter Windows den UNIX-Zeitwert ermitteln und diese Zahl an den COM-Port senden kann.

Keiner zusätzlich Es ist nicht erforderlich, Daten wie den Wochentag usw. zu übertragen. Nur UNIX-Zeit. Alles andere wird in Arduino erledigt.

Nun ein paar Einzelheiten direkt dazu Erste Komponente - ein Programm für Windows. Das Programm ist im guten alten Delphi geschrieben. Beim Start werden Sie in einem Popup-Fenster aufgefordert, einen COM-Port auszuwählen, an den Daten gesendet werden sollen. Lass uns aussuchen. Die übrigen Einstellungen sollten als Standardeinstellungen belassen werden.

Wie funktioniert das Programm? Es wird aus dem Zeitformat neu berechnet Windows-Daten für das UNIX-Format, also die Anzahl der Sekunden seit Mitternacht des 1. Januar 1970. Dann fügt es 3 Sekunden hinzu und „fällt“ in eine leere Schleife (die offensichtlich weniger als diese zusätzlichen 3 Sekunden dauert), deren Verlassen in der erforderlichen Anzahl von Sekunden erfolgt, so nahe wie möglich an 000 Millisekunden. Mit anderen Worten: Es wird das Auftreten des Beginns dieser Zeitsekunde überwacht, deren Wert an Arduino gesendet werden muss. Stimmen Sie zu, das Senden von Daten, die beispielsweise jetzt XXXXXXXXX5 Sekunden betragen, obwohl sie in Wirklichkeit beispielsweise bereits XXXXXXXXX5 und 756 Tausendstel (zum Beispiel) Sekunden sind, wäre nicht korrekt. Aus diesem Grund müssen Sie den Beginn der Sekunde verfolgen, um mit der Datenübertragung zu beginnen. Nach der Übermittlung der Daten meldet das Programm freundlicherweise den Status „Fertig:)“. Damit ist die Mission des Programms abgeschlossen.


Zweite Komponente - Hardware und Software - Arduino. Da sind 2 Sorten Hardware für dieses Projekt: eine „vollständige“ Version mit einem Bildschirm und einer Taste und eine „abgespeckte“ Version für schnelle Installation Modulzeit, zusammengestellt aus „Scheiße und Stöcke“. Über ihre Unterschiede - unten. Die „vollständige“ Version besteht aus einem Arduino Nano, einem 1602-Shield mit einem „Adapter“ von I2C zum Shield, einem optionalen Arduino-Reset-Knopf und einem Pin-Header (weiblich) zum Anschluss des Uhrenmoduls. Optional auch vom Gerätekörper mit einem „süßen“ Aufkleber. Die „abgespeckte“ Version besteht aus einem Arduino (Uno, Nano, Pro Mini + dem „richtigen“ USB-Adapter mit DTR) und 4 Drähten zum Anschluss des Uhrenmoduls.



Wie aus den Diagrammen ersichtlich ist, enthält die „Vollversion“ neben der „abgespeckten“ Version eine Reset-Taste und einen 1602-Bildschirm mit einem „Adapter“. Beide Versionen sind in der Hauptfunktionalität – der Einstellung der – absolut identisch Uhrzeit. Der Bildschirm wird lediglich zur Anzeige der einzelnen Schritte des Vorgangs benötigt. Nach Abschluss des Einstellungsvorgangs werden die neu eingestellte Uhrzeit, das neu eingestellte Datum und der neu eingestellte Wochentag angezeigt. Zu diesem Zeitpunkt sind die Daten bereits vorhanden vom Uhrenmodul selbst gelesen werden. In der „abgespeckten“ Version übernimmt die im Arduino-Board eingebaute LED die Rolle des Bildschirms: Nach dem Einstellen der neuen Zeit beginnt sie zu leuchten. Das ist alle Angaben.

Wozu dient die Reset-Taste? Für das, was drin ist Vollversion Nach dem Einstellen der Zeit wird der Arduino eingegeben endloser Kreislauf Durch die Anzeige dieser ganz neu eingestellten Zeit wird es tatsächlich zu einer Uhr. Darüber hinaus handelt es sich um Uhren, die in Eile hergestellt werden, und können daher aus mehreren Gründen keine normale Uhr ersetzen (die Auswahl der Sekunden erfolgt über eine Verzögerung, die Zeitanzeige verschwindet, wenn der Strom ausgeschaltet wird). Das Ziel besteht schließlich darin, sicherzustellen, dass die Zeit korrekt synchronisiert ist, nicht mehr. Um das nächste Taktmodul zu synchronisieren, können Sie daher nicht auf einen Reset verzichten (genauer gesagt, Sie können dies tun, wenn Sie „verzerren“) USB-Kabel). Mit anderen Worten: Der Zweck der Schaltfläche ist rein utilitaristischer Natur. Wenn Sie möchten, können Sie auch darauf verzichten.

Wie flasht man Arduino, da es zwei Hardwareversionen, aber nur eine Skizze gibt? Um die „richtige“ Version der Firmware zu kompilieren, müssen Sie im Sketch-Header den gewünschten Parameterwert einstellen Vollversion: WAHR für die „Vollversion“ bzw FALSCH - für „auf das Wesentliche reduziert“. Der Compiler bestimmt somit, für welche Hardwareversion die Firmware kompiliert werden soll.

Da wir also den Anschlussplan haben, benötigen wir den Skizzencode. Bitte beachten Sie, dass eine Bibliothek erforderlich ist, damit der Sketch mit der „Vollversion“ ordnungsgemäß funktioniert Flüssigkristall I2C von Frank de Brabander(aus dem Repository mit dem Bibliotheksmanager installiert). Wir brauchen auch eine Bibliothek, um das Uhrenmodul zu unterstützen, und nicht irgendeine :). Hier herunterladen: . Wir haben die Bibliotheken sortiert.

Hier ist der Code für die Skizze:

//============================================= ====== Einstellung zur Änderung verfügbar === =================================== #define fullVersion true //true = „vollständige“ Version mit Bildschirm; false = „abgespeckte“ Version mit eingebauter LED //================================== ============ Verwendete Bibliotheken und Deklaration von Variablen = ============================== ==== #include #enthalten #if (vollständige Version) #include #endif unsigned long t1 = 0; //Variable für die empfangene Zeit unsigned long t2 = 0; //Variable für die empfangene Zeit Byte b; //Puffer zum Empfangen von Daten vom COM-Port #if (fullVersion) byte day = 0; #endif DS3231 Uhr; RTCDateTime dat1; #if (fullVersion) LiquidCrystal_I2C lcd(0x3F,16,2); //Chinesen lieben die neue Adresse für „Adapter“ von i2c zu screen #endif //============================= == ============================================== ===== ================================== void setup())( #if ( !fullVersion) // nur für die „gekürzte“ Version relevant – der Anfang des Codeabschnitts pinMode(13, OUTPUT); digitalWrite(13,LOW); #endif // nur für die „getrimmte“ Version relevant – das Ende des Codeabschnitt clock.begin(); Serial.begin(9600); #if (fullVersion) //relevant nur für die „Vollversion“ – der Anfang des Codeabschnitts lcd.init(); lcd.backlight(); lcd .setCursor(0,0); lcd.print("COMport 9600 8N1"); //Hinweis, welche COM-Port-Parameter im Programm ausgewählt werden sollen lcd.setCursor(0,1); lcd.print("Ready to sync") ; //Statusmeldung – bereit für die Synchronisierungsverzögerung (1000); #endif //nur für die „Vollversion“ relevant – das Ende des Codeabschnitts) void loop())( if (Serial.available())( / /wenn „Schießpulver im Kolben“ des COM-Ports Serial.readBytes(b,4); //alle 4 Bytes zählen (wir erwarten nichts anderes) t1=b; t2=(t1<<24); //поместить значение байта в 4-байтную переменную и передвинуть его на 3 байта влево t1=b; t2+=(t1<<16); //поместить значение байта в 4-байтную переменную и передвинуть его на 2 байта влево t1=b; t2+=(t1<<8); //поместить значение байта в 4-байтную переменную и передвинуть его на 1 байт влево t2+=b; //поместить значение байта в 4-байтную переменную clock.setDateTime(t2); //установить полученное время на DS3231 #if (fullVersion) //актуально только для "полной" версии - начало участка кода lcd.clear(); lcd.setCursor(0,0); lcd.print("Done:) : :"); while (true){ //начало бесконечного цикла по отображению свежеустановленных времени и даты dat1 = clock.getDateTime(); if (dat1.day != day){ day = dat1.day; lcd.setCursor(0,1); if (dat1.day < 10) lcd.print("0"); lcd.print(day); lcd.print("-"); switch (dat1.month){ //выбираем буквенное соответствие месяца по цифре case 1:{ lcd.print("Jan"); break; } case 2:{ lcd.print("Feb"); break; } case 3:{ lcd.print("Mar"); break; } case 4:{ lcd.print("Apr"); break; } case 5:{ lcd.print("May"); break; } case 6:{ lcd.print("Jun"); break; } case 7:{ lcd.print("Jul"); break; } case 8:{ lcd.print("Aug"); break; } case 9:{ lcd.print("Sep"); break; } case 10:{ lcd.print("Oct"); break; } case 11:{ lcd.print("Nov"); break; } case 12:{ lcd.print("Dec"); break; } default:{ lcd.print("???"); break; } }//switch month lcd.print("-"); lcd.print(dat1.year); lcd.print(" "); switch(dat1.dayOfWeek){ //выбираем буквенное соответствие дня недели по цифре case 1:{ lcd.print("Mon"); break; } case 2:{ lcd.print("Tue"); break; } case 3:{ lcd.print("Wed"); break; } case 4:{ lcd.print("Thu"); break; } case 5:{ lcd.print("Fri"); break; } case 6:{ lcd.print("Sat"); break; } case 7:{ lcd.print("Sun"); break; } default:{ lcd.print("???"); break; } }//switch dayOfWeek }//if date changed lcd.setCursor(8,0); if (dat1.hour < 10) lcd.print("0"); lcd.print(dat1.hour); lcd.setCursor(11,0); if (dat1.minute < 10) lcd.print("0"); lcd.print(dat1.minute); lcd.setCursor(14,0); if (dat1.second < 10) lcd.print("0"); lcd.print(dat1.second); delay(995); }//while #else //актуально только для "урезанной" версии - начало участка кода digitalWrite(13, HIGH); delay(3000); digitalWrite(13, LOW); #endif //актуально только для "полной" версии - конец участка кода }//if Serial }//loop


Ein paar Fotos der „vollständigen“ Version des fertigen Geräts.


Und zum Schluss noch ein Video des Geräts im „Kampfbetrieb“:

Wo kann ich die Skizze und das Programm herunterladen?

Skizze herunterladen (Dropbox).
Laden Sie das Programm für Windows herunter (Dropbox).

"Vorteile und Nachteile".

Es ist in diesem Fall schwierig, „Vorteile“ und „Nachteile“ zu formulieren. Folglich entscheidet jeder selbst, was gut und was schlecht ist.

Gesamt.

Mir hat sehr gut gefallen, wie die Zeit jetzt in Modulen eingestellt ist! Wenn ich die Zeit einstellen muss, muss ich nicht jedes Mal daran denken, welche Skizze ich benötige, und darüber nachdenken, wie genau die Zeit im Modul eingestellt wird. Außerdem wird es demnächst einen Testbericht zu einer selbstgebauten Uhr geben, bei der ich eine solche Synchronisationsmethode eingebaut habe – die Methode hat mir so gut gefallen. Ich hoffe, dass einige der Leser diese Methode auch nützlich finden werden.

Das Projekt ist kostenlos und nicht kommerziell. Jeder hat das Recht, die Daten aus der Bewertung für andere als kommerzielle Zwecke zu verwenden.

Alles Gute.

Ich habe vor, +48 zu kaufen Zu den Favoriten hinzufügen Die Rezension hat mir gefallen +60 +114

Das DS3231-Modul (RTC, ZS-042) ist eine kostengünstige Platine mit einer äußerst genauen Echtzeituhr (RTC) mit Temperaturkompensation von Quarzoszillator und Quarz. Das Modul enthält eine Lithiumbatterie, die auch bei ausgeschalteter Stromversorgung einen unterbrechungsfreien Betrieb gewährleistet. Ein integrierter Generator verbessert die Genauigkeit des Geräts und reduziert die Anzahl der Komponenten.

Technische Spezifikationen

Versorgungsspannung: 3,3 V und 5 V
Speicherchip: AT24C32 (32 KB)
Genauigkeit: ±0,432 Sek. pro Tag
Quarzfrequenz: 32,768 kHz
Unterstütztes Protokoll: I2C
Abmessungen: 38 mm x 22 mm x 15 mm

allgemeine Informationen

Die meisten Mikroschaltungen wie DS1307 verwenden einen externen Quarzoszillator mit einer Frequenz von 32 kHz, haben jedoch einen erheblichen Nachteil: Wenn sich die Temperatur ändert, ändert sich die Quarzfrequenz, was zu einem Zeitfehler führt. Dieses Problem wird im DS3231-Chip behoben, der einen Quarzoszillator und einen Temperatursensor enthält, der Temperaturänderungen ausgleicht, sodass die Zeit genau bleibt (Temperaturdaten können bei Bedarf ausgelesen werden). Der DS3231-Chip unterstützt außerdem Informationen zu Sekunden, Minuten, Stunden, Wochentag, Datum, Monat und Jahr, überwacht außerdem die Anzahl der Tage in einem Monat und nimmt Anpassungen für Schaltjahre vor. Es unterstützt Uhren in zwei Formaten: 24 und 12, und es ist auch möglich, zwei Alarme zu programmieren. Das Modul arbeitet auf einem zweiadrigen I2C-Bus.


Nun ein wenig zum Modul selbst; es basiert auf dem DS3231N-Chip. Zum Hochziehen der 32K-, SQW-, SCL- und SDA-Leitungen wird die Widerstandsbaugruppe RP1 (4,7 kOhm) benötigt (bei Verwendung mehrerer Module mit I2C-Bus ist übrigens das Ablöten der Pull-up-Widerstände an anderen Modulen erforderlich) . Die zweite Widerstandsgruppe ist notwendig, um die Leitungen A0, A1 und A2 zu straffen; sie werden benötigt, um die Adressierung des AT24C32N-Speicherchips zu ändern. Der Widerstand R5 und die Diode D1 dienen zum Aufladen der Batterie und können grundsätzlich entfernt werden, da eine normale SR2032-Batterie jahrelang hält. Ein AT24C32N-Speicherchip ist ebenfalls verbaut, das ist wie ein Bonus; es ist nicht notwendig, dass der RTC DS3231N-Takt funktioniert. Der Widerstand R1 und die Power-LED signalisieren, dass das Modul eingeschaltet ist. Wie bereits erwähnt, arbeitet das Modul auf dem I2C-Bus; der Einfachheit halber wurden diese Busse auf zwei Anschlüsse J1 und J2 geführt; die Belegung der restlichen Kontakte ist unten zu sehen. Zweck J1
32K: Ausgang, Frequenz 32 kHz
SQW: Ausgabe
SDA: Datenleitung (Serial Dôta)
VCC: „+“-Modul-Stromversorgung
GND: „-“ Modul-Stromversorgung Zweck J2
SCL: Serielle Uhr
SDA: Serielle Datenleitung
VCC: „+“-Modul-Stromversorgung
GND: „-“ Modul-Stromversorgung


Ich erzähle Ihnen ein wenig über den AT24C32N-Chip. Dabei handelt es sich um einen Chip mit 32 KB Speicher (EEPROM) des Herstellers Atmel, montiert in einem SOIC8-Gehäuse, der auf einem zweiadrigen I2C-Bus betrieben wird. Die Adresse des Mikroschaltkreises ist 0x57; bei Bedarf kann sie einfach über die Jumper A0, A1 und A2 geändert werden (dadurch können Sie die Anzahl der angeschlossenen AT24C32/64-Mikroschaltkreise erhöhen). Da der AT24C32N-Chip über drei Adresseingänge (A0, A1 und A2) verfügt, die sich in zwei Zuständen befinden können, entweder log „1“ oder log „0“, stehen dem Chip acht Adressen zur Verfügung. von 0x50 bis 0x57.

DS3231 mit Arduino verbinden

Benötigte Teile:
Arduino UNO R3 x 1 Stk.
Echtzeituhr auf DS3231, RTC, SPI, AT24C32 x 1 Stk.
DuPont-Draht, 2,54 mm, 20 cm, F-M (Buchse - Stecker) x 1 Stk.
USB 2.0 A-B-Kabel x 1 Stk.

Verbindung:
In diesem Beispiel verwende ich nur das DS3231-Modul und Arduino UNO R3, alle Daten werden an „Port Monitoring“ übertragen. Die Schaltung ist nicht kompliziert, es werden nur vier Drähte benötigt. Zuerst verbinden wir den I2C-Bus, SCL in A4 (Arduino UNO) und SDA in A5 (Arduino UNO). Jetzt müssen nur noch die Stromversorgung GND mit GND und VCC verbunden werden 5V (kann aus 3,3V geschrieben werden), Schaltung zusammengebaut, jetzt müssen wir den Softwareteil vorbereiten.

Es gibt keine Bibliothek, die mit dem DS3231 in der Arduino IDE funktioniert. Sie müssen „DS3231“ herunterladen und zur Arduino-Entwicklungsumgebung hinzufügen.

Einstellen der DS3231-Zeit
Wenn Sie es zum ersten Mal einschalten, müssen Sie die Uhrzeit programmieren, das Beispiel aus der DS3231-Bibliothek „Datei“ -> „Beispiele“ -> „DS3231“ -> „Arduino“ -> „DS3231_Serial_Easy“ öffnen oder kopieren den Code von unten

/* Der Test wurde mit Arduino IDE 1.8.0 durchgeführt. Testdatum: 31.08.2018. */ #enthalten // Verbinden Sie die Wire DS3231-Bibliothek rtc(SDA, SCL); // Initialisiere DS3231 void setup() ( Serial.begin(115200); // Richte eine serielle Verbindung ein rtc.begin(); // Initialisiere rtc // Stelle die Zeit ein rtc.setDOW(FRIDAY); // Stelle den Tag ein der Woche rtc. setTime(16, 29, 0); // Setze die Uhrzeit auf 16:29:00 (24-Stunden-Format) rtc.setDate(31, 8, 2018); // Setze das Datum auf den 31. August 2018) void loop() ( Serial. print(rtc.getDOWStr()); // Tag-Woche senden Serial.print(" "); Serial.print(rtc.getDateStr()); // Datum senden Serial .print(" -- "); Serial. println(rtc.getTimeStr()); // Zeitverzögerung senden (1000); // Eine Sekunde verzögern)

Die Tests wurden mit der Arduino IDE 1.8.0 durchgeführt

Testdatum: 31.08.2018

#enthalten // Die Wire-Bibliothek einbinden

DS3231 RTC (SDA, SCL); // DS3231 initialisieren

void setup()

Seriell. begin(115200); // Eine serielle Verbindung herstellen

RTC. beginnen(); // RTC initialisieren

// Stellen Sie die Zeit ein

RTC. setDOW(FREITAG); // Wochentag festlegen

RTC. setTime(16, 29, 0); // Stellen Sie die Uhrzeit auf 16:29:00 (24-Stunden-Format) ein.

Leere Schleife()

Seriell. print (rtc . getDOWStr () ); // Tag-Woche senden

Seriell. drucken (" " ) ;

Seriell. print (rtc. getDateStr ()); // Datum senden

Seriell. drucken (" -- " ) ;

Seriell. println(rtc. getTimeStr()); // Zeit senden

Verzögerung (1000); // Eine Sekunde Verzögerung

Laden Sie die Skizze auf den Arduino-Controller hoch und öffnen Sie „Port Monitoring“

Der DS3231-Chip ist eine hochpräzise RTC-Echtzeituhr mit integriertem temperaturkompensierten Quarzoszillator, was zu einer Zeitabweichung von nur ±2 Minuten pro Jahr führt. Zusätzlich ist eine Alarmfunktion implementiert und es gibt auch einen Interrupt-Ausgang. Die Uhr kann als fertiges Arduino-Modul mit Umreifungselementen und Batteriefach erworben werden.

Ich habe das Modul hier bestellt. Das Diagramm ist im Bild unten dargestellt:


Die Mikroschaltung verwendet das weit verbreitete . Unterstützt Standard- (100 kHz) und hohe (400 kHz) Datenraten. Die Mikroschaltungsadresse (7 Bit) auf dem I2C-Bus ist 1101000. Darüber hinaus verfügt das Modul über einen I2C-Speicher (24C32), der im Diagramm nicht dargestellt ist.

Leistungsmodi

Die Versorgungsspannung der Mikroschaltung kann im Bereich von 2,3...5,5 V liegen, es gibt zwei Stromleitungen, für eine externe Quelle (Vcc-Leitung) sowie für die Batterie (Vbat). Die Spannung der externen Quelle wird ständig überwacht und wenn sie unter den Schwellenwert Vpf=2,5 V fällt, wird auf die Batterieleitung umgeschaltet. Die folgende Tabelle zeigt die Bedingungen für den Wechsel zwischen Stromleitungen:

Die Genauigkeit der Uhr wird durch die Überwachung der Umgebungstemperatur aufrechterhalten. Die Mikroschaltung startet einen internen Vorgang zur Anpassung der Frequenz des Taktgenerators; der Anpassungsgrad wird mithilfe eines speziellen Diagramms der Frequenz gegenüber der Temperatur bestimmt. Der Vorgang startet nach dem Einschalten der Stromversorgung und läuft dann alle 64 Sekunden.

Um Ladung zu sparen, startet der Taktgenerator beim Anschließen der Batterie (an die Vbat-Leitung angelegte Spannung) erst, wenn die Spannung auf der Vcc-Leitung den Schwellenwert Vpf überschreitet oder die korrekte Adresse der Mikroschaltung über übertragen wird die I2C-Schnittstelle. Die Startzeit des Taktgenerators beträgt weniger als eine Sekunde. Ungefähr 2 Sekunden nach dem Anlegen der Spannung (Vcc) oder dem Empfang der Adresse über die I2C-Schnittstelle beginnt der Frequenzkorrekturvorgang. Sobald der Taktgenerator gestartet ist, arbeitet er weiter, solange Vcc oder Vbat anliegt. Beim ersten Einschalten werden die Datums- und Uhrzeitregister zurückgesetzt und haben die folgenden Werte: 01.01.00 – 01 – 00.00.00 (Tag/Monat/Jahr/ – Wochentag – Stunde/Minuten). /Sekunden).

Der Stromverbrauch bei Stromversorgung über eine 3,63-V-Batterie beträgt 3 µA, sofern keine Datenübertragung über die I2C-Schnittstelle erfolgt. Der maximale Stromverbrauch kann 300 µA erreichen, wenn ein externes 5,5-V-Netzteil und eine hohe I2C-Datenübertragungsgeschwindigkeit verwendet werden.

Externe Reset-Funktion

Die RST-Leitung kann für einen externen Reset verwendet werden und verfügt außerdem über eine Unterspannungsalarmfunktion. Die Leitung wird über einen internen Widerstand hochgezogen; ein externer Hochlauf ist nicht erforderlich. Um die externe Reset-Funktion zu nutzen, kann zwischen der RST-Leitung und der gemeinsamen Leitung ein Taster angeschlossen werden; die Mikroschaltung verfügt über einen Schutz gegen Kontaktprellen. Die Alarmfunktion wird aktiviert, wenn die Versorgungsspannung Vcc unter den Schwellenwert Vpf fällt und die RST-Leitung auf einen niedrigen Logikpegel gesetzt ist.

Beschreibung der DS3231-Register

Die folgende Tabelle zeigt eine Liste der Echtzeituhrregister:

AdresseD7D6D5D4D3D2D1D0FunktionGrenzen
0x000 10 SekundenSekundenSekunden00-59
0x010 10 MinutenProtokollProtokoll00-59
0x020 12/24 Vormittags/Nachmittags10 StundenStundeUhr1-12 + AM/PM oder 00-23
10 Stunden
0x030 0 0 0 0 TagWochentag1-7
0x040 0 10NummerDatum01-31
0x05Jahrhundert0 0 10 MonateMonatMonate/Jahrhundert01.-12. Jahrhundert
0x0610 JahreJahrJahre00-99
0x07A1M110 SekundenSekundenSekunden, 1. Alarm00-59
0x08A1M210 MinutenProtokollMinuten, 1. Alarm00-59
0x09A1M312/24 Vormittags/Nachmittags10 StundenStundeUhr, 1. Alarm1-12 + AM/PM oder 00-23
10 Stunden
0x0AA1M4DY/DT10TagWochentag, 1. Alarm1-7
NummerDatum, 1. Alarm01-31
0x0BA2M210 MinutenProtokollMinuten, 2. Alarm00-59
0x0CA2M312/24 Vormittags/Nachmittags10 StundenStundeUhr, 2. Alarm1-12 + AM/PM oder 00-23
10 Stunden
0x0DA2M4DY/DT10TagWochentag, 2. Alarm1-7
NummerDatum, 2. Alarm01-31
0x0EEOSCBBSQWKONVRS2RS1INTCNA2IEA1IEEinstellungsregister (Steuerung)
0x0FO.S.F.0 0 0 EN32kHzBSYA2FA1FStatusregister
0x10ZEICHENDATENDATENDATENDATENDATENDATENDATENAlterungs-Offset-Register
0x11ZEICHENDATENDATENDATENDATENDATENDATENDATENTemperaturregister, High-Byte
0x12DATENDATEN0 0 0 0 0 0 Temperaturregister, Low-Byte

Zeitinformationen werden im binären Dezimalformat gespeichert, d. h. jede Ziffer einer Dezimalzahl (von 0 bis 9) wird als Gruppe von 4 Bits dargestellt. Bei einem Byte zählt das Low-Nibble Einsen, das High-Nibble Zehner usw. Die Zeit wird in Registern mit den Adressen 0x00-0x06 gezählt; für die Stundenzählung können Sie den 12- oder 24-Stunden-Modus wählen. Durch Setzen des 6. Bits des Uhrenregisters (Adresse 0x02) wird der 12-Stunden-Modus eingestellt, bei dem das 5. Bit die Tageszeit angibt, Wert 1 entspricht Nachmittag (PM), Wert 0 entspricht Nachmittag (AM). Der Nullwert des 6. Bits entspricht dem 24-Stunden-Modus, hier ist das 5. Bit an der Stundenzählung beteiligt (Werte 20-23).

Das Wochentagsregister wird um Mitternacht inkrementiert und zählt von 1 bis 7, das Monatsregister (Adresse 0x05) enthält das Jahrhundertbit (7. Bit), das bei einem Überlauf des Jahreszählregisters (Adresse 0x06) von 99 auf 00 wechselt .

Der DS3231-Chip implementiert zwei Wecker, der 1. Wecker wird über Register mit den Adressen 0x07-0x0A konfiguriert, der 2. Wecker wird über die Register 0x0B-0x0D konfiguriert. Über die Bits A1Mx und A2Mx können verschiedene Modi für Alarme konfiguriert werden; durch Setzen des Bits wird das entsprechende Register vom Vergleichsvorgang ausgeschlossen. Die folgenden Tabellen zeigen die Bitkombinationen für verschiedene Alarmmodi:

In den Tabellen nicht angegebene Bitkombinationen führen zu Fehlfunktionen der Alarme. Wenn das DY/DT-Bit gelöscht ist, wird die Datumsübereinstimmung (Monatstag) für den Wecker überwacht; wenn das DY/DT-Bit gesetzt ist, wird die Übereinstimmung des Wochentags überprüft.

Die meisten Funktionen werden im Control-Register konfiguriert. Das EOSC-Bit steuert den Start des Taktgenerators, das Zurücksetzen des Bits startet den Taktgenerator. Das Setzen des Bits stoppt den Generator, nur im Batteriebetrieb (Vbat). Bei Stromversorgung über eine externe Quelle (Vcc) läuft der Oszillator immer, unabhängig vom Status des EOSC-Bits. Wenn aktiviert, ist der Standardbitwert 0.

Durch Setzen des BBSQW-Bits kann der INT/SQW-Ausgang (3. Pin) im Batteriestrommodus betrieben werden, wenn keine externe Stromversorgung vorhanden ist. Wenn das Bit auf Null gesetzt ist, geht der INT/SQW-Ausgang in den Zustand 3 (deaktiviert), wenn die externe Quellenspannung Vcc unter den Schwellenwert Vpf fällt. Nach dem Anlegen der Stromversorgung ist der Standardbitwert 0.

Das CONV-Bit ist für die erzwungene Temperaturmessung zuständig; durch Setzen des Bits wird der Konvertierungsvorgang gestartet, bei dem auch die Taktgeneratorfrequenz angepasst wird; das Messergebnis steht in den Registern mit den Adressen 0x11, 0x12. Der Start ist nur möglich, wenn die vorherige Konvertierung abgeschlossen ist; vor dem Start müssen Sie das Besetzt-Flag BSY überprüfen. Die erzwungene Temperaturumwandlung hat keinen Einfluss auf den internen 64-Sekunden-Frequenzanpassungszyklus. Das Setzen des CONV-Bits hat 2 ms lang keinen Einfluss auf das BSY-Flag. Die CONV- und BSY-Bits werden nach Abschluss der Konvertierung automatisch gelöscht.

Die Bits RS2, RS1 legen die Frequenz der Rechteckimpulse (Rechteckwelle) am INT/SQW-Ausgang fest. Standardmäßig sind die Bits bei Aktivierung auf 1 gesetzt. Die folgende Tabelle zeigt die möglichen Kombinationen von Bits:

Das INTCN-Bit steuert den INT/SQW-Ausgang. Wird das Bit zurückgesetzt, erscheinen am Ausgang Rechteckimpulse (Rechteckwellen), deren Frequenz durch die Bits RS2, RS1 eingestellt wird. Wenn das INTCN-Bit gesetzt ist, wird der Ausgang zum Generieren von Alarm-Interrupts verwendet. Standardmäßig ist der Bitwert 1. Der Ausgangstyp ist INT/SQW – Open Drain, daher ist es notwendig, ihn über einen Widerstand auf einen hohen Logikpegel hochzuziehen, der aktive Pegel ist niedrig.

Das Setzen der Bits A1IE, A2IE ermöglicht Unterbrechungen beim 1. bzw. 2. Alarmsignal. Bits zurücksetzen, Interrupts deaktivieren. Der Standardwert ist 0.

Das Statusregister enthält Ereignisflags und steuert den 32-kHz-Ausgang. Das OSF-Flag spiegelt den Zustand des Taktgenerators wider. Ein Wert von 1 bedeutet, dass der Taktgenerator gestoppt ist. Dieses Ereignis kann in den folgenden Fällen auftreten:

  • Zum ersten Mal nach dem Anlegen der Stromversorgung
  • Batterie oder externe Spannung reichen nicht aus, um den Taktgenerator zu betreiben
  • Der Generator wird durch Setzen des EOSC-Bits im Batteriemodus ausgeschaltet
  • Externe Faktoren, die den Quarzoszillator beeinflussen (Rauschen, Leckage usw.)

Nach dem Setzen ändert sich der Bitwert nicht; das Bit muss manuell zurückgesetzt werden.

Das Setzen des EN32kHz-Bits ermöglicht die Erzeugung von Rechteckimpulsen (Rechteckwellen) am 32-kHz-Ausgang (1. Pin), die Impulsfrequenz ist fest und beträgt 32,768 kHz. Das Zurücksetzen des Bits deaktiviert diese Funktion und versetzt den Ausgang in den 3. Zustand (hohe Eingangsimpedanz). Standardmäßig ist der Bitwert 1; nach dem Anlegen der Spannung erscheinen Impulse am Ausgang. Der Ausgangstyp ist ein 32-kHz-Open-Drain, daher ist ein Hochziehen auf einen hohen Logikpegel erforderlich.

Das BSY-Busy-Flag wird während der Temperaturumwandlung und der Taktanpassung gesetzt. Das Flag wird zurückgesetzt, wenn die Konvertierung abgeschlossen ist.

Die Wecker-Flags A1F, A2F werden gesetzt, wenn die Werte der Zeitzählregister und der Weckerregister übereinstimmen. Wenn die Alarm-Interrupts A1IE, A2IE aktiviert sind und ein Interrupt-Ausgang zugewiesen ist (INTCN-Bit ist gesetzt), erscheint am INT/SQW-Ausgang ein Interrupt-Signal (Übergang von hohem auf niedrigen Logikpegel). Die Flags müssen manuell zurückgesetzt werden, indem der Wert 0 geschrieben wird.

Das Alterungsoffset-Register dient zur Anpassung der Taktgeneratorfrequenz. Der Registerwert wird während des internen Anpassungsvorgangs zur Oszillatorfrequenz addiert, wenn eine Temperaturänderung erkannt wird, und auch, wenn die Temperaturumwandlung durch das CONV-Bit ausgelöst wird. Der Offsetwert ist vorzeichenbehaftet, d.h. positive Werte (1-127) verringern die Frequenz, negative Werte (128-255) erhöhen sie. Bei gleichem Offset ist die Frequenzänderung je nach Temperatur unterschiedlich. Bei +25 °C beträgt die Frequenzänderung 0,1 ppm/LSB.

Der aktuelle Temperaturwert wird in Registern mit den Adressen 0x11 und 0x12, dem High- bzw. Low-Byte, gespeichert, der Temperaturwert in den Registern wird periodisch aktualisiert. Die Linksausrichtung ist eingestellt, die Auflösung beträgt 10 Bit oder 0,25°C/LSB, d. h. das High-Byte enthält den ganzzahligen Teil der Temperatur und das 6., 7. Bit in den Low-Registern bilden den Bruchteil. Im High-Byte gibt das 7. Bit das Vorzeichen der Temperatur an, beispielsweise entspricht der Wert 00011011 01 einer Temperatur von +27,25 °C, der Wert 11111110 10 entspricht einer Temperatur von -2,5 °C.

Beim Lesen von Zeitregistern empfiehlt es sich, einen zusätzlichen Puffer zu verwenden, also mehrere Register gleichzeitig und nicht einzeln zu lesen, da die Zeitregister zwischen einzelnen Lesevorgängen ihren Wert ändern können. Es wird empfohlen, diese Regel auch beim Schreiben neuer Daten in Kontoregister zu befolgen. Durch das Schreiben eines neuen Werts in das Sekundenregister wird die Uhr für 1 Sekunde angehalten. Die restlichen Register müssen in dieser Zeit neu geschrieben werden.

Anschließen von DS3231 an einen Mikrocontroller

Ich habe die Uhr an einen PIC16F628A-Mikrocontroller angeschlossen und verwendet. Das Anschlussdiagramm ist unten dargestellt:


Nach dem Anlegen der Stromversorgung werden auf den Anzeigen Striche (– – – – – –) angezeigt, dann wird die Uhr initialisiert, der Zeitwert erscheint auf den Anzeigen mit einer Verzögerung von 1 Sekunde, die zum Starten des Taktgenerators erforderlich ist. Die Indikatoren zeigen die Stunden, Minuten und Sekunden durch einen Dezimalpunkt getrennt an und das Zeitformat ist 24 Stunden. Mit der SB1-Taste „Anzeige“ können Sie das Anzeigeformat ändern, wobei die Indikatoren die Temperatur sowie den Wert von Stunden und Minuten anzeigen, getrennt durch einen Dezimalpunkt, der mit einer Frequenz von 2 Hz blinkt. Die Temperatur wird ohne Nachkommastellen angezeigt, das Programm liest nur das High-Byte des Temperaturspeichers an Adresse 0x11.

Der Zeitwert wird von der Uhr über einen Interrupt auf der SQW/INT-Leitung gelesen, der durch das 1. Alarmsignal gesteuert wird; während der Uhreninitialisierung wird der Wecker auf ein Sekundensignal eingestellt. Die HL1-LED dient als Anzeige und blinkt beim Interrupt-Signal im Sekundentakt. Die HL2-LED leuchtet, wenn bei der Datenübertragung über die I2C-Schnittstelle ein Fehler vorliegt.

Zusätzlich habe ich dem Programm die Möglichkeit hinzugefügt, die Uhr über die Tasten SB2 „Einstellungen“ und SB3 „Installation“ einzustellen. Der Setup-Modus wird durch Drücken der Taste SB2 aufgerufen; die Anzeigen zeigen 00 Stunden und Striche anstelle von Minuten und Sekunden an (00 – – – –). Mit der Taste SB3 stellen Sie den Stundenwert ein (erhöhen Sie ihn bei jedem Drücken), dann wechseln Sie mit der Taste SB2 zur Bearbeitung der Minuten; anstelle eines Strichs werden 00 Minuten angezeigt. Taste SB3 stellt auch den gewünschten Wert ein und so weiter. Nach dem Bearbeiten der Sekunden und dem Drücken der Taste SB2 wird die Zeit in der Uhr neu geschrieben und die aktualisierte Zeit wird auf den Anzeigen angezeigt.

Nachfolgend finden Sie einen Teil des Programmcodes (die Vollversion kann am Ende des Artikels heruntergeladen werden):

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; #enthalten LIST p=16F628A __CONFIG H"3F10" ;Mikrocontroller-Konfigurationsfehlerlevel -302 ;Meldungen mit Fehler 302 in der Auflistung nicht anzeigen Sec equ 0020h ;Hilfskontoregister Sec1 equ 0021h ; Sec2 Equ 0022h ; scetbit equ 0024h;Hilfsregister zum Zählen der Anzahl der Bits perem equ 0025h;Hilfsregister für Byte-Empfang/-Übertragung über SPI, i2c temp equ 0026h;Temperaturregister perem_1 equ 0027h;Hilfsregister für Binär-Dezimal-Konverter. result equ 0028h ;Binär-Dezimal-Konverter-Hilfsregister dat_ind equ 0029h ;Datenregister für die Übertragung über das SPI-Protokoll adr_ind equ 002Ah ;Adressregister für die Übertragung über das SPI-Protokoll Sekunde equ 002Bh ;Sekundenspeicherregister zum Einstellen der Uhrzeit Minute equ 002Ch ;Minutenspeicherregister zum Einstellen der Uhrzeit Stunde equ 002Dh ; Stundenspeicherregister für Zeiteinstellungen adr_i2c equ 002Eh ;Register der i2c-Schnittstellen-Datenübertragungsunterroutine tmp_i2c equ 002Fh Slave_adr equ 0030h data_i2c equ 0031h Flag equ 007Fh ;Flag-Register #DEFINE int PORTB,0 ;Interrupt-Leitung INT/SQW DS3231 #DE FEIN sda PORTB ,1 ; SDA-Leitung für Verbindungen DS3231 #DEFINE scl PORTB,2 ;SCL-Leitung für die Verbindung DS3231 #DEFINE sda_io TRISB,1 ;Richtung der SDA-Leitung #DEFINE scl_io TRISB,2 ;Richtung der SCL-Leitung #DEFINE datai PORTB,5 ;Dateneingangsleitung des MAX7219-Treibers #DEFINE cs PORTB ,6 ;Treiberauswahlleitung MAX7219 #DEFINE clk PORTB,7 ;Treibertaktleitung MAX7219 #DEFINE led PORTB,4 ;i2c-Fehler-LED #DEFINE led_sec PORTB,3 ;Taktfortschrittsanzeige LED 1Hz #DEFINE regim PORTA,2 ;Anzeigetaste – Anzeigemodus ändern #DEFINE nast PORTA,3 ;Einstelltaste – Aufruf des Zeiteinstellmodus #DEFINE ust PORTA,4 ;Einstelltaste – Uhrzeitwert einstellen;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;Programmausführung ab Adresse 0000h starten goto Start ;zur Startbezeichnung gehen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Hauptprogramm starten movlw b"00000000" ;Werte der Ausgangslatches von Port A festlegen movwf PORTA ; movlw b"01000000" ;Legt die Werte der Ausgangslatches von Port B fest movwf PORTB ; movlw b"00000111" ;Komparatoren ausschalten movwf CMCON ; bsf STATUS,RP0 ;wählen Sie die 1. Bank aus movlw b"00000111" ;richten Sie die Eingabe-/Ausgabeleitungen von Port B ein movwf TRISB ;RB0-RB2 - für die Eingabe, der Rest für die Ausgabe movlw b"11111111" ;richten Sie die Eingabe/ Ausgabezeilen von Port A movwf TRISA ;alle Zeilen zur Eingabe bcf STATUS,RP0 ;Bank 0 auswählen clrf Flag ;Flag zurücksetzen Register aufrufen init_lcd ;Treaufrufen (MAX7219) viv_not aufrufen ;Strichsymbole ausgeben " ------ " ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; movlw b"11010000" ;Geräteadresse (DS3231) movwf Slave_adr ;Schreibe 4 Bytes über i2c in die Empfangs-/Senderegister;hier wird der 1. Alarm konfiguriert, der jede Sekunde piept. movlw data_i2c ;setze das erste Empfangs-/Senderegister über i2c movwf FSR ; movlw b"10000000" ;Daten für das Sekundenregister des 1. Alarms movwf INDF ; incf FSR,F ; movlw b"10000000" ;Daten für das Minutenregister des 1. Alarms movwf INDF ; incf FSR,F ; movlw b"10000000" ;Daten für das Uhrenregister des 1. Weckers movwf INDF ; incf FSR,F ; movlw b"10000000" ;Daten für das Datums-/Wochentagsregister des 1. Alarms movwf INDF ; movlw. 4 ;4 Bytes über i2c übertragen movwf tmp_i2c ; movlw 0x07 ;Einstellen der Adresse des Sekundenregisters des 1. Weckers movwf adr_i2c ; call write_i2c ;Aufruf der Schreibunterroutine über die i2c-Schnittstelle call err_prov ;Prüfung auf I2C-Schreib-/Lesefehler movlw .1 ;Übertragung des 1. Bytes über i2c movwf tmp_i2c ; movlw 0x0E ;Festlegen der Adresse des Steuerregisters movwf adr_i2c ; movlw data_i2c ;Setzen des ersten Sende-/Empfangsregisters über i2c movwf FSR ; movlw b"00000101" ;Taktgenerator starten, Betrieb des INT/SQW-Pins für movwf INDF ;Batterieleistungsmodus, Impulsfrequenz am INT/SQW-Ausgang beträgt 1 Hz, ;der INT/SQW-Ausgang wird zur Alarmerzeugung verwendet Uhr-Interrupts, ;Wecker-Interrupts aktivieren 1. Alarm aufrufen write_i2c ;Aufruf der Aufnahme-Subroutine über die i2c-Schnittstelle call err_prov ;Überprüfung auf I2C-Schreib-/Lesefehler met_2 movlw .1 ;Übertragen des 1. Bytes über i2c movwf tmp_i2c ; movlw 0x0F ;Adresse des Statusregisters festlegen movwf adr_i2c ; movlw data_i2c ;Setzen des ersten Sende-/Empfangsregisters über i2c movwf FSR ; movlw b"00000000" ;das OSF-Bit zurücksetzen, die Erzeugung von Impulsen am EN32kHz-Ausgang verhindern, movwf INDF ;die Alarm-Interrupt-Flags A2F, A1F zurücksetzen call write_i2c ;die Aufzeichnungsunterroutine über die i2c-Schnittstelle aufrufen call err_prov ;auf I2C-Schreiben prüfen /Fehler lesen met_1 btfsc int ; Alarm-Interrupt-Leitung abfragen goto met_3; bsf led_sec ;die Fortschrittsanzeige-LED der Uhr einschalten goto met_4 ; met_3 bcf led_sec ;schaltet die Fortschrittsanzeige-LED der Uhr aus btfsc nast ;fragt die Schaltfläche zum Einstellen der Uhr ab gehe zu met_5 ; call nast_time ;rufen Sie die Unterroutine zum Einstellen der Zeit auf goto met_2 ; met_5 btfsc regim ;Abfrage der Anzeigemodus-Schaltfläche gehe zu met_1 ; met_6 call paus_knp ; BTFSS-Regim; gehe zu met_6 ; btfss flag,2 ;den Wert des Anzeigemodus-Flags ändern goto met_7 ; bcf flag,2 ;Anzeigeflag zurücksetzen, Uhranzeigemodus gehe zu met_1 ; met_7 bsf flag,2 ;Anzeige-Flag, Temperatur- und Uhranzeigemodus einstellen gehe zu met_1 ; met_4 movlw .1 ;Übertragen des 1. Bytes über i2c movwf tmp_i2c ; movlw 0x11 ;Festlegen der Adresse des Hochtemperaturregisters movwf adr_i2c ; call read_i2c ;Aufruf der Leseunterroutine über I2C call err_prov ;Überprüfung auf I2C-Schreib-/Lesefehler movf INDF,W ;Kopieren des Temperaturwerts in das Temp-Register movwf temp rd_time movlw .3 ;Übertragen von 3 Bytes über i2c movwf tmp_i2c ; movlw 0x00 ;Festlegen der Sekundenregisteradresse movwf adr_i2c ; call read_i2c ;Aufruf der Leseunterroutine über I2C call err_prov ;Prüfung auf I2C-Schreib-/Lesefehler btfsc flag,2 ;Abfrage des Anzeigemodus-Flags goto met_8 ; call vivod ;Aufruf des Unterprogramms zur Anzeige des Uhrwerts auf der Digitalanzeige goto met_2 ; met_8 call vivod_temp ;Aufruf der Unterroutine zur Anzeige von Temperatur und Uhr auf der Digitalanzeige goto met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

#enthalten

CONFIG H"3F10" ;Mikrocontroller-Konfiguration

errorlevel -302 ;Fehlermeldungen des Typs 302 werden nicht in der Liste angezeigt

Sec Equ 0020h ;Hilfskontoregister

Sec1 Equ 0021h ;

Sec2 Equ 0022h ;

scetbit equ 0024h ;zählt die Anzahl der Bits des Hilfsregisters

perem equ 0025h ;Hilfsbyte-Empfangs-/Übertragungsregister über SPI, I2C

temp equ 0026h ;Temperaturregister

perem_1 Equ 0027h ;BCD-Hilfsregister

result equ 0028h ;Binär-Dezimal-Konverter-Hilfsregister

dat_ind equ 0029h ;Datenregister für die Übertragung über das SPI-Protokoll

adr_ind equ 002Ah ;Adressregister für die Übertragung per SPI-Protokoll

Sekunde equ 002Bh ;Sekundenspeicherregister zum Einstellen der Uhrzeit

minut equ 002Ch ;Minutenspeicherregister zum Einstellen der Uhrzeit

Stunde equ 002Dh ;Stundenspeicherregister zum Einstellen der Uhrzeit

adr_i2c equ 002Eh ;Register der Datenübertragungsunterroutine der i2c-Schnittstelle

tmp_i2c gleich 002Fh

Slave_adr gleich 0030h

data_i2c gleich 0031h

flag equ 007Fh ;Flag-Register

#DEFINE int PORTB,0 ;Leitung unterbrechen INT/SQW DS3231

#DEFINE sda PORTB,1 ;SDA-Leitung zum Anschluss von DS3231

#DEFINE scl PORTB,2 ;SCL-Leitung zum Anschluss von DS3231

#DEFINE datai PORTB,5 ;Dateneingangszeile des MAX7219-Treibers

#DEFINE cs PORTB,6 ;Treiberauswahlzeile MAX7219

#DEFINE clk PORTB,7 ;Uhrleitung des MAX7219-Treibers

#DEFINE-LED PORTB,4 ;i2c-Fehler-LED

#DEFINE led_sec PORTB,3 ;LED-Uhrfortschrittsanzeige 1Hz

#DEFINE regim PORTA,2 ;Anzeigetaste – ändert den Anzeigemodus

#DEFINE nast PORTA,3 ;Einstellungstaste – ruft den Zeiteinstellungsmodus auf

#DEFINE ust PORTA,4 ;Set-Taste – Stellen Sie den Uhrwert ein

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

org 0000h ;Programmausführung ab Adresse 0000h starten

goto Start ;gehe zum Start-Label

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Hauptprogramm

Starten Sie movlw b"00000000"; legen Sie die Werte der Ausgangslatches von Port A fest

movlw b"01000000" ;Legt die Werte der Ausgangslatches von Port B fest

movlw b"00000111" ;Komparatoren ausschalten

bsf STATUS,RP0 ;1. Bank auswählen

movlw b"00000111" ;Konfigurieren der Ein-/Ausgabeleitungen von Port B

movwf TRISB ;RB0-RB2 - zum Eingang, der Rest zum Ausgang

movlw b"11111111" ;Einrichten der Ein-/Ausgabeleitungen von Port A

movwf TRISA ;alle Zeilen zur Eingabe

bcf STATUS,RP0 ;Bank 0 auswählen

clrf flag ;Flagregister zurücksetzen

call init_lcd ;rufen Sie die Treiberinitialisierungsroutine auf (MAX7219)

Rufen Sie viv_not auf und geben Sie Strichsymbole „ ------“ an Indikatoren aus

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

movlw b"11010000" ;Geräteadresse (DS3231)

;4 Bytes über i2c in die Empfangs-/Senderegister schreiben

movlw data_i2c ;Setzen des ersten Empfangs-/Senderegisters über i2c

movlw b"10000000" ;Daten für das Sekundenregister des 1. Alarms

movlw b"10000000" ;Daten für das Minutenregister des 1. Alarms

movlw b"10000000" ;Daten für das 1. Weckerregister

movlw b"10000000" ;Daten für das Datums-/Wochentagsregister des 1. Alarms

movlw .4 ;4 Bytes über i2c übertragen

movlw 0x07 ;Einstellen der Adresse des Sekundenregisters des 1. Weckers

Diese Rezension richtet sich an Funkamateure (die gerne löten) und an diejenigen, die sich für den Prozess selbst interessieren. Sie können Ihr Können bewerten. Der DS3231-Chip ist eine Echtzeituhr (RTC) mit integriertem Quarzoszillator und Temperaturkompensation.

Dabei handelt es sich natürlich nicht um das Löten eines Oszilloskops. Ebene darunter. Aber es ist eine interessante Aktivität.
Lassen Sie uns kurz die Form durchgehen, in der alles angekommen ist.


Der Inhalt befand sich in zwei Beuteln. Standardtaschen mit Schloss. In einer großen befand sich eine kleine Tüte mit Kleinigkeiten.


Das Kit beinhaltete:
- Als Korpus dienen zwei Platten aus durchscheinendem Kunststoff (getönt und mit Folie vor Kratzern geschützt).
- Brett (sehr hochwertig).


Zwei Matrizen.


Auf der Vorderseite sind sie durch eine Folie geschützt. Die Beine wurden durch poröses Polyethylen geschützt.


Das USB-Kabel ist etwa einen Meter lang.


Ich habe alles ausgeschüttet, was noch übrig war.


In zwei Teile geteilt.
Schrauben mit Muttern.


Und die Tatsache, dass man löten muss.


Ein Sockel für eine Lithiumbatterie im sehr seltenen CR1220-Format, ein Quecksilber-Positionssensor, ein Paar Transistoren, Elektrolytkondensatoren, ein AMS1117-Stabilisator (3,3 V), SMD-Kondensatoren und Widerstände (10 K), 3 Tasten, ein USB-Anschluss, a Summer.
Das Wichtigste ist der STC 15w1k24s-Controller und der hochpräzise DS3231-Chip. Sie waren in einem sehr harten Blister verpackt, der sich kaum falten ließ.


Es gab kein Schema. Es stellten sich jedoch keine Fragen ein, alles war klar.
Alle Details auf der Tafel sind nicht nur beschriftet, sondern auch (bedingt) eingezeichnet.
Es ist einfach.
Aber zuerst habe ich mich vorbereitet.


Ich begann damit, die beiden komplexesten Mikroschaltungen (ich dachte es) zu löten. An zwei Stellen (diametral gegenüberliegend) positioniert und gegriffen. Und dann habe ich es richtig verlötet. Vergessen Sie nicht, es festzuhalten, damit sie nicht „weglaufen“.


Dann der Stabilisator.


Transistor.


Vier SMD-Widerstände und zwei SMD-Kondensatoren. Das Positionieren und Greifen von einer Kante aus war nicht so einfach (es erfordert Geschick). Und ich habe nicht genug davon :).


Zwei Elektrolyte.


USB-Anschluss.


Lithium-Batterie-Anschluss.


Quietscher. Vergessen Sie nicht das Plus und Minus. Nach dem Löten habe ich die Beine genau richtig abgebissen, ich möchte nicht, dass sie später beim Löten der Dies stören.


Quecksilber-Positionssensor.


3 Knöpfe.


Und schließlich Matrizen. Achten Sie auf die Ausrichtung. Dies ist die Oberseite (der Hochtöner befindet sich links).


Das ist, was passiert ist.


Zwar waren noch Ersatzteile übrig (wahrscheinlich für den Fall eines Verlusts): ein Transistor, zwei Widerstände und ein Kondensator.


Ich wasche es vom Flussmittel ab.
Ich überprüfe.
Sie arbeiten!
Ich entferne die Schutzfolien.


Ich sammle.

Nach dem Einschalten gratulierte mir die Uhr zum neuen Jahr.


Kein Wunder, am 1. Januar 2000 steht die Uhr auf 00 Stunden 01 Minuten.


Achten Sie nicht auf die unterschiedlichen Farben der Matrix. Die Bildwiederholfrequenz des „Bildschirms“ ist vergleichbar mit der Verschlusszeit der Kamera. Das menschliche Auge sieht alles in der richtigen roten Farbe. Deshalb habe ich beim Videodreh die Fenster ein wenig abgeschattet (um die Verschlusszeit zu verlängern).
Jetzt müssen wir es konfigurieren.
Die Uhr verfügt über drei Knöpfe auf der Rückseite. Ich selbst habe sie konventionell genannt (von oben nach unten):
1. Menü.
2. Plus.
3. Minus.
Siehe den Setup-Algorithmus. Wenn Sie eine Uhr in Ihren Händen halten, wird auch das Unklare klarer 
Um einzutreten, halten Sie die obere Taste (Menü) eine Weile gedrückt. Als nächstes arbeiten wir mit kurzen Drücken.

Lassen Sie mich etwas erklären. Insgesamt gibt es sechs Menüs. Sie wechseln im Kreis. Sie können die Plus-Taste verwenden, Sie können die Minus-Taste verwenden.
ZEIT – Zeiteinstellung.
DATUM – Datumseinstellung.
ALAR – Alarmeinstellung.
SCHRIFTART – Auswahl an Schriftarten (insgesamt 5 Typen: dünn, breit, glatt...).
DISP – Auswahl des Informationsausgabealgorithmus (Sie können nur eine Uhr verwenden, Sie können nacheinander wechselnde Informationen erhalten: Uhrzeit, Temperatur, Datum, Feiertage in einer schleichenden Linie ...).
MIDP – Wählen Sie die Art der Teilungspunkte aus.


Es ist nicht einfach, alles mit Worten zu erklären. Dies habe ich im Video ausführlich gezeigt (Link am Ende).
Und in diesem Video (30 Sekunden) sehen Sie den Algorithmus zur Anzeige von Informationen auf Matrizen (Menü DISP Typ2).


Wichtiger Hinweis. Ohne Lithiumbatterie gehen Uhrzeit und Datum nach dem Einstellen verloren. Die restlichen Einstellungen bleiben im Speicher.
Habe es an ein normales Ladegerät angeschlossen. Ich habe meinen Verbrauch gemessen.


Ein USB-Gerät zeigt nichts an, wenn es weniger als 50 mA verbraucht (dies ist eine Funktion).
Fazit: Im Clock-Modus beträgt der Stromverbrauch weniger als 50mA, im Ticker-Modus sind es etwa 70mA. Nicht so viel.
Ich habe die Abmessungen gemessen: 105*85mm.
Die Zahlen in der Standardanzeige betragen jeweils 20*30mm.


Ich habe es vor den Fernseher gestellt.


Den Quecksilber-Positionssensor hätte ich fast vergessen.
Die Uhr zeigt immer richtig an, auch wenn sie auf den Kopf gestellt wird. Die Quecksilberkugel schließt oder öffnet die Kontakte. Dementsprechend ändert der Controller den Algorithmus zur Ausgabe von Informationen an Matrizen.
Das ist es im Grunde.
Es ist Zeit, Bilanz zu ziehen.
Ein gutes DIY-Kit für beginnende Funkamateure, um ihre Fähigkeiten zu testen. Darüber hinaus ist dies nicht nur ein Trainingsset, sondern am Ende ist es eine gute Uhr geworden.
Was ich geschrieben habe, sollte für eine korrekte Schlussfolgerung ausreichen.
Wenn etwas unklar ist, stellen Sie Fragen. Ich hoffe, es hat zumindest jemandem geholfen.
Viel Glück!

Das Produkt wurde vom Shop zum Verfassen einer Rezension bereitgestellt. Die Bewertung wurde gemäß Abschnitt 18 der Website-Regeln veröffentlicht.

Ich habe vor, +61 zu kaufen Zu den Favoriten hinzufügen Die Rezension hat mir gefallen +66 +122

Unterscheidungsmerkmale:

  • Genauigkeit ±2 ppm über einen Temperaturbereich von 0 °C bis +40 °C
  • Genauigkeit ±3,5 ppm über einen Temperaturbereich von -40 °C bis +85 °C
  • Eingang zum Anschluss einer autonomen Stromquelle, um einen kontinuierlichen Betrieb zu gewährleisten
  • Betriebstemperaturbereich gewerblich: von 0°C bis +70°C industriell: -40°C bis +85°C
  • Geringer Konsum
  • Echtzeituhr, die Sekunden, Minuten, Stunden, Wochentage, Tage des Monats, Monat und Jahr zählt, mit Schaltjahrkorrektur bis 2100
  • Zwei tägliche Alarme
  • Rechteckwellenausgang mit programmierbarer Frequenz
  • Schnelle (400 kHz) I 2 C-Schnittstelle
  • 3,3 V Leistung
  • Digitaler Temperatursensor mit Messgenauigkeit ±3°C
  • Register mit Daten über die erforderliche Anpassung
  • Nicht-RST-Reset-Eingang/Ausgang

Anwendung:

  • Server
  • Elektronische Stromzähler
  • Telematikausrüstung
  • GPS-Systeme

Typisches Anschlussdiagramm für DS3231:

Allgemeine Beschreibung:

Der DS3231 ist eine hochpräzise Echtzeituhr (RTC) mit integrierter I 2 C-Schnittstelle, temperaturkompensiertem Quarzoszillator (TCXO) und Quarzresonator. Das Gerät verfügt über einen Eingang zum Anschluss einer autonomen Notstromquelle, die die Zeitmessung und Temperaturmessung auch bei ausgeschalteter Hauptversorgungsspannung ermöglicht. Der eingebaute Quarzresonator erhöht die Lebensdauer des Gerätes und reduziert die erforderliche Anzahl externer Elemente. Der DS3231 ist in kommerziellen und industriellen Temperaturversionen erhältlich und in einem 300-mil-16-Pin-SO-Gehäuse verpackt.

RTC ermöglicht die Zählung von Sekunden, Minuten, Stunden, Wochentagen, Monatstagen und Jahren. Das Enddatum des Monats wird automatisch unter Berücksichtigung von Schaltjahren ermittelt. Die Echtzeituhr arbeitet im 24- oder 12-Stunden-Format mit Anzeige der aktuellen Tageshälfte (AM/PM). Das Gerät verfügt über zwei tägliche Alarme und einen Rechteckwellenausgang mit programmierbarer Frequenz. Der Datenaustausch mit dem Gerät erfolgt über die eingebaute serielle I 2 C-kompatible Schnittstelle.



Freunden erzählen