RTC1302

Hallo da draussen,
ich habe mich mal wieder komplett verrannt. Beim einbinden des RTC1302 Modul bekomme ich momentan keine vernünftige Auskunft vom RTC.
Ich habe zum testen den RTC an einen Nano angeschlossen.

Folgende Anschlussbelegung:
GND = GND
5V = 5V
CLK = A5
DAT = A4
RST = NC

Folgender Code:

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 rtc;

void setup () 
{
    Serial.begin(9600);
    rtc.begin();
    //rtc.adjust(DateTime(2019, 1, 8, 12, 32, 0));
}

void loop () 
{
    DateTime Uhrzeit = rtc.now();   
    
    Serial.println(Uhrzeit.minute(), DEC);
    Serial.print("OK");
    delay(1000);
}

im Seriellen Monitor wird nach dem hochladen nichts angezeigt.
Erst wenn ich die Datenvebindung trenne zeigt er "165OK" an.
Nun habe ich vermutet das die Anschlussbelegung falsch ist und die wie folgt geändert:
GND = GND
5V = 5V
CLK = A5
DAT = A4
RST = D2

Folgender Code:

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

ThreeWire myWire(A4,A5,2); //  DAT, CLK, RES
RtcDS1302<ThreeWire> Rtc(myWire);

int Uhr_minuten;

void setup () 
{
    Serial.begin(9600);
    Rtc.Begin();

}

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

Uhr_minuten = now.Minute();
    Serial.println(Uhr_minuten);

    delay(1000); // ten seconds
}

Nun kann ich zwar einen Wert auslesen der ist aber 41 min. zu groß.
Kann mir jemand sagen wie ich den RTC mit der Rcihtigen Uhrzeit einstellen kann?

Hi

In Deinem ersten Beispiel benutzt Du eine Lib für eine DS1307 (oder DS3231, gleiches Protokoll, gleiche Datenstruktur, nur um Längen genauer).
Diese benutzt I²C.

Im Playground steht zur RTC1302

The DS1302 uses a 3-wire interface:

  • bidirectional data.
  • clock
  • chip select

It is not I2C, not OneWire, and not SPI. So the standard libraries can not be used.

Wundert mich also nicht wirklich, warum Das mit der ersten Lib nicht funktioniert.

Schön wäre gewesen, wenn Du die Teile verlinkt hättest - wie man sieht: ging's aber auch so

Zu Deiner RTC: Lese ich zum ersten Mal von, selber nutze ich DS3231 via I²C.
Trotzdem gehe ich Mal davon aus, daß Deine Lib die Uhrzeit in Deiner RTC auch einstellen kann - dazu die Lib durchforsten.

MfG

vielen Dank für die Antwort

postmaster-ino:
dazu die Lib durchforsten.

habe ich bereits
finde aber in den zwei Beispielen keinen Hinweis
hier mal das Originalsketch:

// CONNECTIONS:
// DS1302 CLK/SCLK --> 5
// DS1302 DAT/IO --> 4
// DS1302 RST/CE --> 2
// DS1302 VCC --> 3.3v - 5v
// DS1302 GND --> GND

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

ThreeWire myWire(A4,A5,A3); // IO, SCLK, CE
RtcDS1302<ThreeWire> Rtc(myWire);

#define countof(a) (sizeof(a) / sizeof(a[0]))

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

void setup () 
{
    Serial.begin(57600);

    Serial.print("compiled: ");
    Serial.print(__DATE__);
    Serial.println(__TIME__);
    
    Rtc.Begin();

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

    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(" +");

    delay(5000);

    // 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("\"");
    
    delay(5000);
}



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);
}

und hier noch die Keyword's:

#######################################
# Syntax Coloring Map RTC
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################

ThreeWire	KEYWORD1
RtcDS1302	KEYWORD1
RtcDS1307	KEYWORD1
DS3234AlarmOne	KEYWORD1
DS3234AlarmTwo	KEYWORD1
RtcDS3234	KEYWORD1
DS3231AlarmOne	KEYWORD1
DS3231AlarmTwo	KEYWORD1
RtcDS3231	KEYWORD1
EepromAt24c32	KEYWORD1
RtcTemperature	KEYWORD1
RtcDateTime	KEYWORD1
DayOfWeek	KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################

