RTC DS-1302 für meinen Wecker funktioniert nicht

Ich baue einen Wecker mit einen 7-Segment Display. Dieser soll die Zeit in Stunden und Minuten anzeigen. Ich verwende ein DS-1302 Modul. Wenn ich den Code laufenlasse gibt er etwas wie
19/80/2091 44:127:1 +
RTC lost confidence in the DateTime!
data read (20) = "⸮
aus. Ist mein DS-1302 kaputt oder habe ich im Programm einen Fehler gemacht?
Hier ist mein Code:

// CONNECTIONS:
// DS1302 CLK/SCLK --> 13
// DS1302 DAT/IO --> 1
// DS1302 RST/CE --> 0
// DS1302 VCC --> 3.3v - 5v
// DS1302 GND --> GND

#include <ThreeWire.h>  
#include <RtcDS1302.h>

ThreeWire myWire(1,13,0); // IO, SCLK, CE
RtcDS1302<ThreeWire> Rtc(myWire);
//7segment display declaration
int pinA = 2;
int pinB = 3;
int pinC = 4;
int pinD = 5;
int pinE = 6;
int pinF = 7;
int pinG = 8;
int D1 = 9;
int D2 = 10;
int D3 = 11;
int D4 = 12;

int digit_1 = 0;
int digit_2 = 8;
int digit_3 = 2;
int digit_4 = 3;

int counter = 0;
#define countof(a) (sizeof(a) / sizeof(a[0]))

const char data[] = "what time is it";

void setup () 
{
    Serial.begin(57600);
    
    //7 segment display setup
    pinMode(pinA, OUTPUT);     
    pinMode(pinB, OUTPUT);     
    pinMode(pinC, OUTPUT);     
    pinMode(pinD, OUTPUT);     
    pinMode(pinE, OUTPUT);     
    pinMode(pinF, OUTPUT);     
    pinMode(pinG, OUTPUT);   
    pinMode(D1, OUTPUT);  
    pinMode(D2, OUTPUT);  
    pinMode(D3, OUTPUT);  
    pinMode(D4, OUTPUT);
    
    Serial.print("compiled: ");
    Serial.print(__DATE__);
    Serial.println(__TIME__);
    
    Rtc.Begin();

    RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
    printDateTime(compiled);
    Serial.println();

    if (!Rtc.IsDateTimeValid()) 
    {
        Serial.println("RTC lost confidence in the DateTime!");
        Rtc.SetDateTime(compiled);
    }

    if (Rtc.GetIsWriteProtected())
    {
        Serial.println("RTC was write protected, enabling writing now");
        Rtc.SetIsWriteProtected(false);
    }

    if (!Rtc.GetIsRunning())
    {
        Serial.println("RTC was not actively running, starting now");
        Rtc.SetIsRunning(true);
    }

    RtcDateTime now = Rtc.GetDateTime();
    if (now < compiled) 
    {
        Serial.println("RTC is older than compile time!  (Updating DateTime)");
        Rtc.SetDateTime(compiled);
    }


/* comment out on a second run to see that the info is stored long term */
    // Store something in memory on the RTC
    uint8_t count = sizeof(data);
    uint8_t written = Rtc.SetMemory((const uint8_t*)data, count); // this includes a null terminator for the string
    if (written != count) 
    {
        Serial.print("something didn't match, count = ");
        Serial.print(count, DEC);
        Serial.print(", written = ");
        Serial.print(written, DEC);
        Serial.println();
    }
/* end of comment out section */
}

void loop () 
{
    RtcDateTime now = Rtc.GetDateTime();

    printDateTime(now);
    Serial.println(" +");
    
    if (!now.IsValid())
    {
        // Common Causes:
        //    1) the battery on the device is low or even missing and the power line was disconnected
        Serial.println("RTC lost confidence in the DateTime!");
    }

    

    // read data
    uint8_t buff[20];
    const uint8_t count = sizeof(buff);
    // get our data
    uint8_t gotten = Rtc.GetMemory(buff, count);

    if (gotten != count) 
    {
        Serial.print("something didn't match, count = ");
        Serial.print(count, DEC);
        Serial.print(", gotten = ");
        Serial.print(gotten, DEC);
        Serial.println();
    }

    Serial.print("data read (");
    Serial.print(gotten);
    Serial.print(") = \"");
    // print the string, but terminate if we get a null
    for (uint8_t ch = 0; ch < gotten && buff[ch]; ch++)
    {
        Serial.print((char)buff[ch]);
    }
    Serial.println("\"");

    //sinc the time
    digit_1 = (int)now.Hour()/10;
    digit_2 = ((now.Hour())-((int)now.Hour()/10));
    digit_3 = (int)now.Minute()/10;
    digit_4 = ((now.Minute())-((int)now.Minute()/10));
    //display time on th 7 segment display
    writeNumber(digit_1, 1);
    delay(2);
    writeNumber(digit_2, 2);
    delay(2);
    writeNumber(digit_3, 3);
    delay(2);
    writeNumber(digit_4, 4);
    delay(2);
    //debugging the display
    Serial.print(digit_1);
    Serial.print(digit_2);
    Serial.print(":");
    Serial.print(digit_3);
    Serial.print(digit_4);
    Serial.print("\n");
}



