www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Real-Time Clock (ds1307)


Autor: sven s. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

ich hab mir einen ds1307 besorgt und an einen mega16 angeschlossen.(wer 
den code haben will einfach melden)
soweit geht auch alles kann die zeit reinschreiben und die uhr läuft 
auch.
allerdings wenn ich die 5 volt versorgung weg nehme bleibt das ding 
einfach stehen, ich weis jetzt nicht ob ich einfach nur zu doof bin aber 
ich dachte das ding läuft mit der 3v lithium batterie weiter.

msg sven


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenn's vielleicht trivial klingt:
Batterie richtigrum angeschlossen? Batteriespannung zu niedrig? Es sind 
mindestens 2.0V nötig, sonst schaltet sich die Uhr ab. Es sollte keine 
Diode zwischen Pluspol der Batterie und VBat- Anschluss sein.

Bleibt denn das RAM erhalten?

Gruss
Mike

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste doch mal bitte deine Schaltung

Autor: sven s. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
die batterie hat noch 2,8volt und eine diode ist nicht drin wie man auf 
dem schaltplan sehen kann.
die daten bleiben auch im ram.

mfg sven

Autor: sven s. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier noch das layout

Autor: sven s. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weis den keiner an was das liegen könnte.

bitte helft mir ich komm nicht mehr weiter, das ist doch zum 
verzweifeln.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun, was mich an dem Teil interessiert:

Ich kenne die RTC74423 von EPSON. Die hat einen Chip Select Anschluß. 
Ist dieser LOW, so ist das IC auf standby. Da wird garantiert, die 
Funktion bis 2V Betriebsspannung aufrechtzuhalten. Die geschieht über 
Godcap-Kond. (welche mit einer Diode von 5V getrennt ist). Erst werden 
die 5V zugeschalten und dann wird mittels des Chip-select-Signals das IC 
wieder freigegeben (für Bedienung).

Sowas hat aber der DS1307 nicht... Was ist wenn jetzt die 
Betriebsspannung sinkt, mit den SCL und SDA Leitungen.. Die sinken auch, 
weil der Pullup nicht mehr geht.. Wird das jetzt nicht irgendwie als 
Start-I2C erkannt....??
Wie ist das bei dem DS1307 gedacht??
Nicht das das Problem aus der Richtung kommt....

Autor: sven s. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch wenn er es als start erkennt würde dann nicht die uhr anhalten.
hab auch mal die scl und sda leitungen mit pull up auf plus der batterie 
gelegt hat auch nichts gebracht:

ich könnte noch einen hardware defekt vermuten aber das wär sehr komisch 
da ja alle anderen funktionen gehen.

evtl hab ich ja was nicht beachtet hab jetzt zum ersten mal was mit i2c 
gemacht. ich nehm sonst lieber spi oder uart.

ich weis nicht mehr weite ich kann nur auf eure hilfe hoffen.

Autor: Henrik J. (henrikj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß von ner anderen RTC, dass ma den Oscillator abschalten kann. 
Anscheinend geht das mit der DS1307 auch. Auf Seite 2 des Datenblatts 
werden verschiedene Ströme beschrieben. Ich würdemal bisschen mit den 
Konfigurationsbits spielen.

Ich habe die DS1307 auvch verbaut jedoch in Ermangelung von Zeit noch 
kein Stückchen Code geschrieben. Kannst du mir den zukommen lassen?

henrik.jahnke   (at ) web(.)de

Autor: sven s. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier mal der code in einer beta version ohne viel schnick schnack.

@Henrik Jahnke
ich hoffe du kannst mir sagen ob der fehler bei dier auch auftritt um 
den fehler weiter einzugrenzen.

Autor: Henrik J. (henrikj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ui! Dann soll ich deinen Code mal reinflashen? Hmm... Das wird 
vielleicht morgen was. Eigentlich ist Zeit gerade knapp wegen Diplom 
schreiben. Ich hab auch nen Mega16 mit der DS1307. Würde es da nicht 
auch gehen, dass du mir ein HexFile schickst? Das müsste eigentlich 
funzen, oder?! Hab nen 16MHz Quarz dran.

EDIT: Hab gerade mal mein WinAVR angeworfen. Ich brauch noch deine twi.h

Ultraedit: Bei 2,8V ist das Ding schön gut leer gelutscht. Meine (steht 
schon ca 0,5 Jahre eingebaut und aber ohne Betrieb) hat noch 3,23V.

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum legst Du SQW/Out Pin7 mit einem Jumper gegen Masse?

Schreibst Du nach dem Neustart noch irgendetwas zur 1307, oder fragst Du 
direkt die Zeit ab ?

Autor: sven s. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Stephan

in dieser beta ja da setz ich die zeit in der fertigen version natürlich 
net. @ quellcode

>Warum legst Du SQW/Out Pin7 mit einem Jumper gegen Masse?

das soll kein jumper sondern eine stiftleiste sein zum anschluss an ein 
oszi oder was auch immer man damit anstellen will. war eh nur zum testen 
gedacht da ich so ein signal nicht wirklich verwenden kann.

@Henrik Jahnke

hier mal die .hex für den m16 mit 9600 baut auf 16mhz
mit "s" wird die zeit (nicht variabel) eingestellt
mit "t" wird der oszilator angehalten
mit "0" wird register 0 ausgelesen
und mit "7" wird register 7 ausgelesen
die zeit kommt immer bei jedem zeichen.

ich benutz jetz eine neue batterie mit 3,2 volt

Autor: Henrik J. (henrikj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jau! Die Anzeige mit Zeit einstellen usw. ist zwar bisschen kryptisch. 
Aber es hat gereicht, dass ich dir sagen kann:
Bei mir funzt es! Ich hab die Zeit (irgendwie) gestellt. Dann durch 
Tastendruck die aktuelle Zeit abgerufen. 10sec später nochmal 
Tastendruck -> 10 sec vergangen. Also zählt die Uhr erstmal.

Dann hab ich mir die Zeit gemerkt und nochmal von der RTC anzeigen 
lassen. Strom abgezogen und 30sec später wieder Strom angesteckt. Neu 
verbunden per RS232 und siehe da -> Uhrzeit war 30sec weiter.

Liegt also vielleicht wirklich an der Batterie. Bei mir funzt dein Code. 
AM besten ne Nacht drüber schlafen. Vielleicht kommt dann nochmal ne 
Erleuchtung.

An der twi.h und twi.c bin ich trotzdem noch interessiert. :)

Autor: sven s. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
so ein mist dann wird wohl echt mein ic ne macke haben.

na egal wenigstens ist der code io. diese fehler in der ausgabe sind 
noch ein paar debug reste die ich noch nicht weg gemacht haben.

anbei noch der header für dich.

danke für deine schnelle hilf, hat mich auf jeden fall weiter gebarcht.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
könnt ihr mir mal nen schaltplan posten? mich interessiert die 
spannungsversorgung der rtc über batterie und die spann.vers. des µC

Danke

Autor: Henrik J. (henrikj)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das ist völlig unspektakulär... Ist im Anhang. Wobei ich die beiden C's 
für den Oszillator nicht bestückt habe. Hab mir die Schwingung aber auch 
noch nicht angeschaut.

Bzgl Code. Der hat ein Copyright? Das nervt ja...

Autor: G.a.s.t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@sven s.
hast du dein Problem breits gelöst?
hab genau das selbe problem die uhr steht einfach aber ich kann die 
einzelnen register lesen und beschreiben.
Vbat ist auf Masse gelegt, da ich zum testen keine batterie verwende.
habe auch bereits deinen code versucht aber es klappt einfach nicht...

Autor: puffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
G.a.s.t schrieb:
> @sven s.
> hast du dein Problem breits gelöst?

Bestimmt, ist ja schon drei Jahre alt. ;)

> hab genau das selbe problem die uhr steht einfach aber ich kann die
> einzelnen register lesen und beschreiben.

Da läuft der Oszillator nicht:

1. Entsprechendes Bit (CH) gelöscht (Adresse 0x00, Bit 7)?
2. Uhrenquarz angeschlossen?

Testhalber kannst Du mal eine 0x10 an die Adresse 0x07 schreiben, danach 
müsste der SQW/OUT-Ausgang im Sekundentakt zwischen High und Low 
umschalten, wenn der Oszillator läuft.

> Vbat ist auf Masse gelegt, da ich zum testen keine batterie verwende.
> habe auch bereits deinen code versucht aber es klappt einfach nicht...

Er hatte das Problem, dass seine Uhr nach wegnehmen der Betriebsspannung 
stehengeblieben ist. Ohne Batterie wird bei Dir natürlich alles 
gelöscht.

Autor: G.a.s.t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok da problem ist nicht ganz das selbe...
einen neuen beitrag wollte ich nicht extra anfangen.

ja das CH hab ich gelöscht
temp = ds1307_read(0);

temp &= ~(1 << 7);

ds1307_write(0x00,temp);

quarz ist natürlich an Pin 1,2 direkt neben dem sockel angeschlossen.

am sqw messe ich nichts brauch ich da nicht einen pullup dazu?

Autor: sven s. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja klar das läuft jetzt auch schon ewig ohne probleme:-)
ich hatte da am quarz winzige krichströme die im 5volt betrieb nix 
gemacht haben, aber dann im bat betrieb brach der oszilator zusammen.