Begin	KEYWORD2
IsDateTimeValid	KEYWORD2
GetIsRunning	KEYWORD2
SetIsRunning	KEYWORD2
GetIsWriteProtected	KEYWORD2
SetIsWriteProtected	KEYWORD2
SetDateTime	KEYWORD2
GetDateTime	KEYWORD2
GetTemperature	KEYWORD2
Enable32kHzPin	KEYWORD2
SetSquareWavePin	KEYWORD2
SetSquareWavePinClockFrequency	KEYWORD2
SetAlarmOne	KEYWORD2
SetAlarmTwo	KEYWORD2
GetAlarmOne	KEYWORD2
GetAlarmTwo	KEYWORD2
LatchAlarmsTriggeredFlags	KEYWORD2
ForceTemperatureCompensationUpdate	KEYWORD2
SetTemperatureCompensationRate	KEYWORD2
GetTemperatureCompensationRate	KEYWORD2
GetAgingOffset	KEYWORD2
SetAgingOffset	KEYWORD2
GetMemory	KEYWORD2
SetMemory	KEYWORD2
GetTrickleChargeSettings	KEYWORD2
SetTrickleChargeSettings	KEYWORD2
AsFloatDegC	KEYWORD2
AsFloatDegF	KEYWORD2
AsCentiDegC	KEYWORD2
Print	KEYWORD2
Year	KEYWORD2
Month	KEYWORD2
Day	KEYWORD2
Hour	KEYWORD2
Minute	KEYWORD2
Second	KEYWORD2
DayOfWeek	KEYWORD2
TotalSeconds	KEYWORD2
DayOf	KEYWORD2
ControlFlags	KEYWORD2

#######################################
# Constants (LITERAL1)
#######################################

DS3231SquareWaveClock_1Hz	LITERAL1
DS3231SquareWaveClock_1kHz	LITERAL1
DS3231SquareWaveClock_4kHz	LITERAL1
DS3231SquareWaveClock_8kHz	LITERAL1
DS3231SquareWavePin_ModeNone	LITERAL1
DS3231SquareWavePin_ModeBatteryBackup	LITERAL1
DS3231SquareWavePin_ModeClock	LITERAL1
DS3231SquareWavePin_ModeAlarmOne	LITERAL1
DS3231SquareWavePin_ModeAlarmTwo	LITERAL1
DS3231SquareWavePin_ModeAlarmBoth	LITERAL1
DS3231AlarmOneControl_HoursMinutesSecondsDayOfMonthMatch	LITERAL1
DS3231AlarmOneControl_OncePerSecond	LITERAL1
DS3231AlarmOneControl_SecondsMatch	LITERAL1
DS3231AlarmOneControl_MinutesSecondsMatch	LITERAL1
DS3231AlarmOneControl_HoursMinutesSecondsMatch	LITERAL1
DS3231AlarmOneControl_HoursMinutesSecondsDayOfWeekMatch	LITERAL1
DS3231AlarmTwoControl_HoursMinutesDayOfMonthMatch	LITERAL1
DS3231AlarmTwoControl_OncePerMinute	LITERAL1
DS3231AlarmTwoControl_MinutesMatch	LITERAL1
DS3231AlarmTwoControl_HoursMinutesMatch	LITERAL1
DS3231AlarmTwoControl_HoursMinutesDayOfWeekMatch	LITERAL1
DS3231AlarmFlag_Alarm1	LITERAL1
DS3231AlarmFlag_Alarm2	LITERAL1
DS3231AlarmFlag_AlarmBoth	LITERAL1
DS1302RamSize	LITERAL1
DS1302Tcr_Disabled	LITERAL1
DS1302TcrResistor_2KOhm	LITERAL1
DS1302TcrResistor_4KOhm	LITERAL1
DS1302TcrResistor_8KOhm	LITERAL1
DS1302TcrDiodes_One	LITERAL1
DS1302TcrDiodes_Two	LITERAL1
DS1302TcrStatus_Enabled	LITERAL1
DS1302TcrStatus_Disabled	LITERAL1
DS1307SquareWaveOut_1Hz	LITERAL1
DS1307SquareWaveOut_4kHz	LITERAL1
DS1307SquareWaveOut_8kHz	LITERAL1
DS1307SquareWaveOut_32kHz	LITERAL1
DS1307SquareWaveOut_High	LITERAL1
DS1307SquareWaveOut_Low	LITERAL1
DS3234SquareWaveClock_1Hz	LITERAL1
DS3234SquareWaveClock_1kHz	LITERAL1
DS3234SquareWaveClock_4kHz	LITERAL1
DS3234SquareWaveClock_8kHz	LITERAL1
DS3234SquareWavePin_ModeNone	LITERAL1
DS3234SquareWavePin_ModeBatteryBackup	LITERAL1
DS3234SquareWavePin_ModeClock	LITERAL1
DS3234SquareWavePin_ModeAlarmOne	LITERAL1
DS3234SquareWavePin_ModeAlarmTwo	LITERAL1
DS3234SquareWavePin_ModeAlarmBoth	LITERAL1
DS3234AlarmOneControl_HoursMinutesSecondsDayOfMonthMatch	LITERAL1
DS3234AlarmOneControl_OncePerSecond	LITERAL1
DS3234AlarmOneControl_SecondsMatch	LITERAL1
DS3234AlarmOneControl_MinutesSecondsMatch	LITERAL1
DS3234AlarmOneControl_HoursMinutesSecondsMatch	LITERAL1
DS3234AlarmOneControl_HoursMinutesSecondsDayOfWeekMatch	LITERAL1
DS3234AlarmTwoControl_HoursMinutesDayOfMonthMatch	LITERAL1
DS3234AlarmTwoControl_OncePerMinute	LITERAL1
DS3234AlarmTwoControl_MinutesMatch	LITERAL1
DS3234AlarmTwoControl_HoursMinutesMatch	LITERAL1
DS3234AlarmTwoControl_HoursMinutesDayOfWeekMatch	LITERAL1
DS3234AlarmFlag_Alarm1	LITERAL1
DS3234AlarmFlag_Alarm2	LITERAL1
DS3234AlarmFlag_AlarmBoth	LITERAL1
DS3234TempCompensationRate_64Seconds	LITERAL1
DS3234TempCompensationRate_128Seconds	LITERAL1
DS3234TempCompensationRate_256Seconds	LITERAL1
DS3234TempCompensationRate_512Seconds	LITERAL1
DayOfWeek_Sunday	LITERAL1
DayOfWeek_Monday	LITERAL1
DayOfWeek_Tuesday	LITERAL1
DayOfWeek_Wednesday	LITERAL1
DayOfWeek_Thursday	LITERAL1
DayOfWeek_Friday	LITERAL1
DayOfWeek_Saturday	LITERAL1

