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


von Andreas S. (Firma: keine) (ovoron)


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;
}

von B. Spitzer (Gast)


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

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.