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


von Markus P. (sebastianwurst)


Angehängte Dateien:

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%20Platinen/myAVR%20Board%20MK2%20USB%20PLUS,%20Bausatz.htm?sp=article.sp.php&artID=47

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:
1
if (rtc_read(&rtc)== RTC_NO_ERROR)
2
{
3
4
5
//Stunden
6
    lcd_setcursor( 8, 1 );
7
8
       //Int to ASCII umwandlung
9
       itoa( rtc.time[0], itoa_lcd_buffer, 10 );
10
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
11
 
12
13
    lcd_setcursor( 9, 1 );
14
15
       //Int to ASCII umwandlung
16
       itoa( rtc.time[1], itoa_lcd_buffer, 10 );
17
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
18
 
19
//Doppelpunkt
20
    lcd_setcursor( 10, 1 );
21
 
22
23
       //Int to ASCII umwandlung
24
       itoa( rtc.time[2], itoa_lcd_buffer, 10 );
25
       lcd_data(lcd_doppelpunkt); 
26
27
28
//Minuten
29
    lcd_setcursor( 11, 1 );
30
31
       //Int to ASCII umwandlung
32
       itoa( rtc.time[3], itoa_lcd_buffer, 10 );
33
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
34
 
35
36
    lcd_setcursor( 12, 1 );
37
38
       //Int to ASCII umwandlung
39
       itoa( rtc.time[4], itoa_lcd_buffer, 10 );
40
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
41
 
42
//Dopelpunkt 
43
    lcd_setcursor( 13, 1 );
44
45
       //Int to ASCII umwandlung
46
       itoa( rtc.time[5], itoa_lcd_buffer, 10 );
47
       lcd_data(lcd_doppelpunkt); 
48
49
//Sekunden
50
    lcd_setcursor( 14, 1 );
51
52
       //Int to ASCII umwandlung
53
       itoa( rtc.time[6], itoa_lcd_buffer, 10 );
54
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
55
 
56
57
     lcd_setcursor( 15, 1 );
58
59
       //Int to ASCII umwandlung
60
       itoa( rtc.time[7], itoa_lcd_buffer, 10 );
61
       lcd_string( itoa_lcd_buffer );  // Ausgabe an das LCD-Display
62
 
63
64
} else {
65
66
 lcd_setcursor( 7, 1 );
67
 lcd_string("Batt.leer");
68
}

von Peter D. (peda)


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

von Nikolaus (Gast)


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

von Markus P. (sebastianwurst)


Lesenswert?

@ Peter

Hast Du vielleicht ein Tip ?

mfg Sebastian

von XXX (Gast)


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

von Peter D. (peda)


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

von Rolf P. (rolfp)


Lesenswert?

Ich benutze in einem meiner aktuellen Projekte auch gerade ein DS1307.
Zeit speichern mache ich so:
1
static char rtc[10]; // {Sekunden, Minuten, Stunden, Wochentag, Tag, Monat, Jahr, Control, Jahrhund., Jahr}
2
3
char bin2bcd(char c)
4
{
5
 return ((c/10)<<4)+c%10;
6
}
7
8
char bcd2bin(char c)
9
{
10
 return ((c>>1)&0x78)+((c>>3)&0x1E)+(c&0x0F);
11
}
12
13
void zeit_in_rtc_speichern()
14
{
15
 uchar err, sek;
16
 for(sek=sec;sek==sec;) ;//auf Sekundenwechsel warten
17
 rtc[0] = bin2bcd(sec);
18
 rtc[1] = bin2bcd(min);
19
 rtc[2] = bin2bcd(stunden);
20
 rtc[3] = wochentag;
21
 rtc[4] = bin2bcd(tage);
22
 rtc[5] = bin2bcd(monat);
23
 rtc[6] = bin2bcd(jahr%100);
24
 rtc[7] = 0x00; //0x80=OUT=Level wenn SQWE nicht gesetzt, 0x10=SQWE=Frequenz an Pin 7 ausgeben, 0x03=RS
25
                //RS definiert die Frequenz wenn SQWE gesetzt ist: 0=1Hz, 1=4096, 2=8192, 3=32768 Hz
26
 rtc[8] = jahr/100; //so koennte man noch das Jahrhundert speichern.
27
 rtc[9] = jahr%100; //das aktuell Jahr muesste man aber auch noch mit speichern.
28
 if(rtc[0] != bin2bcd(sec)) err=5; //falls Sekunde inzwischen gewechselt hat ist etwas faul.
29
 else err = rtc_write(rtc,10);
30
#ifdef RTCDEBUG
31
 if(err) lcd_printerror(err);
32
 else lcd_gowrite(4,1,"in RTC gespeichert");
33
#endif
34
}
rtc[8] und rtc[9] kann man natürlich auch weglassen wenn es nur bis 2099 
laufen soll.

Rolf

von Markus P. (sebastianwurst)


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:
1
 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....

von Markus P. (sebastianwurst)


Lesenswert?

Ein Frage Rolf,
warum machst Du das während dem Sekundenwechsel ?

von Rolf P. (rolfp)


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.

von Peter D. (peda)


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

von Nikolaus (Gast)


Lesenswert?

Problem ist nur der Stromausfall. Oder ? Beim RTC kein Problem da mit 
Batterie.

von Peter D. (peda)


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

von Karl H. (kbuchegg)


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

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.