void printDateTime(const RtcDateTime& dt)
{
    char datestring[20];

    snprintf_P(datestring, 
            countof(datestring),
            PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
            dt.Month(),
            dt.Day(),
            dt.Year(),
            dt.Hour(),
            dt.Minute(),
            dt.Second() );
    Serial.print(datestring);
}

//functions to display the time on the 7 segment display
void zero(int digit){
  digitSelector(digit);
  //0
  digitalWrite(pinA, HIGH);   
  digitalWrite(pinB, HIGH);   
  digitalWrite(pinC, HIGH);   
  digitalWrite(pinD, HIGH);   
  digitalWrite(pinE, HIGH);   
  digitalWrite(pinF, HIGH);   
  digitalWrite(pinG, LOW);
}
void nextMinute(){
  digit_4++;
  if(digit_4 == 10){
    digit_4 = 0;
    digit_3++;
  }
  if(digit_3 == 6){
    nextHour();
    digit_3 = 0;
  }
}

void nextHour(){
  digit_2++;
  if(digit_2 == 10){
    digit_2 = 0;
    digit_1++;
  }
  if(digit_1 == 2 && digit_2 == 4){
    digit_1 = 0;
    digit_2 = 0;
  }
}

void writeNumber(int number, int digit){
  switch(number){
    case 0:
      zero(digit);
      break;
    case 1:
      one(digit);
      break;
    case 2:
      two(digit);
      break;
    case 3:
      three(digit);
      break;
    case 4:
      four(digit);
      break;
    case 5:
      five(digit);
      break;
    case 6:
      six(digit);
      break;
    case 7:
      seven(digit);
      break;
    case 8:
      eight(digit);
      break;
    case 9:
      nine(digit);
      break;
  }
}

void one(int digit){
  digitSelector(digit);
  //1
  digitalWrite(pinA, LOW);   
  digitalWrite(pinB, HIGH);   
  digitalWrite(pinC, HIGH);   
  digitalWrite(pinD, LOW);   
  digitalWrite(pinE, LOW);   
  digitalWrite(pinF, LOW);   
  digitalWrite(pinG, LOW);
}

void two(int digit){
  digitSelector(digit);
  //1
  digitalWrite(pinA, HIGH);   
  digitalWrite(pinB, HIGH);   
  digitalWrite(pinC, LOW);   
  digitalWrite(pinD, HIGH);   
  digitalWrite(pinE, HIGH);   
  digitalWrite(pinF, LOW);   
  digitalWrite(pinG, HIGH);
}

void three(int digit){
  digitSelector(digit);
  //1
  digitalWrite(pinA, HIGH);   
  digitalWrite(pinB, HIGH);   
  digitalWrite(pinC, HIGH);   
  digitalWrite(pinD, HIGH);   
  digitalWrite(pinE, LOW);   
  digitalWrite(pinF, LOW);   
  digitalWrite(pinG, HIGH);
}

void four(int digit){
  digitSelector(digit);
  //1
  digitalWrite(pinA, LOW);   
  digitalWrite(pinB, HIGH);   
  digitalWrite(pinC, HIGH);   
  digitalWrite(pinD, LOW);   
  digitalWrite(pinE, LOW);   
  digitalWrite(pinF, HIGH);   
  digitalWrite(pinG, HIGH);
}

void five(int digit){
  digitSelector(digit);
  //1
  digitalWrite(pinA, HIGH);   
  digitalWrite(pinB, LOW);   
  digitalWrite(pinC, HIGH);   
  digitalWrite(pinD, HIGH);   
  digitalWrite(pinE, LOW);   
  digitalWrite(pinF, HIGH);   
  digitalWrite(pinG, HIGH);
}

