ATMEGA 128, RTC DS1307, I2C-Bus Problem

OP (Firma: keine) #1700596
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;
}
Gast #1710109
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren