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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.