Forum: Mikrocontroller und Digitale Elektronik RTC DS1307 1Hz


von Andreas C. (ice-kalt)


Lesenswert?

Hallo @ all,

Ich habe einen Arduino Uno und einen RTC DS1307.
Die library für das RTC und I2C habe ich eingefügt.
Ich möchte von dem RTC nur das 1 Hz Signal haben.
Ich habe noch nicht viel mit dem Arduino gearbeitet.
Wäre schön, wenn mir jemand ein Code gibt/schreibt,
wo ich z.B: an Pin 2 "nur" mein 1 Hz Signal anliegen habe.

Danke im Voraus.

Mit freundlichen Grüßen.

von Guest (Gast)


Lesenswert?

Datenblatt lesen und herausfinden, welches Register für den 1hz Takt zu 
setzen ist.
Dann die Dokumentation der TWI Library lesen und herausfinden, wie man 
ein Register mit I2C beschreibt.

von Frank (Gast)


Lesenswert?

RS0 und RS1 auf 0 setzen = 1Hz
SQWE auf 1 setzen um den Ausgang einzuschalten.
Anschließend noch die RTC einschalten indem du eine 0 in CH schreibt.

Datenblatt:
http://datasheets.maximintegrated.com/en/ds/DS1307.pdf

Und den Pullup nicht vergessen!

Grüße
Frank

von Andreas C. (ice-kalt)


Lesenswert?

Mhhh alles sehr sehr schwirig für mich..

wie schreibe ich das denn mit dem Arduino

Ich schaue hier als im Internet und finde nix :(

von Andreas C. (ice-kalt)


Angehängte Dateien:

Lesenswert?

ok habe mich etwas umgeschaut

kam zu folgendem code:


#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // each I2C object has a unique bus 
address, the DS1307 is 0x68

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

void sqw1() // set to 1Hz
{
 Wire.beginTransmission(DS1307_I2C_ADDRESS);
 Wire.write(0x07); // move pointer to SQW address
 Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary)
 Wire.endTransmission();
}


void loop()
{
 sqw1();
 delay(30000);
}



habe es wie auf dem bild angeschlossen und zusätzlich an dem SQ-Pin ein 
Pull-up Widerstand und (eine LED) angeschlossen.

Frage: Wieso leutet die LED nicht im 1 Hz Takt ???

von Andreas C. (ice-kalt)


Angehängte Dateien:

Lesenswert?

Hallo @ all

#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // each I2C object has a unique bus
address, the DS1307 is 0x68

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

void sqw1() // set to 1Hz
{
 Wire.beginTransmission(DS1307_I2C_ADDRESS);
 Wire.write(0x07); // move pointer to SQW address
 Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary)
 Wire.endTransmission();
}


void loop()
{
 sqw1();
 delay(30000);
}



habe es wie auf dem bild angeschlossen und zusätzlich an dem SQ-Pin ein
Pull-up Widerstand und (eine LED) angeschlossen.

Frage: Wieso leutet die LED nicht im 1 Hz Takt ???

Danke im Voraus

Mit freundlichen Grüßen

von Sascha W. (sascha-w)


Lesenswert?

Andreas Claus schrieb:
> Frage: Wieso leutet die LED nicht im 1 Hz Takt ???

weil du zwar den Ausgang eingeschaltet hat, aber nicht wie weiter oben 
beschrieben den Oszillator aktiviert hast. Der nach dem anlegen der 
Betriebsspannung durch ein gesetztes Bit 7 im Register 0x00 gesperrt 
ist. Also schreibe einfach mal noch eine 0 in Adresse 0.

Sascha

von Norbert S. (norberts)


Lesenswert?

Hi,

Welche LED sollte da leuchten?

Gruß,
Norbert

von S.E.M.G.M. (Gast)


Lesenswert?

Gefällt dir dieser Thread nicht mehr?
https://www.mikrocontroller.net/topic/35619277

BTW: Für Code bitte die Formatierung verwenden:
1
[c]C-Code[/c]

von S.E.M.G.M. (Gast)


Lesenswert?

S.E.M.G.M. schrieb:
> Gefällt dir dieser Thread nicht mehr?
> https://www.mikrocontroller.net/topic/35619277

Sry, dieser Link was, bin wohl aus Versehen an die '7' Taste gekommen.
Beitrag "RTC DS1307 1Hz"

von F. F. (foldi)


Lesenswert?

Hast du überhaupt schon mal eine Led mit Arduino blinken lassen?
Dann solltest du mal dieses Beispiel aus der Arduino IDE ausprobieren.
1
/*
2
  Blink
3
  Turns on an LED on for one second, then off for one second, repeatedly.
4
 
5
  This example code is in the public domain.
6
 */
7
 
