mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA 128, RTC DS1307, I2C-Bus Problem


Autor: Andreas S. (Firma: keine) (ovoron)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche nun seit zwei Tagen die RTC DS1307 via I2C auszulesen.
µC: Atmega128
AVRLIB: Procyon

Ein Display habe ich an einen PCA9555 angeschlossen das auch via I2C 
angesteuert wird.
Das Display funktioniert einwandfrei.

Das Problem besteht darin, dass wenn ich die Daten der RTC einmal 
ausgelesen habe, arbeitet die Uhr anscheinend nicht weiter.
Beziehungsweise ich empfange immer die selben Daten beim auslesen.

Eine Batterie ist angeschlossen und die Busgeschwindigkeit ist 80kHz.
Ich habe zahlreiche Beispiele schon ausprobiert und komme an dieser 
stelle nicht weiter.
Habt Ihr noch einen Tipp ?
Kann es an den Pull-Up Widerständen liegen ?

MfG

Ovoron


Hier mein Source-Code
//----- Include Files 
---------------------------------------------------------
#include <avr/io.h>      // include I/O definitions (port names, pin 
names, etc)
#include <avr/interrupt.h>  // include interrupt support
//#include <avr/signal.h>  // include "signal" names (interrupt names)

#include "lcd.h"

#include "lcdconf.h"

#include "global.h"
#include "timer.h"
#include "rprintf.h"
#include "uart.h"

#include "i2c.h"

#define ADDR              0xd0
#define BUFFSIZE          0x08

//----- Begin Code 
------------------------------------------------------------

int main(void)
{
  uartInit();
  rprintfInit(uartSendByte);
  timerInit();
  timerPause(50);    // waits 50 milliseconds
  char Sekunden;

  // Wait for a moment to allow hardware to stabilize.
  // This may be important if a serial port level-converter
  // like the MAX232 is used.  Charge-pump based converters
  // need some time after power-up to charge before
  // communication is reliable.
  timerPause(50);    // waits 50 milliseconds

  lcdInit();
  //bei der Initialisierung wird auch der I2C initialisiert
  // direct printf output to LCD
  rprintfInit(lcdDataWrite);

  lcdClear();
  lcdHome();

  rprintf("Hello_World");

  //i2cInit();
  timerPause(1000);

  do
  {
    volatile u08 i = 0;
    volatile u08 databuffer;
    volatile u08 readbuffer[BUFFSIZE];

    rprintfCRLF();

    for (i = 0; i < BUFFSIZE; i++)
    {
      readbuffer[i] = 0;
    }

    databuffer = 0; // reset the DS1307s registers
    i2cMasterSend(ADDR, 0x01, &databuffer);

    i2cMasterReceive(ADDR, BUFFSIZE, readbuffer);

    for (i = 0; i < BUFFSIZE; i++)
    {
  //    rprintfu08(readbuffer[i]);

      rprintfChar('.');

    }

    //rprintfCRLF();

    timerPause(1000);

    Sekunden = readbuffer[1];
    Sekunden = ((Sekunden  & 0x0f) | 0x30);
    lcdGotoXY(8, 2);
    rprintf("sek:%d", Sekunden);

    timerPause(1000);

    lcdHome();
  }
  while (1);
  return 0;
}

Autor: B. Spitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nach Power-On muss das Clock-Halt-Bit gelöscht werden, weil der 
Reset-Zustand nicht definiert ist:
"Bit 7 of Register 0 is the Clock Halt (CH) bit.  When this bit is set 
to a 1, the oscillator is disabled.  When cleared to a 0, the oscillator 
is enabled.
Please note that the initial power on state of all registers is not 
defined.  Therefore it is important to enable the oscillator (CH bit=0) 
during initial configuration."

Also zunächst einmal die Sekunden lesen, dann Bit 7 löschen und den Wert 
wieder reinschreiben.

unn tschuess
Bernhard

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.