mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DS1307 Uhrzeit stellen über ein LCD


Autor: Markus P. (sebastianwurst)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich will ein RTC Uhr über das Display stellen. Es handelt sich dabei um 
den DS1307 der mit dem Code (s.Anhang) an diesem Board :
http://shop.myavr.de/Baus%C3%A4tze%20und%20Platine...

betrieben wird. Es funktioniert auch schon prima. Doch kriege ich es 
einfach nicht hin die Uhr zu stellen. Wie muss ich welches Register 
beschreiben damit ich mit dem Code im Anahng die Uhr stellen kann ? Wäre 
prima wenn mir einer hilft.


 Ich übertrage die Uhr zur LCD so:

if (rtc_read(&rtc)== RTC_NO_ERROR)
{


//Stunden
    lcd_setcursor( 8, 1 );

       //Int to ASCII umwandlung
       itoa( rtc.time[0], itoa_lcd_buffer, 10 );
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
 

    lcd_setcursor( 9, 1 );

       //Int to ASCII umwandlung
       itoa( rtc.time[1], itoa_lcd_buffer, 10 );
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
 
//Doppelpunkt
    lcd_setcursor( 10, 1 );
 

       //Int to ASCII umwandlung
       itoa( rtc.time[2], itoa_lcd_buffer, 10 );
       lcd_data(lcd_doppelpunkt); 


//Minuten
    lcd_setcursor( 11, 1 );

       //Int to ASCII umwandlung
       itoa( rtc.time[3], itoa_lcd_buffer, 10 );
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
 

    lcd_setcursor( 12, 1 );

       //Int to ASCII umwandlung
       itoa( rtc.time[4], itoa_lcd_buffer, 10 );
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
 
//Dopelpunkt 
    lcd_setcursor( 13, 1 );

       //Int to ASCII umwandlung
       itoa( rtc.time[5], itoa_lcd_buffer, 10 );
       lcd_data(lcd_doppelpunkt); 

//Sekunden
    lcd_setcursor( 14, 1 );

       //Int to ASCII umwandlung
       itoa( rtc.time[6], itoa_lcd_buffer, 10 );
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
 

     lcd_setcursor( 15, 1 );

       //Int to ASCII umwandlung
       itoa( rtc.time[7], itoa_lcd_buffer, 10 );
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
 

} else {

 lcd_setcursor( 7, 1 );
 lcd_string("Batt.leer");
}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian K. schrieb:
> ich will ein RTC Uhr über das Display stellen.

Das geht schonmal garnicht, ein Display macht nur Ausgaben.
Du brauchst Eingabegeräte, z.B. Tasten.

Und dann mußt Du erstmal einen Ablaufplan machen, wie Du mit den Tasten 
die Werte ändern willst.
Und erst danach kannst Du überhaupt den PAP in Code umsetzen.


Peter

Autor: Nikolaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Peter,
ja das ist klar. Ich wollte das so machen das ich über einen Taster die 
Zeiten hochzähle. (zB.: 19:30:15 ) Ich kann mit den Tasten dann die 
19(Stunden) hochzählen oder die 30 (Minuten) usw. wenn ich dann die 
richtige Zeit eingestellt habe will ich über eine "Übernahme"-Taste den 
Wert zur RTC-übertragen. Und daran scheiterts im Moment.

Könntest Du mir da einwenig weiterhelfen wo ich ansetzen muss ?

Vieeelllleeen Dank

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter

Hast Du vielleicht ein Tip ?

mfg Sebastian

Autor: XXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Woran scheitert es?
Du findest nicht die richtigen Register im RTC?
http://www.datasheetcatalog.org/datasheet/maxim/DS1307.pdf
Seite 4

Du hast keine Ahnung, wie I2C funktioniert?
Gleiches Datenblatt weiter hinten.

Gruß
Joachim

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du must schon deutlich konkreter werden.
Wo hast Du Probleme und was hast Du bereits gemacht?
Wie ist die Bedienerführung gedacht?
Zeig dochmal Deinen PAP.


Peter

