INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
DS1307 RTC korrekt anschließen (Verständnisfrage)
14.07.2014, 21:33
Beitrag #9
RE: DS1307 RTC korrekt anschließen (Verständnisfrage)
Kannst du den Code, oder den Link dorthin mal reinstellen?

RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.07.2014, 18:36 (Dieser Beitrag wurde zuletzt bearbeitet: 15.07.2014 18:37 von fp.blues2013.)
Beitrag #10
RE: DS1307 RTC korrekt anschließen (Verständnisfrage)
Hier mal der Code ( abgespeckt ), den ich zum testen nutze. Er ist nicht von mir, aber der einzige, der mal wenigstens läuft.

Es gibt einmal die Möglichkeit zum setzen der Zeit, wenn man die Zeilen hinter den // nutzt, und dann ohne das setDateTime(); ... um die Zeit auszulesen..

Ich werde mich zum lernen noch mal tiefer in den Code rein arbeiten, aber erstmal geht es mir nur um die generelle Funktion, oder was nicht funktioniert.

Momentan schalte ich meinen Testaufbau an, und compiliere und sende den Code mit setDateTime... zum Arduino. Danach öffne ich das Terminalfenster.

Die Zeit startet da, wo ich die Werte eingeben habe. Was mir aufgefallen ist, das mit dem Terminalfenster auf die Zeit im Chip irgendwie langsamer läuft als meine Funkuhr, und 2. das die Zeit stehen bleibt, wenn ich den Saft abdreh.

Ok, meine Vermutung... MIT Terminalfenster ist die angezeigt Zeit langsamer, weil das Programm nicht Zeitsynchron durchläuft.... Timingproblem ?! Ich sollte mal versuchen, die Zeit ab und zu mal nur einzeln auszulesen und dann zu vergleichen....

Was den Ausfall der Zeit nach dem Saft-Weg betrifft.. weis ich nicht.

Mein Wunsch dann für später, das ich das Programm mit einer Abfrage versehe, an der ich die Zeit direkt setzen kann, ohne das Programm neu zu starten und das 2. ist die Anzeige der fehlenden Nullen bei einzelnen Zahlen....

Das ist mal das was ich mir jetzt zum lernen vorgenommen habe.

Hier mal der Testcode:

//Arduino 1.0+ Only

#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527


void setup(){
Wire.begin();
Serial.begin(9600);
// setDateTime(); //MUST CONFIGURE IN FUNCTION
}

void loop(){
printDate();
delay(1000);

}

// void setDateTime()

// {

// byte second = 00; //0-59
// byte minute = 04; //0-59
// byte hour = 22; //0-23
// byte weekDay = 6; //1-7
// byte monthDay = 12; //1-31
// byte month = 7; //1-12
// byte year = 14; //0-99

// Wire.beginTransmission(DS1307_ADDRESS);
// Wire.write(zero); //stop Oscillator

// Wire.write(decToBcd(second));
// Wire.write(decToBcd(minute));
// Wire.write(decToBcd(hour));
// Wire.write(decToBcd(weekDay));
// Wire.write(decToBcd(monthDay));
// Wire.write(decToBcd(month));
// Wire.write(decToBcd(year));

// Wire.write(zero); //start

// Wire.endTransmission();

// }

byte decToBcd(byte val)
{

// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );

}

byte bcdToDec(byte val)

{

// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );

}

void printDate()

{

// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 7);

int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());

//print the date EG 3/1/11 23:59:59
Serial.print(month);
Serial.print("/");
Serial.print(monthDay);
Serial.print("/");
Serial.print(year);
Serial.print(" ");
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.println(second);

}
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.07.2014, 20:40
Beitrag #11
RE: DS1307 RTC korrekt anschließen (Verständnisfrage)
Moin,
Zitat:und compiliere und sende den Code mit setDateTime... zum Arduino
Nö, machst du nicht. du sendest die Angaben zur RTC. Der Arduino weiß davon noch garnix. Wenn du dem Arduino die Zeit setzen möchtest, kannst du das zB. mit der Time Library und der setTime() Funktion machen.
Folgender Code:
Code:
{
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
...
passt nicht, da durch Wire.write(zero) die Register vor dem Abruf der Daten auf Null gesetzt werden und die Uhr neu gestartet wird. Normalerweise wird dieses nur getan um einmalig die aktuelle Zeit in die RTC zu schreibenExclamation

Grüße RiK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2014, 14:21 (Dieser Beitrag wurde zuletzt bearbeitet: 16.07.2014 14:34 von fp.blues2013.)
Beitrag #12
RE: DS1307 RTC korrekt anschließen (Verständnisfrage)
Vielen Dank für die Hilfe Smile

ich habe mir das Ganze mal etwas angeschaut, bisschen auf Arduino nachgelesen, und nun habe ich einen funktionierenden Lösungsansatz.
-- > RiK Smile Aua, ja, Smile stimmt , ich schicke es an den DS1307 ^^

Der DS1307 läuft jetzt auch weiter, ohne das der Strom an ist Smile Kann ihn jederzeit auslesen und die Zeit stimmt soweit Smile

Kleine Zeile, große Wirkung Smile Aber ich bin ja noch Neuling auf dem Gebiet. Hoffe, man möge es mir verzeihen.

//Arduino 1.0+ Only

#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527


void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial) ; // wait until Arduino Serial Monitor opens
}

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

byte decToBcd(byte val)
{
// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}

void printDate(){

// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 7);

int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());

//print the date and time: Montag, 27.01.2011 23:59:59
if (weekDay == 0) Serial.print("Sonntag");
if (weekDay == 1) Serial.print("Montag");
if (weekDay == 2) Serial.print("Dienstag");
if (weekDay == 3) Serial.print("Mittwoch");
if (weekDay == 4) Serial.print("Donnerstag");
if (weekDay == 5) Serial.print("Freitag");
if (weekDay == 6) Serial.print("Samstag");
Serial.print(", ");
if (monthDay<10) Serial.print("0");
Serial.print(monthDay);
Serial.print(".");
if (month<10) Serial.print("0");
Serial.print(month);
Serial.print(".");
if (year<99) Serial.print("20");
Serial.print(year);
Serial.print(" ");
Serial.print(hour);
if (hour<10) Serial.print("0");
Serial.print(":");
if (minute<10) Serial.print("0");
Serial.print(minute);
Serial.print(":");
if (second<10) Serial.print("0");
Serial.println(second);

}

Nebenbei hatte ich die Idee, mit einem einfachen if... Vergleich auch die fehlenden Nullen zu ergänzen und aus der Zahl für den Wochentag auch noch gleich einen richtigen Wochentag auszugeben.

Dieses Script liest nur die Zeit und das Datum aus, und stellt es auf dem Serial Monitor da.

Jetzt stopf ich noch später ein paar Script-Zeilen hinzu, um das alles auf meinem 20x4 Display über I2C auszugeben.

Morgen kommt mein bestellter Mega Smile *freu*hüpf*, und dann gehe ich mal an die Interrupt basierte Programmausführung, denn ich möchte per Tastendruck mehrere 4-Zeilige Ausgaben auf meinem Display darstellen / per längerem Tastendruck in einen Einstellungsmodus zu kommen, um die Zeit / Datum dann aktiv ändern zu können. Platz auf dem Mega ist ja dann reichlich Smile
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Exclamation Wie viel LEDs kann man anschließen? Benny0016 2 478 17.05.2016 21:58
Letzter Beitrag: hotsystems
  IFLZ44N schaltet nicht korrekt? torsten_156 22 1.012 25.04.2016 13:53
Letzter Beitrag: Bitklopfer
  verständnisfrage colorduino/8x8 rgb Matrix hello_world 3 319 19.04.2016 10:51
Letzter Beitrag: hotsystems
  kurze Verständnisfrage zum Pinout MK.Matthias 4 786 18.02.2016 11:03
Letzter Beitrag: MK.Matthias
  UTFT an Arduino mega mit Flachbandkabel anschließen Jensus 1 876 03.10.2015 12:52
Letzter Beitrag: hotsystems
  Photowiderstand direkt am Arduino Board anschließen C++Developer2000 8 1.430 21.08.2015 12:11
Letzter Beitrag: C++Developer2000
  DS1307 Uhrzeit nach Start TheGent86 16 2.391 21.07.2015 07:57
Letzter Beitrag: HaWe
  Lichtschranke anschließen paq 11 2.266 07.06.2015 17:05
Letzter Beitrag: Thorsten Pferdekämper
  US-100 Ulraschallsensor anschließen maierreini 5 1.797 16.05.2015 14:08
Letzter Beitrag: Gelegenheitsbastler
  I2C-Problem - DS1307, BMP180, BH1750 drFlexus 2 1.236 04.04.2015 17:22
Letzter Beitrag: P.Martin

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste