Forum: Mikrocontroller und Digitale Elektronik Frage zum DS1302 RTC


von Hölscher (Gast)


Lesenswert?

Hallo Mikrocontroller Freunde

Ich habe mal wieder eine Frage: Ich initialisiere gerade meinen DS1302.
Ich habe es jetzt endlich so weit das ich Daten an den DS1302 senden
kann und Daten aus dem DS1302 lesen kann.

Jetzt mein Problem ich habe das Gefühl das der DS1302 nicht anfängt zu
arbeiten. Wenn ich ihm 1 Sekunde in sein Register schreibe kann ich
auch nur 1 Sekunde auslesen. Müsste das dann nicht automatisch wenn ich
noch mal einlese nach z.B 4s auch eine 4 zeigen.

Frage: Startet der DS1302 automatisch oder muss ich ihm das sagen.

Vieleicht hat ja auch jemend eine Idee zu meinem Quellcode oder findet
womöglich auch meinen Fehler.
Ich würde mich freuen wenn Ihr euch mal die Funktion INI_DS1302()
anschauen könntet.

Mit freundlichen Grüßen
Christian Hölscher


Auszug aus meinem Quellcode:

void INI_DS1302()   // initialisierung des Timerbausteins DS1302
{
WB_reset();
WB_schreibe_byte(0x8E);      // control register
WB_schreibe_byte(0x00);      // disable write protect

WB_reset();
WB_schreibe_byte(0x90);     // trickle charger register
WB_schreibe_byte(0x00);     // enable, 2 diodes, 8K resistor 0xAB

WB_reset();
WB_schreibe_byte(0xBE);    // clock burst write (eight registers)

WB_schreibe_byte(0x01);    // Sekunde auf 0 stellen
WB_schreibe_byte(0x02);    // Minute auf 0 stellen
WB_schreibe_byte(0x12);    // Stunde auf 12 stellen
WB_schreibe_byte(0x10);    // Wochentag auf 10 stellen
WB_schreibe_byte(0x03);    // Monat auf März stellen
WB_schreibe_byte(0x03);    // Tag einstellen
WB_schreibe_byte(0x04);    // Jahr einstellen

WB_schreibe_byte(0x00);  // must write control register in burst mode
WB_reset();
}

//-------------------------------------------------------------------
//Beschreibung:    Funktionen:  3-Wire-Bus Ansteuerung
//-------------------------------------------------------------------

void INI_WB()    // Funktion zur initialisierung des 3-Wire-Bus
{
   SCLK = 0;        // SCLK  Serial Clock = LOW
   RSTB = 0;        // RSTB Reset Eingang = LOW
   IO = 0;      // IO Serial Imput Output = LOW
}

//-------------------------------------------------------------------

void WB_reset()    // Funktion zum reseten des 3-Wire-Bus
{
   SCLK = 0;    // SCLK  Serial Clock = LOW
   RSTB = 0;    // RSTB Reset Eingang = LOW
   RSTB = 1;    // RSTB Reset Eingang = HIGH
}

//-------------------------------------------------------------------

void WB_schreibe_byte(unsigned char W_Byte)  // Funnktion schreiben
{
  unsigned char i;

  for(i = 0; i < 8; ++i)
  {
    IO = 0;
    if(W_Byte & 0x01)
    {
      IO = 1;   // set port pin high to read data
    }
    SCLK = 0;
    SCLK = 1;
    W_Byte = (W_Byte >>1);
    }
}

//-------------------------------------------------------------------

unsigned char WB_lese_byte()      // Funnktion zu lesen
{
  unsigned char i;
  unsigned char R_Byte;
  unsigned char TmpByte;

  R_Byte = 0x00;
  IO = 1;
  for(i=0; i<8; ++i)
  {
    SCLK = 1;
    SCLK = 0;
    TmpByte = (unsigned char)IO;
    TmpByte <<= 7;
    R_Byte >>= 1;
    R_Byte |= TmpByte;
  }
  return R_Byte;
}

von Hölscher (Gast)


Lesenswert?

Nachtrag: Muss man beim Anschluss des Quarzes was beachten.

Die Polung ist doch eingentlich egal oder?
Ich verwende ein 3.2769Mhz quarz.

Christrian

von BernhardT (Gast)


Lesenswert?

Hatten wir gerade scjhon mal mit ner RTC von Philips. Für den 1302 gilt
das gleiche: 3,2768MHz sind nun mal nicht 32,768kHz.
Gruß Bernhard

von Hölscher (Gast)


Lesenswert?

OK vielen Dank für den Tip..aber funktioniert das dann gar nicht?

Christian Hölscher

von Dieter (Gast)


Lesenswert?

Hallo

Sehr Wahrscheinlich geht der mit dem Quarz gar nicht.

Schau dir den Code mal an.

http://electronicsculpture.brucecannon.org/technica/code/my_ds1302.c.htm


MFG
Dieter

von Hölscher (Gast)


Lesenswert?

Hallo Dieter vielen ich Dank für die schnelle Antwort.