Autor: Rolf Pfister (rolfp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze in einem meiner aktuellen Projekte auch gerade ein DS1307.
Zeit speichern mache ich so:
static char rtc[10]; // {Sekunden, Minuten, Stunden, Wochentag, Tag, Monat, Jahr, Control, Jahrhund., Jahr}

char bin2bcd(char c)
{
 return ((c/10)<<4)+c%10;
}

char bcd2bin(char c)
{
 return ((c>>1)&0x78)+((c>>3)&0x1E)+(c&0x0F);
}

void zeit_in_rtc_speichern()
{
 uchar err, sek;
 for(sek=sec;sek==sec;) ;//auf Sekundenwechsel warten
 rtc[0] = bin2bcd(sec);
 rtc[1] = bin2bcd(min);
 rtc[2] = bin2bcd(stunden);
 rtc[3] = wochentag;
 rtc[4] = bin2bcd(tage);
 rtc[5] = bin2bcd(monat);
 rtc[6] = bin2bcd(jahr%100);
 rtc[7] = 0x00; //0x80=OUT=Level wenn SQWE nicht gesetzt, 0x10=SQWE=Frequenz an Pin 7 ausgeben, 0x03=RS
                //RS definiert die Frequenz wenn SQWE gesetzt ist: 0=1Hz, 1=4096, 2=8192, 3=32768 Hz
 rtc[8] = jahr/100; //so koennte man noch das Jahrhundert speichern.
 rtc[9] = jahr%100; //das aktuell Jahr muesste man aber auch noch mit speichern.
 if(rtc[0] != bin2bcd(sec)) err=5; //falls Sekunde inzwischen gewechselt hat ist etwas faul.
 else err = rtc_write(rtc,10);
#ifdef RTCDEBUG
 if(err) lcd_printerror(err);
 else lcd_gowrite(4,1,"in RTC gespeichert");
#endif
}
rtc[8] und rtc[9] kann man natürlich auch weglassen wenn es nur bis 2099 
laufen soll.

Rolf

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Rolf, ich werde dein Code mir auch einmal verinnerlichen ob ich 
davon was gebrauchen kann.

@ Peter. Was ich schon gemacht habe ist eigentlich nur folgendes:

In der rtc.c gibt es ja die Function "rtc_write" und damit habe ich dann 
versucht ein Register zu beschreiben:
 r->rtc_register[0] = ((r->time[6] & 0x07) << 4) | (r->time[7] & 0x0f);

Da habe ich erstmal ganz simple versucht irgendwelche Bits im Register 
zu beeimern um zu sehen ob sich überhaupt was tut. Tat es natürlich 
nicht, da ich zugegebenermaßen alles nicht bis ins kleinste Detail 
verstanden habe. Dafür das ich aber erst 4 Wochen unregelmäßig mit 
Mikrocontroller arbeite gehts aber schon so lala....

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Frage Rolf,
warum machst Du das während dem Sekundenwechsel ?

Autor: Rolf Pfister (rolfp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian K. schrieb:
> warum machst Du das während dem Sekundenwechsel ?

Nicht während, sondern unmittelbar nach dem Sekundenwechsel. So kann ich 
ziemlich sicher sein, dass während dem Beschreiben der Register die 
Uhrzeit nicht ändert.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Direkt zum DS1307 kann ich Dir nicht helfen, ich benutze immer nur den 
internen Timer als RTC.
Dann braucht man nichts hin und her zu schicken und kann auch Sommerzeit 
einbauen.


Peter

Autor: Nikolaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem ist nur der Stromausfall. Oder ? Beim RTC kein Problem da mit 
Batterie.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nikolaus schrieb:
> Problem ist nur der Stromausfall.

Kommt drauf an, wo Du wohnst.
An den letzten Netzausfall kann ich mich nicht mehr erinnern, 2010 war 
jedenfalls keiner.

Außerdem haben größere AVRs (ab ATmega48) die Möglichkeit, einen 
Uhrenquarz dranzupappen. Mit nem 1F Goldcap sollten da mehrere Wochen 
gepuffert werden können.


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nikolaus schrieb:
> Problem ist nur der Stromausfall. Oder ? Beim RTC kein Problem da mit
> Batterie.

:-)
Da könnte man auch sagen:
Das Problem einer RTC ist, dass die Batterie irgendwann leer wird

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.