8
// Pin 13 has an LED connected on most Arduino boards.
9
// give it a name:
10
int led = 13;
11
12
// the setup routine runs once when you press reset:
13
void setup() {                
14
  // initialize the digital pin as an output.
15
  pinMode(led, OUTPUT);     
16
}
17
18
// the loop routine runs over and over again forever:
19
void loop() {
20
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
21
  delay(1000);               // wait for a second
22
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
23
  delay(1000);               // wait for a second
24
}

von Joachim B. (jar)


Lesenswert?

Andreas Claus schrieb:
> Frage: Wieso leutet die LED nicht im 1 Hz Takt ???

gute Frage, welche LED, welcher Strom welche Spannung?

Andreas Claus schrieb:
> und zusätzlich an dem SQ-Pin ein
> Pull-up Widerstand

aha, aber den willst du nicht nennen, könnte ja sein wir merken was.

woher weisst du ob deine LED mit deinem Widerstand überhaupt leuchten 
kann?
Was denkst du kann der SQ Pin als Source oder Sink liefern?

von F. F. (foldi)


Lesenswert?

Joachim, er meint die auf dem Arduino an Pin 13 hängende Led.
Wenn er die nun mal gar nicht erst eingebunden hat, wird sie auch nicht 
leuchten.
Das ist hier echt immer so, als würde ein Baby noch nicht mal aufstehen 
können, aber gleich mit dem Kunstturnen beginnen wollen.

Der TO hat sich das Script irgendwoher kopiert und jetzt soll der 
Kühlschrank melden, wann das das Bier kalt ist.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

F. Fo schrieb:
> Joachim, er meint die auf dem Arduino an Pin 13 hängende Led.

das konnte ich nicht lesen.......


hier jedenfalls leuchten alle LEDs die sollen, auch die Arduino LED im 
1s Takt und ganz ohne DS1307 SQ :-)

http://www.mikrocontroller.net/attachment/244383/m1284p_m328p.jpg

von F. F. (foldi)


Lesenswert?

Joachim B. schrieb:
> http://www.mikrocontroller.net/attachment/244383/m1284p_m328p.jpg

Da bekommt der TO, meiner Einschätzung nach, nicht mal die Verdrahtung 
hin.

von Andreas C. (ice-kalt)


Lesenswert?

ok habe mich vieleicht etwas falsch ausgedrückt.


mein Ziel ist es den RTC ds1307 so zu beschreiben das der SQ Pin des 
ds1307 1Hz ausgibt. Mehr benötige ich gar nicht von dem RTC.

Da ich noch nicht so viel Erfahrung mit dem RTC habe, habe ich einige 
Probleme damit.

Deswegen wollte ich mich an Euch wenden.

Meine Frage ist, wie ich mit dem oben geschrieben Code (Angeschlossen 
wie auf dem Bild), das so umsetze, dass ich an dem SQ Pin 1Hz habe.

Ich wollte nur eine LED anschließen um zu schauen ob ich 1Hz Signal am 
SQ habe. <--- Das ist aber nicht so wichtig.

Es wäre sehr sehr schön, wenn mir jemand hilft den Code so anzupassen, 
sodass am SQ Pin 1Hz herauskommt.

Ich suche schon ewig nach einer Lösung. Deswegen habe ich die Frage 
etwas umständlich geschrieben.

Vielen Dank im Voraus.


Mit freundliche Grüßen.

von C-lover (Gast)


Lesenswert?

Du solltest die Uhr auch noch stellen.

Mir ist da schon mal seltsames Verhalten aufgefallen wenn nur der Sq Out 
gesetzt wird.

von Andreas C. (ice-kalt)


Lesenswert?

C-lover schrieb:
> Du solltest die Uhr auch noch stellen.

Ja das werde ich berücksichtigen.
Ich benötige aber nur das 1 Hz Signal, kannst du mir weiterhelfen..?

von Andreas C. (ice-kalt)


Lesenswert?

Sascha Weber schrieb:

> weil du zwar den Ausgang eingeschaltet hat, aber nicht wie weiter oben
> beschrieben den Oszillator aktiviert hast. Der nach dem anlegen der
> Betriebsspannung durch ein gesetztes Bit 7 im Register 0x00 gesperrt
> ist. Also schreibe einfach mal noch eine 0 in Adresse 0.


Vielen Dank für die Infos, da ich mit Arduino + RTC nicht viel Erfahrung 
habe, weis ich nun nicht wie ich das in den Code schreibe.

Wäre sehr sehr nett von dir, wenn du mir da nochmal weiterhelfen 
könntest.

Wie gesagt ich benötige am SQ Pin nur 1Hz Signal. Mehr brauche ich vom 
RTC nicht.

Danke im Voraus.

von Sascha W. (sascha-w)


Lesenswert?

Andreas Claus schrieb:
> Sascha Weber schrieb:
>
>> weil du zwar den Ausgang eingeschaltet hat, aber nicht wie weiter oben
>> beschrieben den Oszillator aktiviert hast. Der nach dem anlegen der
>> Betriebsspannung durch ein gesetztes Bit 7 im Register 0x00 gesperrt
>> ist. Also schreibe einfach mal noch eine 0 in Adresse 0.
>
>
> Vielen Dank für die Infos, da ich mit Arduino + RTC nicht viel Erfahrung
> habe, weis ich nun nicht wie ich das in den Code schreibe.
>
> Wäre sehr sehr nett von dir, wenn du mir da nochmal weiterhelfen
> könntest.
>
> Wie gesagt ich benötige am SQ Pin nur 1Hz Signal. Mehr brauche ich vom
> RTC nicht.
>
> Danke im Voraus.

Dann gehe ich mal davon aus das du das gepostete Stück mit dem 
Einschalten des SQ nur irgendwo kopiert hast. Dort wird das Register 7 
(Adresse 7) mit 0x10 beschrieben. Dann solltes es für dich auch kein 
Problem darstellen das Register 0 mit 0 zu beschreiben.
Wenn dir hier der ganze Code fertig vorgesetzt wird hast du am Ende auch 
nichts gelernt - also ruhig mal das Datenblatt des DS anschauen.

Sascha

von Andreas C. (ice-kalt)


Lesenswert?

Danke für die Antwort

Hänge schon seit mehreren Wochen an diesem Problem

Wäre sehr nett, wenn mir jemand den fertigen Code schreibt, ich verstehe 
einfach nicht das mit dem I2C und dem Beschreiben des RTCs.
Den Rest meines Projektes schaffe ich alleine.
Ich benötige nur dieses 1Hz Signal.

von Wolfgang A. (Gast)


Lesenswert?

Andreas Claus schrieb:
> Hänge schon seit mehreren Wochen an diesem Problem

Und in der Zeit hast du es nicht fertig gebracht, dir die Library mit 
den Beispielen für den DS1307 herunterzuladen und anzusehen, wie man 
über I²C ein paar Registerwerte ändert?
http://playground.arduino.cc/Code/Time

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Andreas Claus schrieb:
> Wäre sehr nett, wenn mir jemand den fertigen Code schreibt, ich verstehe
> einfach nicht das mit dem I2C und dem Beschreiben des RTCs.

vorne weg brauchst du erst mal #defines
hier mal ein Beispiel zum Lesen und Schreiben der DS3231, DS1307 geht 
äquivalent, solltest klar kommen.

Die DS1307 ist zickiger, Start Clock muss nach fehlender Power wohl 
gesetzt werden damit sie läuft, viel Datenblatt lesen, dann klappt das.

siehe .zip

habe noch den Unterschied zu AVR Studio ohne Arduino vorher, aber du 
willst ja pures Arduino.....

ich hoffe das hilft erst mal, lesen und verstehen, dann sollte das 
Anpassen klappen.

Profi Progger bin ich nicht, geht vielleicht eleganter aber mir reichts.

wenn du SQ auf 1Hz ausgang gesetzt hast wäre eine Überprüfung ja nicht 
schlecht, SQ Ausgan an einen freien Input Port vom Arduino und abfragen 
wenn high Arduino LED an und wenn low Arduino LED aus in der sonst 
leeren Loop Schleife, das RTC setzen der Register macht man ja im Setup.
1
#if defined(__AVR_ATmega328P__)
2
3
  #define ARDUINO_LED      5
4
  #define DDR_ARDUINO_LED  DDRB
5
  #define PORT_ARDUINO_LED PORTB
6
  #define ARDUINO_LED_ON   PORT_ARDUINO_LED|=(1<<ARDUINO_LED)
7
  #define ARDUINO_LED_OFF  PORT_ARDUINO_LED&=~(1<<ARDUINO_LED)
8
9
#elif defined(__AVR_ATmega1284P__)
10
  #define ARDUINO_LED      7
11
  #define DDR_ARDUINO_LED  DDRB
12
  #define PORT_ARDUINO_LED PORTB
13
  #define ARDUINO_LED_ON   PORT_ARDUINO_LED|=(1<<ARDUINO_LED)
14
  #define ARDUINO_LED_OFF  PORT_ARDUINO_LED&=~(1<<ARDUINO_LED)
15
16
#endif
17
18
// im Setup nach RTC Init SQ an Input Port auf Input
19
20
im Loop
21
22
if(input high) ARDUINO_LED_ON;
23
else ARDUINO_LED_OFF;
24
25
sollte blinken

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.