guck bitte noch mal im datenblatt ich erinner mich wage das ohne bat es 
zu problemen im betrieb kommen kann. oder mach einfach mal ne 3 volt bat 
drann.

der code von oben is ein testcode und ist zum testen auch ok. wenn du 
willst kann ich dir morgen mal den code aus dem fertigen projekt 
rausschneiden.

gruß sven

Autor: puffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
G.a.s.t schrieb:
> am sqw messe ich nichts brauch ich da nicht einen pullup dazu?

Ja, da muss ein pull-up ran.

Autor: G.a.s.t (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
endlich zählt er.
das problem lag daran dass ich vbat auf gnd gelegt habe was ich in einem 
anderen thread gelesen habe.
jetzt bin ich draufgekommen das davon nichts im datenblatt steht.

Autor: Besserwisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sobald die Batterie weg ist, steht der Quarz und die Uhr läuft nicht 
mehr. Wenn Du Vbat auf Masse legst, läuft die Uhr nie.
Wenn Du Vbat angschlossen hast, einmal die Uhrzeit stellen und dann 
läuft sie. Sie hat eine interne Spannungsumschaltung. Wenn Vcc kleiner 
Vbat wird, wird der I2C-Bus gesperrt und keine Kommandos angenommen.

Autor: puffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besserwisser schrieb:
> Sobald die Batterie weg ist, steht der Quarz und die Uhr läuft nicht
> mehr. Wenn Du Vbat auf Masse legst, läuft die Uhr nie.

Falsch. Im Datenblatt steht:

"Backup Supply Input for Any Standard 3V Lithium Cell or Other Energy 
Source. Battery voltage must be held between the minimum and maximum 
limits for proper operation. Diodes in series between the battery and 
the VBAT pin may prevent proper operation. If a backup supply is not 
required, VBAT must be grounded."

Das ist auch logisch. Wenn Vbat kein definiertes Potential deutlich 
unterhalb von Vcc hat, kann es Probleme beim Umschalten zwischen Vcc und 
Vbat geben.

Mit Vbat auf GND muss der DS1307 wunderbar laufen (solange Vcc aktiv 
ist), ansonsten stimmt irgendwas an der Verschaltung nicht.

Autor: puffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
puffel schrieb:
> Das ist auch logisch. Wenn Vbat kein definiertes Potential deutlich
> unterhalb von Vcc hat, kann es Probleme beim Umschalten zwischen Vcc und
> Vbat geben.

Genauer kann es da Probleme geben, die Versorgung stabil an Vcc zu 
halten, weil bei einem offenen Vbat der "Mindestabstand" zwischen Vcc 
und Vbat nicht garantiert ist.

Autor: G.a.s.t (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
das ist mein datenblatt, darin steht nichts davon.
der vbat ist doch der 3te pin der über dem Gnd.
sobald ich vbat auf gnd lege steht er wenn ich vbat wieder offen lasse 
zählt er weiter.

Autor: puffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
G.a.s.t schrieb:
> das ist mein datenblatt, darin steht nichts davon.
> der vbat ist doch der 3te pin der über dem Gnd.
> sobald ich vbat auf gnd lege steht er wenn ich vbat wieder offen lasse
> zählt er weiter.

Schau mal in die aktuelle Version des Datenblatts (Seite 6):
http://datasheets.maxim-ic.com/en/ds/DS1307.pdf

Das ist ja auch logisch. Vbat muss sicher unter Vcc sein, bei 1,25*Vbat 
wird umgeschaltet. Daher muss derPin bei nicht vorhandener Batterie auf 
ein festes Potential deutlich unterhalb von Vcc gebracht werden. Wenn 
keine Batterie drin ist, dann eben auf GND.
Damit funktioniert der DS1307 auch betriebssicher, mit offenem Vbat-Pin 
ist es eher Glückssache.
Falls Dein DS1307 in dem Falle nicht läuft, solltest Du nochmal Deine 
Schaltung prüfen, ob Du da wirklich auf GND gehst...

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
warum lassen sich in dem Code von SvenS die Sekunden nicht stellen ?
Weiss das jemand ?

Mit dieser Funktion:
 twi_init();

  twi_start();
  twi_writeadr(DS1307ADR,TW_WRITE);
  twi_writedata(0);  //Register-Pointer
  twi_writedata(0x22);  //sec
  twi_writedata(0x50);  //Minuten
  twi_writedata(0x16);  //Stunden
  twi_writedata(1);  //Tag
  twi_writedata(1);  //Datum
  twi_writedata(1);  //Monat
  twi_writedata(1);  //Jahr
  twi_writedata(0x11);//Control
  twi_stop();
  twi_start();
  twi_writeadr(DS1307ADR,TW_WRITE);
  twi_writedata(0);
  twi_writedata(1);
  twi_stop();


lassen sich nicht die Sekunden auf 22 Stellen sondern immer auf 0?

Im Anhang der komplette Code
#include <avr/io.h>
#include <util/twi.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define DS1307ADR 104


void usart_init(void)
{
  UCSRB = (1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);    //8N1                                
  UBRRL  = 103;                  //9600 Baud bei 16MHz
}

void usart_txchar(uint8_t byte)
{
  while(!(UCSRA & (1 << UDRE)));
    UDR=byte;
}    

void usart_txstr(char *str)
{
  while(*str)
  {
    usart_txchar(*str);
    str++;
  }
  usart_txchar(10);
  usart_txchar(13);
}

void twi_error()
{
  usart_txstr("TWI-Fehler erkannt");

}

void twi_init(void)
{

  TWSR = 0x00;
  //TWSR |= (1 << TWPS1) | (1 << TWPS0);  Prescaler=1
  TWBR = 152;        // SCL=50KHz @ 16 MHz
  //TWCR |= (1 << TWEN);  //TWI aktivieren

}

void twi_start(void)
{

  TWCR = (1 << TWSTA) | (1 << TWEN) | (1 << TWINT);
  while(!(TWCR & (1 << TWINT)));
  if((TWSR & TW_STATUS) != TW_START)
  {
    usart_txstr("Fehler beim Senden der Start-Condition");
    usart_txchar(TWSR);
  }
}

void twi_writeadr(uint8_t adr, uint8_t wr)  //W=0 R= alles außer 0
{

  adr=(DS1307ADR << 1);
  if(wr)
    adr |= 1;    //Beim lesen SLA+R übertragen ansonsten LSB auf 0 lassen (SLA+W)
  TWDR=adr;
  TWCR = (1 << TWEN) | (1 << TWINT);
  while(!(TWCR & (1 << TWINT)));
  if ((adr & 1) && ((TWSR & TW_STATUS) != TW_MR_SLA_ACK))
    usart_txstr("Fehler beim Senden der Adresse");
  if (!(adr & 1) && ((TWSR & TW_STATUS) != TW_MT_SLA_ACK))
    usart_txstr("Fehler beim Senden der Adresse");
  
}

void twi_writedata(uint8_t data)
{
  
  TWDR=data;
  TWCR = (1 << TWEN) | (1 << TWINT);
  while(!(TWCR & (1 << TWINT)));
  if((TWSR & TW_STATUS) != TW_MT_DATA_ACK)
    usart_txstr("Fehler beim Senden der Daten");
}

uint8_t twi_readdata(void)
{
  uint8_t data;

  TWCR = (1 << TWEN) | (1 << TWINT);
  while(!(TWCR & (1 << TWINT)));
  data = TWDR;
  return data;
  
}

void twi_stop(void)
{
  
  TWCR = (1 << TWEN) | (1 << TWSTO) | (1 << TWINT);
  while(TWCR & (1 << TWSTO));
  
    
}

void ds1307_writereg(uint8_t adr,uint8_t data)
{
  twi_start();
  twi_writeadr(DS1307ADR,TW_WRITE);
  twi_writedata(adr);
  twi_writedata(data);
  twi_stop();
}



uint8_t ds1307_readreg(uint8_t adr)
{
  uint8_t data;
  
  twi_start();
  twi_writeadr(DS1307ADR,TW_WRITE);
  twi_writedata(adr);
  twi_stop();
  twi_start();
  twi_writeadr(DS1307ADR,TW_READ);
  data=twi_readdata();
  twi_stop();
  return data;
}

void main(void)
{
  usart_init();
  twi_init();
    
  twi_start();
  twi_writeadr(DS1307ADR,TW_WRITE);
  twi_writedata(0);  //Register-Pointer 
  twi_writedata(0);  //sec
  twi_writedata(0x50);  //Minuten
  twi_writedata(0x16);  //Stunden
  twi_writedata(1);  //Tag
  twi_writedata(1);  //Datum
  twi_writedata(1);  //Monat
  twi_writedata(1);  //Jahr
  twi_writedata(0x11);//Control
  twi_stop();
  twi_start();
  twi_writeadr(DS1307ADR,TW_WRITE);
  twi_writedata(0);
  twi_writedata(1);
  twi_stop();
  
  sei();
  
  while(1);

}

void ds1307_gettime(void)
{
  uint8_t seconds,minutes,hours;

  seconds = ds1307_readreg(0);
  minutes = ds1307_readreg(1);
  hours = ds1307_readreg(3);

  seconds &= ~128;
  usart_txchar((hours >> 4)+0x30);
  usart_txchar((hours & 0x0f)+0x30);
  usart_txchar(':');
  usart_txchar((minutes >> 4)+0x30);
  usart_txchar((minutes & 0x0f)+0x30);
  usart_txchar(':');
  usart_txchar((seconds >> 4)+0x30);
  usart_txchar((seconds & 0x0f)+0x30);
  usart_txchar(10);
  usart_txchar(13);
}


SIGNAL (SIG_USART_RECV)
{
  uint8_t dummy;

  dummy=UDR;
  ds1307_gettime();

}




Autor: Flasher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Bernd
Hab ich mich auch gefragt..
mit der Funktion gings:

ds1307_writereg(0,0x05);

0 sec
1 min
2 hh
...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.