Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 6 of 6

Thread: DS3231: Do I lost the internal Flux Compensator or....WHAT?

  1. #1

    DS3231: Do I lost the internal Flux Compensator or....WHAT?

    Hi,

    To my Teensy 3.6 I connected a DS3231 RTC (breakout board with backup battery) via I2C.
    With a provided script I read out the time...which was uninitialized and a higher level of
    logical rubbish (probably the result of some random data).
    I set the time and read it out again...works! The time was correct and counts forward.
    Since the board is equipped with a backup battery (which I measured fine and healthy) I disconnected the
    power from my teensy and waited a while, connected again and read the time...
    ...
    Guess what?
    Any time I reconnected the Teensy to read the time from the DS3231 it says 15:04 and ticks forward.

    From my technical understanding of that RTC it can either have a valid time (power provided by the backup battery)
    or nonsense due to powerfailure (empty or no backup battery at all).

    I have no idea, what the reason of this "do you remember the time when we last met"-behaviour is.

    I know, that this is not exactly (read: by no means) a Teensy problem...but if someone has any idea how
    I can fix that to get an ordinary RTC telling my the ordinary time...I would be very happy !

    Cheers!
    Have a good weekend!
    Meino

  2. #2
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,136
    The code (that you didn't post) to read the RTC is resetting the clock to when the code was last compiled. You need to upload that code once more and then comment out the code that changes the clock.

    Pete

  3. #3
    Hi Pete,

    sorry...I was too sure, that I understood the chip's behaviour the wrong way around, that I didn't thought of a firmware problem.

    Here is the code to set the clock:
    Code:
    /*
    DS3231_set.pde
    Eric Ayars
    4/11
    
    Test of set-time routines for a DS3231 RTC
    
    */
    
    #include <DS3231.h>
    #include <Wire.h>
    
    DS3231 Clock;
    
    byte Year;
    byte Month;
    byte Date;
    byte DoW;
    byte Hour;
    byte Minute;
    byte Second;
    
    void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW, 
    		byte& Hour, byte& Minute, byte& Second) {
    	// Call this if you notice something coming in on 
    	// the serial port. The stuff coming in should be in 
    	// the order YYMMDDwHHMMSS, with an 'x' at the end.
    	boolean GotString = false;
    	char InChar;
    	byte Temp1, Temp2;
    	char InString[20];
    
    	byte j=0;
    	while (!GotString) {
    		if (Serial.available()) {
    			InChar = Serial.read();
    			InString[j] = InChar;
    			j += 1;
    			if (InChar == 'x') {
    				GotString = true;
    			}
    		}
    	}
    	Serial.println(InString);
    	// Read Year first
    	Temp1 = (byte)InString[0] -48;
    	Temp2 = (byte)InString[1] -48;
    	Year = Temp1*10 + Temp2;
    	// now month
    	Temp1 = (byte)InString[2] -48;
    	Temp2 = (byte)InString[3] -48;
    	Month = Temp1*10 + Temp2;
    	// now date
    	Temp1 = (byte)InString[4] -48;
    	Temp2 = (byte)InString[5] -48;
    	Day = Temp1*10 + Temp2;
    	// now Day of Week
    	DoW = (byte)InString[6] - 48;		
    	// now Hour
    	Temp1 = (byte)InString[7] -48;
    	Temp2 = (byte)InString[8] -48;
    	Hour = Temp1*10 + Temp2;
    	// now Minute
    	Temp1 = (byte)InString[9] -48;
    	Temp2 = (byte)InString[10] -48;
    	Minute = Temp1*10 + Temp2;
    	// now Second
    	Temp1 = (byte)InString[11] -48;
    	Temp2 = (byte)InString[12] -48;
    	Second = Temp1*10 + Temp2;
    }
    
    void setup() {
    	// Start the serial port
    	Serial.begin(9600);
    
    	// Start the I2C interface
    	Wire.begin();
    }
    
    void loop() {
    
    	// If something is coming in on the serial line, it's
    	// a time correction so set the clock accordingly.
    	if (Serial.available()) {
    		GetDateStuff(Year, Month, Date, DoW, Hour, Minute, Second);
    
    		Clock.setClockMode(false);	// set to 24h
    		//setClockMode(true);	// set to 12h
    
    		Clock.setYear(Year);
    		Clock.setMonth(Month);
    		Clock.setDate(Date);
    		Clock.setDoW(DoW);
    		Clock.setHour(Hour);
    		Clock.setMinute(Minute);
    		Clock.setSecond(Second);
    
    		// Test of alarm functions
    		// set A1 to one minute past the time we just set the clock
    		// on current day of week.
    		Clock.setA1Time(DoW, Hour, Minute+1, Second, 0x0, true, 
    			false, false);
    		// set A2 to two minutes past, on current day of month.
    		Clock.setA2Time(Date, Hour, Minute+2, 0x0, false, false, 
    			false);
    		// Turn on both alarms, with external interrupt
    		Clock.turnOnAlarm(1);
    		Clock.turnOnAlarm(2);
    
    	}
    	delay(1000);
    }
    and this is the code to read the chip:

    Code:
    /*
    DS3231_test.pde
    Eric Ayars
    4/11
    
    Test/demo of read routines for a DS3231 RTC.
    
    Turn on the serial monitor after loading this to check if things are
    working as they should.
    
    */
    
    #include <DS3231.h>
    #include <Wire.h>
    
    DS3231 Clock;
    bool Century=false;
    bool h12;
    bool PM;
    byte ADay, AHour, AMinute, ASecond, ABits;
    bool ADy, A12h, Apm;
    
    void setup() {
    	// Start the I2C interface
    	Wire.begin();
    	// Start the serial interface
    	Serial.begin(9600);
    }
    
    void loop() {
    	// send what's going on to the serial monitor.
    	// Start with the year
    	Serial.print("2");
    	if (Century) {			// Won't need this for 89 years.
    		Serial.print("1");
    	} else {
    		Serial.print("0");
    	}
    	Serial.print(Clock.getYear(), DEC);
    	Serial.print(' ');
    	// then the month
    	Serial.print(Clock.getMonth(Century), DEC);
    	Serial.print(' ');
    	// then the date
    	Serial.print(Clock.getDate(), DEC);
    	Serial.print(' ');
    	// and the day of the week
    	Serial.print(Clock.getDoW(), DEC);
    	Serial.print(' ');
    	// Finally the hour, minute, and second
    	Serial.print(Clock.getHour(h12, PM), DEC);
    	Serial.print(' ');
    	Serial.print(Clock.getMinute(), DEC);
    	Serial.print(' ');
    	Serial.print(Clock.getSecond(), DEC);
    	// Add AM/PM indicator
    	if (h12) {
    		if (PM) {
    			Serial.print(" PM ");
    		} else {
    			Serial.print(" AM ");
    		}
    	} else {
    		Serial.print(" 24h ");
    	}
    	// Display the temperature
    	Serial.print("T=");
    	Serial.print(Clock.getTemperature(), 2);
    	// Tell whether the time is (likely to be) valid
    	if (Clock.oscillatorCheck()) {
    		Serial.print(" O+");
    	} else {
    		Serial.print(" O-");
    	}
    	// Indicate whether an alarm went off
    	if (Clock.checkIfAlarm(1)) {
    		Serial.print(" A1!");
    	}
    	if (Clock.checkIfAlarm(2)) {
    		Serial.print(" A2!");
    	}
    	// New line on display
    	Serial.print('\n');
    	// Display Alarm 1 information
    	Serial.print("Alarm 1: ");
    	Clock.getA1Time(ADay, AHour, AMinute, ASecond, ABits, ADy, A12h, Apm);
    	Serial.print(ADay, DEC);
    	if (ADy) {
    		Serial.print(" DoW");
    	} else {
    		Serial.print(" Date");
    	}
    	Serial.print(' ');
    	Serial.print(AHour, DEC);
    	Serial.print(' ');
    	Serial.print(AMinute, DEC);
    	Serial.print(' ');
    	Serial.print(ASecond, DEC);
    	Serial.print(' ');
    	if (A12h) {
    		if (Apm) {
    			Serial.print('pm ');
    		} else {
    			Serial.print('am ');
    		}
    	}
    	if (Clock.checkAlarmEnabled(1)) {
    		Serial.print("enabled");
    	}
    	Serial.print('\n');
    	// Display Alarm 2 information
    	Serial.print("Alarm 2: ");
    	Clock.getA2Time(ADay, AHour, AMinute, ABits, ADy, A12h, Apm);
    	Serial.print(ADay, DEC);
    	if (ADy) {
    		Serial.print(" DoW");
    	} else {
    		Serial.print(" Date");
    	}
    	Serial.print(' ');
    	Serial.print(AHour, DEC);
    	Serial.print(' ');
    	Serial.print(AMinute, DEC);
    	Serial.print(' ');
    	if (A12h) {
    		if (Apm) {
    			Serial.print('pm');
    		} else {
    			Serial.print('am');
    		}
    	}
    	if (Clock.checkAlarmEnabled(2)) {
    		Serial.print("enabled");
    	}
    	// display alarm bits
    	Serial.print('\nAlarm bits: ');
    	Serial.print(ABits, BIN);
    
    	Serial.print('\n');
    	Serial.print('\n');
    	delay(1000);
    }
    I cant find a routine in the second code, which sets the clock...

    Cheers!
    Meino

  4. #4
    Senior Member
    Join Date
    Oct 2015
    Location
    Roma (IT, EU)
    Posts
    193
    Just so we understand clearly... are you following exactly these steps?

    1. With the DS3231 connected to the Teensy, you upload and run the first sketch to set the clock, once
    2. You (power off the Teensy and) disconnect the DS3231 from the Teensy (and from the power source, so it runs from the battery)
    3. With the DS3231 still disconnected, you (power on the Teensy and) upload the second sketch to the Teensy
    4. You (power off the Teensy and) reconnect the DS3231
    5. You power on the Teensy with the DS3231 connected, and the time has not advanced?

  5. #5
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,136
    Works fine for me with a Chronodot and Teensy 3.6
    Have you got 4.7k pullups on SDA and SCL?

    Pete

  6. #6
    HI,

    ok...it seems that I lost the flux compensator actually...somehow.

    I swapped the module (the DS3231 breakout board) with a spare one I had...and it
    works fine with the source in my previous posting.
    The first one seems somehow faulty...

    Thanks a lot for your help!

    Cheers!
    Meino

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •