Problem att få igång RTC DS3231

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Problem att få igång RTC DS3231

Inlägg 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.

Kod: Markera allt

// setDS3231time(30,42,21,4,26,11,14);
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.....
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Borre
Inlägg: 4610
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Problem att få igång RTC DS3231

Inlägg av Borre »

Visa koden DU använt.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Problem att få igång RTC DS3231

Inlägg 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
}
sc3
Inlägg: 179
Blev medlem: 10 januari 2011, 11:05:40
Ort: Umeå

Re: Problem att få igång RTC DS3231

Inlägg 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)
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Problem att få igång RTC DS3231

Inlägg av orvar-e »

Tack för tipset av kod. :tumupp:
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?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sc3
Inlägg: 179
Blev medlem: 10 januari 2011, 11:05:40
Ort: Umeå

Re: Problem att få igång RTC DS3231

Inlägg 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
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Problem att få igång RTC DS3231

Inlägg 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.
Skriv svar