Sida 1 av 1
Problem att få igång RTC DS3231
Postat: 22 december 2015, 12:06:26
av orvar-e
Har laddat ner kod för DS3231 på
tronixstuff.com, det går att kompilera och få ner programmat i arduinon utan gnäll.
Det står att man ska ställa in tiden genom att ta bort kommenteringen på följande kod-snutt.
Ladda ner den med önskat tid och datum och sedan kommentera bort koden igen.
Har gjort det men får ändå inte rätt tid och datum.
Det ser ut så här i serial monitor. När det ska se ut som exemplet på sidan jag länkade till.
Inte hemma nu men ska kolla anslutningarna en gång till när jag kommer hem.......
Några andra tips, eller nått jag missat som finns beskrivet på sidan.....
Re: Problem att få igång RTC DS3231
Postat: 22 december 2015, 12:11:15
av Borre
Visa koden DU använt.
Re: Problem att få igång RTC DS3231
Postat: 22 december 2015, 12:15:34
av orvar-e
Ok.
Kod: Markera allt
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
void setup()
{
Wire.begin();
Serial.begin(9600);
// set the initial time here:
// DS3231 seconds, minutes, hours, day, date, month, year
// setDS3231time(30,42,21,4,26,11,14);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void displayTime()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
// send it to the serial monitor
Serial.print(hour, DEC);
// convert the byte variable to a decimal number when displayed
Serial.print(":");
if (minute<10)
{
Serial.print("0");
}
Serial.print(minute, DEC);
Serial.print(":");
if (second<10)
{
Serial.print("0");
}
Serial.print(second, DEC);
Serial.print(" ");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.print(year, DEC);
Serial.print(" Day of week: ");
switch(dayOfWeek){
case 1:
Serial.println("Sunday");
break;
case 2:
Serial.println("Monday");
break;
case 3:
Serial.println("Tuesday");
break;
case 4:
Serial.println("Wednesday");
break;
case 5:
Serial.println("Thursday");
break;
case 6:
Serial.println("Friday");
break;
case 7:
Serial.println("Saturday");
break;
}
}
void loop()
{
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second
}
Re: Problem att få igång RTC DS3231
Postat: 22 december 2015, 13:32:45
av sc3
Du har nog inte kontakt med RTCn. Är det en kina-klon? Har träffat på saker där adressen inte stämmer med exempelkoden.
Ett enkelt sätt att testa förbindelsen och samtidigt verifiera adressen är att köra en I2C-scanner, kopiera koden från denna sida
http://playground.arduino.cc/Main/I2cSc ... lock&num=1
Den spottar ur sig vilka adresser som svarar på bussen.
De värden du ser i SerialMonitor är nog för att inte dessa variabler inte är initierade
Kod: Markera allt
void displayTime()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
om du initierar dom till 0 så kommer (nog) outputen vara noll i alla fält. (om RTCn inte svarar och fyller i variablerna)
Re: Problem att få igång RTC DS3231
Postat: 22 december 2015, 19:21:42
av orvar-e
Tack för tipset av kod.
Jag körde den och först fick jag ingen kontakt, så jag pillade lite bland trådarna och så fick jag två adresser.
Efter det så funkade RTC också.

Finns det nått register med vilka prylar som har vilken adress?
Tänker det om jag hänger på en GPS modul så kan den ju inte ha samma adress.
Är adresserna till för samma sak 0x57 och 0x68? Tänker om 0x68 är RTC och ut till MCU och 0x57 är trafik åt andra hållet?
Re: Problem att få igång RTC DS3231
Postat: 23 december 2015, 00:15:18
av sc3
Kul att du fick det att fungera!
Du får två adresser som svar eftersom du har ett seriellt EEPROM AT24C32 på samma kort (eller hur?) som sitter på samma I2C buss. Den har default adress 0x57 enligt ett schema jag hittade via ebay.
Jag kan I2C för dåligt för att ge något exakt svar ang. adressering men DS3231 chippet verkar ha hårdkodad adress 0x68 (b1101000) se sid 17 i databladet. EEPROMet kan man ställa adressen genom tre ingångar (A0,A1,A2), se sid 11 i databladet för AT23C32
Re: Problem att få igång RTC DS3231
Postat: 23 december 2015, 07:53:20
av orvar-e
Jop det finns ett EEPROM minne på den, kan bli användbart.
Får titta i databladet när behovet har kommit ikapp så att säga.