mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zum DS1302 RTC


Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: Muss man beim Anschluss des Quarzes was beachten.

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

Christrian

Autor: BernhardT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hölscher (Gast)
Datum:

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

Christian Hölscher

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Sehr Wahrscheinlich geht der mit dem Quarz gar nicht.

Schau dir den Code mal an.

http://electronicsculpture.brucecannon.org/technic...


MFG
Dieter

Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: BernhardT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Leseroutine hinkt, nicht der Quarz.

Josef

Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hölscher (Gast)
Datum:

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

MFG
Christian

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hölscher (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super Danke.. Ich habe mich schon ein wenig gewundert warum das auch
ohne Funktioniert.

Mit freundlichen Grüßen
Christian

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.