habe im Setup folgende Zeile Eingefügt:
Rtc.SetDateTime(19, 1, 8, 14, 52, 0);

fehlt aber noch was oder ist so nicht richtig
erhalte folgende Fehlermeldung
C:\Program Files\Arduino\Scetchbook\4x7Seg_WS2812B\4x7Seg_WS2812B.ino: In function 'void setup()':
4x7Seg_WS2812B:20: error: no matching function for call to 'RtcDS1302::SetDateTime(int, int, int, int, int, int)'
Rtc.SetDateTime(19, 1, 7, 15, 52, 0);

Hi

RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
...
Rtc.SetDateTime(compiled);

Die Richtung ist schon gar nicht so schlecht.
Lasse Dir Mal DATE und TIME im seriellen Terminal anzeigen.
Denke, Die sehen anders aus.

MfG

// CONNECTIONS:
// DS1302 CLK/SCLK --> 5
// DS1302 DAT/IO --> 4
// DS1302 RST/CE --> 2
// DS1302 VCC --> 3.3v - 5v
// DS1302 GND --> GND

ThreeWire myWire(A4,A5,A3); // IO, SCLK, CE
RtcDS1302 Rtc(myWire);

Du brauchst eine bidirektionale Verbindung. Das ist keine.
Wieso willst Du diese eine SoftwareSPI Schnittstelle nehmen und nicht die HardwareVersion davon?
Die pins 2,3,4 sind andere als A2, A3 und A4.

Grüße Uwe

[ Lib durchforsten ] habe ich bereits

Die Keywords Datei ist nur Spaß.
Relevant ist die RtcDS1302.h Datei. Da steht, welche Funktionen und Methoden mit welchen Parametern es gibt.
Was die dann genau machen, siehst du in der *.cpp Datei.

Sorry das ich mich erst jetzt melde.
Das Problem ist gelöst.
Lag zum einen (wie so oft) an der verwendeten Lib (jetzt "RTC by Makuna") und zum anderen an meiner einer.
Habe bis Dato immer dem 1306 verwendet wo nur vier Anschlüsse benötigt werden.
Der 1302 benötigt aber neben Vcc, GND, Data und Clock noch den Reset.
Das Stellen der Uhrzeit war dann, Dank eurer Hilfe, auch easy.
Habe im Setup einmalig folgende Zeilen hochgeladen:

RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
Rtc.SetDateTime(compiled);

und dann wieder auskommentiert.
Jetzt hält er die Einstellungen und da sogar die Richtigen.

Danke

Hi

Besten Dank für die Rückmeldung und für die Nennung Deines Fehlers/Deiner Lösung - denke, damit hilfst Du Anderen in Zukunft, schneller ans Ziel zu kommen!

MfG