Der Quellcode hilft mir obwohl ich glaube das meiner auch funktionieren
muss.
Jetzt brauch ich schnell einen anderen Quarz um ganz sicher zu sein das
es darin nicht lieg.

Mit freundlichen Grüßen
Christian

von BernhardT (Gast)


Lesenswert?

Sind in jeder Quarzuhr (auch Funkwecker etc.) drinn 32768 Herz = 2^15.
Wenn du also eine alte defekte Uhr hast, schlachte Sie aus ( Ich hab
schon Quarzwecker gekauft, die haben weniger gekostet als die
Versandkosten bei Reichelt und co).
Gruß Bernhard

von Josef (Gast)


Lesenswert?

Die Leseroutine hinkt, nicht der Quarz.

Josef

von Hölscher (Gast)


Lesenswert?

Vielen Dank BernhardT der Tipp ist super ich benötige aber noch ein
DS1620 zur Temperaturmessung und darum habe ich gerade bestellt.
Lieber hätte ich aber den DS1621(I2C würde ich geren mal
ausprobieren)den hat Reichelt aber leider nicht.

Hallo Josef wo hinkt den meine Leserotine?
Kannst du mir ein Tipp geben..

Mit freundlichen Grüßen
Christian

von Dieter (Gast)


Lesenswert?

Meiner Meinung nach liegen die Daten beim lesen, mit der steigenden
Flanke von CLK an. Ich setze die dann HIGH und warte eine gewisse Zeit.
Dann Frage ich ab, ob der PIN high ist oder nicht.

SCLK = 1;

if ( bit_is_set(1wire,IO))   oder so in der Art.

SCLK = 0;

Natürlich solte der IO Pin vorher als Eingang definiert sein.

MFG

Dieter

von Hölscher (Gast)


Lesenswert?

Hallo Dieter
das verstehe ich nicht ganz, meinst du bei mir in der read Funktion ist
das mit der Flanke Falsch. Ich habe es gerade ausprobiert hat aber
nicht funktioniert oder ich habe was falsch gemacht.

Mit freundlichen Grüßen
Christian

von Dieter (Gast)


Lesenswert?

OK

Hab nochmal ins Datenblatt geschaut. Die Daten beim lesen liegen mit
der fallenden Flanke des CLK an, hattest Recht. LSB zuerst.

SCLK = 1;
waitms 1;
if ( bit_is_set(1wire,IO))   oder so in der Art.

Ich kenne deinen Compiler nicht so genau. Da das LSB zuerst kommt,
setze ich, wenn das BIT in IO=HIGH ist, das MSB in der Variablen und
schiebe dann eine Stelle nach rechts. Ansonsten wird nur geschoben.

SCLK = 0;

Kann aber doch schön im AVR Studio sehen, ob und wenn ja wie die Bits
in die Variable geschoben werden.

Wo schaltest du den PIN denn da auf Eingang, oder bin ich blind ??

MFG
Dieter

von Hölscher (Gast)


Lesenswert?

Meinst du einfach am Anfang IO=0; schreiben oder wie meinst du das.

MFG
Christian

von Dieter (Gast)


Lesenswert?

Hallo

Du must doch, um den PIN als Eingang zu schalten, das DDRx des PIN
entsprechend auf 0 setzen.


cbi(DDRB,1);  PORTB Pin 1 als Eingang

if ( bit_is_set(PINB,1))

Schau dochmal unter Artikel hier auf der Seite den C Kurs an.

MFG
Dieter

von Hölscher (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Dieter du hast recht.

Ich weiß zwar noch nicht so ganz wie ich das bei meinem Controller
machen soll aber.. Schritt für Schritt geht es nach vorne... aber
langsamm.

Ich habe mal meine Header Datei als Anhang beigepackt.Vieleicht kannst
du mir ja noch sagen wie das bei mir aussehen kann.

Ich merke immer wieder, das ich noch sehr sehr viel lernen muss...!!
Schön das es Personen gibt die man Fragen und auf die Nerven gehen
kann. Ich hoffe das ist in Ortnung

Mit freundlichen Grüße
Christian

von Dieter (Gast)


Lesenswert?

Mit der Header Datei kann ich dir nicht helfen.

Ich habe vergessen, das du nicht mit einem AVR arbeitest, daher ist das
mit dem DDRB bei dir nicht richtig. Du mußt aber den PIN auf Eingang
schalten, mußt nochmal ins Datenblatt schauen, da ich uC nicht kenne.

MFG

Dieter

von Hölscher (Gast)


Lesenswert?

OK danke.. Ich finde es super das du dir so viel Zeit für mich und den
anderen im Forum nimmst.

Vielen Dank noch mal

MFG
Christian

von Peter D. (peda)


Lesenswert?

Der 8051 hat einen Open-Drain Ausgang. D.h. sobald der Pin auf 1 gesetzt
ist, läßt sich auch von ihm lesen.

Eine extra Umschaltung ist also nicht nötig.


Peter

von Hölscher (Gast)


Lesenswert?

Super Danke.. Ich habe mich schon ein wenig gewundert warum das auch
ohne Funktioniert.

Mit freundlichen Grüßen
Christian

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.