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; }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.