Pages: [1]   Go Down
Author Topic: RTC 1307  (Read 1751 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo, das ist mein erster Post hier, daher möchte ich mich ersteinmal kurz vorstellen. Uninteressant? Na dann gleich bei Frage weiterlesen!

Auf dem Programmiergebiet bin ich fast absoluter Neuling. Natürlich musste ich durch mein aktuelles Elektrotechnikstudium einige Grundlagen besuchen. Aber wenn man dort nicht mit Herzblut dabei ist dann lernt man dort auch nicht so viel. Und was nun Ic^2 oder Two Wire oder Single Wire ist und wie es funktioniert sowieso nicht. Auf dem Gebiet der Analogelektronik ist mein Wissenstand hingegen weitaus fortgeschrittener. Nun bin ich darauf gestoßen, dass so ein kleiner Arduino doch einiges an Freizeitfreude bringen kann. Momentan laufen mehre Projekte mit Arduinos. Momentan bin ich dabei einen Sensorknoten zurechtzubasteln. Ich habe eine ewigkeit probiert die Zeit aus dem Internet abzurufen, mit dem "billig" Netzwerkchip den ich habe, müsste ich mir da aber einiges an Netzwerkkomunikation selbst programmieren. Alle Suche nach fertigen libs machten die Angelegenheit nicht einfacher. Nun hab ich mir gedacht, bevor ich stunden lang herumprobiere (und dabei nicht so viel lerne, weil ich durch die vielen .h Dateien nicht durchblicke) kaufe ich mir beim Laden um die Ecke eine RTC.

Mein Setup:
Arduino Mega 2560 mit DS 1307 per Pin 20 und 21 angeschlossen, DS 1307 wie im Datenblatt mit 10k Pullup (SQW, SCL, SDA) beschaltet

Die Frage:
Wie finde ich heraus ob eine DS 1307 die RTC richtig funktioniert? Mit dem Beispielsprogramm für RTC (TimeRTC und setRTC) lande ich immer wieder im Jahre 1999.
Irgendwas scheint dort also nicht zu funktionieren.
Was kommt normalerweise aus dem SQRT Ausgang heraus? Laut Manual je nach Registersetzung (wie das geht habe ich keine Ahnung und zeigt mir, dass ich von digitalelektronik wirklich wenig weiß) ja zumindest irgendeine Frequenz.
Mit dem Oskars hilfe habe ich dort allerdings nichts messen können. Am Quarz kann ich auch keine 32khz messen (was allerdings durch die Tastkopfkapazität vielleicht auch unmöglich ist?).
Habt ihr irgendwelche Ideen wie ich bei der Fehlersuche vorgehen sollte?


Logged

Offline Offline
God Member
*****
Karma: 0
Posts: 696
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
hast du dir die rtc selbst gebastelt oder ein fertige shield gekauft?
Das Shield schließt man eigentlich nur an, fügt die library in den code ein und stellt dann die uhr nich richtig ein.
Poste doch am besten mal deinen code und welches shield du hast, das kann sicherlich helfen.

Gruß
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe die RTC natürlich selbst gebaut. Nagut, so natürlich ist das nicht, Segor um die Ecke hat natürlich nur den Chip und kein Shield. Quarz habe ich dort auch gekauft und es ist eines mit 12pF. Alternativ habe ich aus einem uralt Mainboard noch ein zweites Quarz zum probieren eingelötet.


Schaltung ist die folgende:



allerdings habe ich noch einen Pullup der SQRT quelle spendiert.
Müsste ich den Datenbus nicht über das Oszilluskop messen können?

Stefan

Quellcode ist der folgende
Code:
/*
 * TimeRTC.pde
 * example code illustrating Time library with Real Time Clock.
 *
 */

#include <Time.h> 
#include <Wire.h> 
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

void setup()  {
  Serial.begin(9600);
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if(timeStatus()!= timeSet)
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time");     
}

void loop()
{
   digitalClockDisplay(); 
   delay(1000);
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Zurücke kommt:

"RTC has set the system time
0:00:00: 1 1 2000"


Gehe ich richtig in der Annahme, dass in "#include <Wire.h>  " die richtigen Pins vom Megaboard stehen bzw von dort weiter verwiesen wird?
« Last Edit: July 24, 2011, 11:03:55 am by Revox » Logged

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 5
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Auch wenn Du evtl. schon weiter bist, aber ich finde dieses Tutorial und die entsprechende Library recht gut: http://www.ladyada.net/learn/breakoutplus/ds1307rtc.html

Die Verbindung bei dir scheint ja i.O. zu sein, sonst würde er ja eine Fehlermeldung ausgeben. Wie und wo hast Du denn die Zeit gesetzt? Und ist die Pufferbatterie korrekt angeschlossen (sonst verliert der DS1307 die Zeit immer beim Ausschalten des Arduino)?

markbee
Logged


Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich hab mir jetzt nicht alles durchgelesen, aber das hier ist mein RTC-Testprogramm:
Code:
#include "Wire.h"
#define DS1307 0x68

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

byte lastSecond;

void loop()
{
  int avail = Serial.available();
  if (avail > 18) {
    // 00:00:00 [1-7] 00.00.00
    byte b[avail];
    for (int t=0; t<avail; t++) {
        b[t] = Serial.read();
        if (b[t]>='0' && b[t]<='9')
           b[t] -= '0';
    }

    if (b[2]==':' && b[5]==':' && b[13]=='.' && b[16]=='.') {
        Serial.println("ok");
        Wire.beginTransmission(DS1307);
        Wire.send(0); // Start at address
        Wire.send(b[6]*16 + b[7]);    // 0 on bit 7 starts the clock, 1 stops it
        Wire.send(b[3]*16 + b[4]);
        Wire.send(b[0]*16 + b[1]);
        Wire.send(b[9]);
        Wire.send(b[11]*16 + b[12]);
        Wire.send(b[14]*16 + b[15]);
        Wire.send(b[17]*16 + b[18]);
        Wire.endTransmission();
      } else
          Serial.println("Usage: 00:00:00 [1-7] 00.00.00");
  }
  
  Wire.beginTransmission(DS1307);
  Wire.send(0); // Goto address
  Wire.endTransmission();
  Wire.requestFrom(DS1307, 7); // Read 7 bytes...
  byte second     = bcdToDec(Wire.receive() & 0x7f);
  if (lastSecond != second) {
    lastSecond = second;
    byte minute     = bcdToDec(Wire.receive());
    byte hour       = bcdToDec(Wire.receive());
    byte dayOfWeek  = bcdToDec(Wire.receive());
    byte dayOfMonth = bcdToDec(Wire.receive());
    byte month      = bcdToDec(Wire.receive());
    byte year       = bcdToDec(Wire.receive());

    Serial.print(hour, DEC);
    Serial.print(":");
    Serial.print(minute, DEC);
    Serial.print(":");
    Serial.print(second, DEC);
    Serial.print(" ");
    Serial.print(dayOfWeek, DEC);
    Serial.print(" ");
    Serial.print(dayOfMonth, DEC);
    Serial.print(".");
    Serial.print(month, DEC);
    Serial.print(".");
    Serial.println(year, DEC);
  }
}

byte bcdToDec(byte val)
{
  return val/16*10 + (val%16);
}
Damit stelle ich meine RTCs ein und lese sie nach ein paar Tagen wieder aus um die Abweichung zu ermitteln.
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 234
Posts: 20204
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der SQR Ausgang gibt ein Rechtecksignal aus. Das Datenblatt sagt:

Square Wave/Output Driver. When enabled, the SQWE bit set to 1, the SQW/OUT pin outputs one of four square-wave frequencies (1Hz, 4kHz, 8kHz, 32kHz). The SQW/OUT pin is open drain and requires an external pullup resistor. SQW/OUT operates with either VCC or VBAT applied. The pullup voltage can be up to 5.5V regardless of the voltage on VCC. If not used, this pin can be left floating.

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich weiß allerdings nicht, ob der SQR Eingang vom Arduino aktiviert wird. Leider weiß ich nichteinmal ob der Arduino mit der RTC komuniziert.

Vielen Dank schon mal für eure Postings. Ich habe heute Abend keine Zeit mehr für Arduino, werde morgen aber nochmal das andere Testprogramm probieren und mein Ergebnis posten.
Zudem bin ich kurz davor, einfach eine weitere RTC zu bestellen. Falls die Funktioniert, weiß ich das meine kaputt ist. Falls sie nicht läuft, tja, dann hab ich eben zwei.
Logged

Pages: [1]   Go Up
Jump to: