Frage zur RTC-Einstellung

Hallo Leute,

ich habe eine Frage zum Verständnis der Einstellung einer RTC (MCP79410). Hier mal ein Abschnitt aus einem code (nicht meiner, deswegen diese Frage):

WriteRTCByte(0,0);       //STOP RTC
  WriteRTCByte(1,0x18);    //MINUTE=18
  WriteRTCByte(2,0x11);    //HOUR=11
  WriteRTCByte(3,0x09);    //DAY=1(MONDAY) AND VBAT=1
  WriteRTCByte(4,0x28);    //DATE=28
  WriteRTCByte(5,0x02);    //MONTH=2
  WriteRTCByte(6,0x11);    //YEAR=11
  WriteRTCByte(0,0x80);    //START RTC, SECOND=00

In der Doku zum MCP steht Folgendes:

Addresses 0x00h-0x06h are the RTCC Time and
Date registers. These are read/write registers.
Care must be taken when writing to these registers
with the oscillator running.

Mir kommt das so vor als ob im code die Adresse mit dem einzuscheibenden Wert verwechselt wurde. Stimmt das oder habe ich den Syntax falsch interpretiert?
Wenn's im code richtig ist: Kann mir das mal jemand erklären?

Vielen Dank im Voraus und frohe Ostern! :smiley:
Mirko

EDIT:
Der code ist von hier.

Hallo,

von welcher RTC redest du denn überhaupt?

Doc_Arduino:
Hallo,
von welcher RTC redest du denn überhaupt?

Er hat MCP79410 geschrieben.

Grüße Uwe

Danke, Uwe.

Das konnte er aber noch nicht sehen, weil ich zu Anfang tatsächlich nur "MCP" geschrieben hatte. Ich habe das wohl gleichzeitig mit seiner Frage korrigiert.
Danke für den Link zur Doku. Auf Seite 12 sind die Adressen gelistet.

Gruß,
Mirko

Drei Vorbemerkungen:

  • Ich hätte mir einen besseren Nichname als Kriegerdaemon gewünscht :frowning:
  • Den von Dir als Vorlage genutzten MCP79410 RTC Arduino Code finde ich wenig geeignet für einen Arduino: while(1){} :stuck_out_tongue_closed_eyes:
  • Ich habe keine praktischer Erfahrung mit MCP79410.Dessen ungeachtet:

Kriegerdaemon:
Mir kommt das so vor als ob im code die Adresse mit dem einzuscheibenden Wert verwechselt wurde.

Die Funktion void WriteRTCByte(const unsigned char adr, const unsigned char data) möchte als ersten Parameter die Adresse, dann die Daten. Mittels WriteRTCByte(1,0x18); //MINUTE=18 wird erst die Adresse "1" übergeben, dann die Minuten. Da sehe ich keine Verwechslung. :slight_smile:

Dankeschön! :slight_smile:

agmue:
Drei Vorbemerkungen:

  • Ich hätte mir einen besseren Nichname als Kriegerdaemon gewünscht :frowning:
  • Den von Dir als Vorlage genutzten MCP79410 RTC Arduino Code finde ich wenig geeignet für einen Arduino: while(1){} :stuck_out_tongue_closed_eyes:
  • Ich habe keine praktischer Erfahrung mit MCP79410.
  • Und ich bin wiederum kein Freund von Namen, die so kryptisch sind, dass sie sich wie ein Insiderwitz anhören.
  • Darf ich Dich vor jedem Kauf fragen, ob es die optimale Wahl ist? :slight_smile: LOL Das while(1){} ist wirklich strange!
  • Ich auch nicht. Wenn's Dich interessiert, geb ich gern mal ein paar Infos ab, wenn es funktioniert.

Dessen ungeachtet:

Herzlichen Dank für Deine Hilfe und die zusätzliche Erklärung! Das hat doch sehr geholfen etwas mehr Verständnis zu erlangen.

Zu 1. Da haben wir wohl unterschiedliche Empfindungen.

Zu 2. Nein bitte nicht! Kaufe was Du magst! Ich habe nicht geschrieben, diese RTC sei schlecht, weiß ich nicht, daher habe ich da keine Meinung zu. Ich vermute auch, das Beispielprogramm funktioniert. Würde die Initialisierung in setup() und die Anzeige in loop() stehen, fände ich das entschieden besser. Sonst ist die Integration in ein größeres Projekt schwierig. Dazu gibt es viele Fragen hier im Forum. Sollte nur eine Warnung und Bitte sein, es besser zu machen.

Zu 3. Manche Sachen probiere ich aus. Hättest Du DS3231, würde ich diese RTC in mein Steckbrett stopfen und den Sketch ausprobieren, bevor ich zum Thema schreibe. Das kann ich mangels Hardware aber nicht, daher fußen meine Angaben nur auf theoretischem Datenblattstudium. Anders gesagt: Ziehe praktische Erfahrungen bitte meinen theoretischen Überlegungen vor. Nur muß halt jemand praktische Ergahrungen gesammelt haben und dies dann hier auch kundtun wollen.

Kriegerdaemon:
Wenn's Dich interessiert, geb ich gern mal ein paar Infos ab, wenn es funktioniert.

Ja bitte, da es auch viele passive Mitleser gibt!

Auf jeden Fall wünsche ich frohe Festtage :slight_smile:

Hallo,

also mal ehrlich. Über Nicknamen müssen wir nun wirklich nicht diskutieren. Und das zu Ostern. Zu viel Langeweile oder was? Wir sind hier gegenüber krassen Rechtschreibfehlern tolerant, Legastheniker sozusagen, solange man es lesen kann von mir aus, da werden uns doch Nicknamen nicht stören. Osterei flach rollen ... :slight_smile:

19.jpg

Zurück zum MCP79410. Wenn ich mir die Register so anschaue, dann funktioniert das ähnlich dem DS3231. Nur das man vorm stellen den Oscillator stoppen muß. Wie beim Maxim muß alles von BCD nach Dezimal bzw. zurück gewandelt werden. Das macht alles demnach die Lib für ihn. Ich sehe erstmal keine grundlegenden Probleme für ihn.

Im Unterschied zu DS3231 werden alle Register einzeln angesprochen, so als gäbe es keinen Registerpointer. Ob es einen gibt, habe ich dem Datenblatt nicht entlocken können.

Doc_Arduino:
Ich sehe erstmal keine grundlegenden Probleme für ihn.

Da stimme ich mit Dir überein :slight_smile:

Hallo,

der gezeigte Code spricht alle einzeln an, wette aber ganz stark das sich der MCP wie der DS verhält. Das gehört jetzt getestet. :slight_smile:

@ Krieger

vorm Osterfeuer rufste deine Daemons zusammen und testest bitte den Code aus Gaudi. Ich wette das klappt.
I2C Adresse ändern und ab ... bin gespannt wie ein Osterhase :slight_smile:

/*
 MCP79410 RTC (I2C Bus)       
*/

#include <Wire.h>

#define RTC_I2C_ADDRESS 0x68    // I2C Adresse der RTC 

byte addr_00, addr_01, addr_02, addr_03, addr_04, addr_05, addr_06;

void setup()  {
  
  Serial.begin(9600);    
  Wire.begin();             
    
}   // Ende setup

void loop(void) {

  if (read_RTC_MCP79410_Register (RTC_I2C_ADDRESS) == true)  {     // RTC Register auslesen, wenn Fehlerstatus "wahr", dann
    Serial.println("MCP I2C Busfehler");
  }   

  delay(1000);

  
}   // Ende loop


/* ------------------------------------------------------------------------------------------------ */

bool read_RTC_MCP79410_Register (int i2c_adresse)
{                                          // aktuelle Zeit aus RTC auslesen
  bool error = false;                      // Fehlerstatus setzen
  Wire.beginTransmission(i2c_adresse);     // Connect
  Wire.write(0x00);                        // Anfrage ab/der Register Nummer 00h
  if (Wire.endTransmission() > 0 )         // war Connect fehlerfrei?
    { 
     error = true;                         // I2C Busfehler
     return error;                         // Abruch
    } 
  Wire.requestFrom(i2c_adresse, 7);        // 7 Bytes in Folge anfordern/lesen, Register 00h bis 06h
  if (Wire.available() > 0 )               // sind Daten vorhanden?
    {
     addr_00 = bcdToDec(Wire.read() & 0x7F);  // Maske für die ersten 7 Bits alleine
     addr_01 = bcdToDec(Wire.read() );        // Minuten
     addr_02 = bcdToDec(Wire.read() & 0x3F);  // Stunden und Umschaltung auf 24h statt 12h (AM/PM)
     addr_03 = bcdToDec(Wire.read() );        // Wochentag
     addr_04 = bcdToDec(Wire.read() );        // Tag
     addr_05 = bcdToDec(Wire.read() );        // Monat
     addr_06 = bcdToDec(Wire.read() );        // Jahr
    }  
    
  Serial.print("00h: "); Serial.println(addr_00); 
  Serial.print("01h: "); Serial.println(addr_01);  
  Serial.print("02h: "); Serial.println(addr_02); 
  Serial.print("03h: "); Serial.println(addr_03); 
  Serial.print("04h: "); Serial.println(addr_04); 
  Serial.print("05h: "); Serial.println(addr_05); 
  Serial.print("06h: "); Serial.println(addr_06); 
  return error;  
}


byte bcdToDec(byte val)  // Hilfsfunktion zum Lesen/Schreiben der RTC (jurs)
// Convert binary coded decimal to decimal number
// Hilfsfunktion für die Echtzeituhr
{
  return ( (val/16*10) + (val%16) );
}

Zu den Nicknamen: Wenn ein Name beleidigned oder sexistisch ist, gehe ich schon mal dazwischen; alles andere müßte keim Problem sein.

Damit Schluß mit der Nicknamendiskussion.

Grüße Uwe

Vielen Dank für Eure Hilfe.