void six(int digit){
  digitSelector(digit);
  //1
  digitalWrite(pinA, HIGH);   
  digitalWrite(pinB, LOW);   
  digitalWrite(pinC, HIGH);   
  digitalWrite(pinD, HIGH);   
  digitalWrite(pinE, HIGH);   
  digitalWrite(pinF, HIGH);   
  digitalWrite(pinG, HIGH);
}

void seven(int digit){
  digitSelector(digit);
  //1
  digitalWrite(pinA, HIGH);   
  digitalWrite(pinB, HIGH);   
  digitalWrite(pinC, HIGH);   
  digitalWrite(pinD, LOW);   
  digitalWrite(pinE, LOW);   
  digitalWrite(pinF, LOW);   
  digitalWrite(pinG, LOW);
}

void eight(int digit){
  digitSelector(digit);
  //1
  digitalWrite(pinA, HIGH);   
  digitalWrite(pinB, HIGH);   
  digitalWrite(pinC, HIGH);   
  digitalWrite(pinD, HIGH);   
  digitalWrite(pinE, HIGH);   
  digitalWrite(pinF, HIGH);   
  digitalWrite(pinG, HIGH);
}

void nine(int digit){
  digitSelector(digit);
  //1
  digitalWrite(pinA, HIGH);   
  digitalWrite(pinB, HIGH);   
  digitalWrite(pinC, HIGH);   
  digitalWrite(pinD, HIGH);   
  digitalWrite(pinE, LOW);   
  digitalWrite(pinF, HIGH);   
  digitalWrite(pinG, HIGH);
}

void digitSelector(int digit){
  switch (digit) {
  case 1:
    digitalWrite(D1, LOW);
    digitalWrite(D2, HIGH);
    digitalWrite(D3, HIGH);
    digitalWrite(D4, HIGH);
    break;
  case 2:
    digitalWrite(D1, HIGH);
    digitalWrite(D2, LOW);
    digitalWrite(D3, HIGH);
    digitalWrite(D4, HIGH);
    break;
  case 3:
    digitalWrite(D1, HIGH);
    digitalWrite(D2, HIGH);
    digitalWrite(D3, LOW);
    digitalWrite(D4, HIGH);
    break;
  case 4:
    digitalWrite(D1, HIGH);
    digitalWrite(D2, HIGH);
    digitalWrite(D3, HIGH);
    digitalWrite(D4, LOW);
    break;
  default:
    digitalWrite(D1, LOW);
    digitalWrite(D2, LOW);
    digitalWrite(D3, LOW);
    digitalWrite(D4, LOW);
    break;
} 
}```

Du benutzt die Pins 0 und 1 und gleichzeitig die serielle Schnittstelle. Das kann nicht funktionieren. Wenn Du diese zwei Pins einsetzen willst, darfst Du die serielle Schnittstelle nicht mehr verwenden (und solltest die angeschlossene Hardware trennen, wenn Du per USB einen Sketch uploaden willst).

Warum verwendest du nicht eine DS3231 als RTC ?
Die kannst du an den I2C-Bus anschließen und diese ist auch deutlich genauer, als die DS-1302.
Statt der Pins 0 und 1 kannst du auch analoge Pins (A0 - A5) als digitale Pins einsetzen.

Ich habe meinen Code so verändert, dass jetzt A0 und A1 verwendet werden statt 0 und 1.
Jetzt lautet die Ausgabe:

00/00/2000 00:00:00 +
RTC lost confidence in the DateTime!
data read (20) = ""
00:00

// CONNECTIONS:
// DS1302 CLK/SCLK --> 13
// DS1302 DAT/IO --> A1
// DS1302 RST/CE --> A0
// DS1302 VCC --> 3.3v - 5v
// DS1302 GND --> GND

#include <ThreeWire.h>  
#include <RtcDS1302.h>

ThreeWire myWire(A1,13,A0); // IO, SCLK, CE

Mir fällt es leider schwer, dir hier zu helfen, da ich diese "exotische RTC" nicht kenne.

Mein Tipp:
Verwende ein Beispiel aus der Library um nur deine RTC zu testen. Wenn das funktioniert, kannst du den Beispiel-Sketch für dein Projekt danach erweitern.

Hast Du auch die Verkabelung angepasst?

Du solltest ein komplettes Verdrahtungsdiagramm posten, die Ausgabe deutet auf eine falsche Verdrahtung hin (wenn wir davon ausgehen, dass der Chip noch am Leben ist).

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.