Forum: Mikrocontroller und Digitale Elektronik I2C Problem mit DS1307 Modul


von mar-io (Gast)


Lesenswert?

Hallo Leute...

Ich suche zwar schon fleissig einen Fehler, aber da er sich so 
systematisch äussert dachte ich mir das ich direkt mal hier danach 
frage:

Ursprünglich wollte ich in meinem Projekt ein Standard DS1307 TinyRTC 
Modul aus der Bucht benutzen.
Eingebunden habe ich die RTC Lib aus "Kalles Blog" 
(http://www.pgollor.de/cms/?page_id=764) sowie die I2C Lib von Peter 
Fleury.

Doch es hakelte und wollte nicht so recht, was ich anfangs auf meine 
sehr hochfrequente Timer ISR geschoben habe... Doch in einem neuen, 
leeren Projekt wo ich nur die rtc und i2c libs eingebunden habe will 
der I2C Bus auch nicht so richtig.

Soll heissen das Modul arbeitet (im leeren Projekt) etwa jedes 3. mal - 
und im vollen Projekt ca jedes 8. mal einwandfrei.
Ansonsten bleibt mein Controller in der rtc_init() hängen
(SCL bleibt auf High und SDA auf Low).

Verrückt ist nur das wenn ich merke das es nur nach zB. 8 Warmstarts 
funktioniert, das es dann immer nach jedem 8. Start klappt.
Und wenn es dann klappt dann kann ich stundenlang mit rtc_read() darauf 
zugreifen. Aber wehe die Spannung geht weg oder ich provoziere per ISP 
nen Reset, dann darf ich wieder 7x manuell Reset drücken bis die beiden 
sich wieder verstehen.

Aufgebaut habe ich momentan einen ATmega8 (8MHz intern) und das RTC 
Modul im Breadboard mit 6,8k Pullups am AVR. Geändert habe ich in den 
Libs bis auf die Frequenzen (F_CPU und F_SCL von 10kHz - 100kHz ) 
nichts. Und das verhalten ist an einem anderen TinyRTC Modul exakt das 
gleiche.

Weiss jemand wo ich da zuerst schauen könnte / sollte ?
So viel kann ich mit den paar Zeilen und den zwei Adern zur RTC doch 
garnicht verkehrt machen ?
Ein Oszi für Busbilder wäre vorhanden, hänge mich gleich mal dran.

Grüße

Mario
1
#include <stdlib.h>
2
#include <stdio.h>
3
#include <stdint.h>
4
#include <avr/io.h>
5
#include "rtc.h"
6
#include "i2cmaster.h"
7
8
int main(void)
9
{
10
  
11
DDRC = 0x30;            // PC0-3 als Eingang, PC4-5 (I2C) als Ausgang
12
PORTC = 0x3F;           // Pullups f. Eingänge und I2C AN
13
  
14
DDRB = 0xFF;            // PB 0-7 als Ausgang
15
PORTB = 0x00;           // Alle LEDs aus
16
  
17
i2c_init();
18
rtc_init();
19
  
20
PORTB |= (1<<PB1);      // LED an = RTC Modul ist diesmal einsatzbereit
21
  
22
while(1)
23
 {
24
       
25
 } //endwhile
26
27
} //endmain

: Bearbeitet durch User
von Bernhard S. (dl9rdw)


Lesenswert?

Mit Busbildern tut man sich leichter. Mit Stromlaufplan ebenso.
An die beiden Pullups hast Du vermutlich gedacht.

Grüße

Bernhard

von dummy (Gast)


Lesenswert?

>So viel kann ich mit den paar Zeilen und den zwei Adern zur RTC doch
>garnicht verkehrt machen ?

Ich zähle drei Adern mit GND.

von mar-io (Gast)


Angehängte Dateien:

Lesenswert?

Vcc und Gnd habe ich jetzt mal aussen vor gelassen, wer da was falsch 
macht ist hier glaube ich verkehrt ;-)

Anbei mal zwei Schnappschüsse (wobei ich mich grade frage ob dort die 
i2c_init oder die rtc_init abgebildet ist... Aber da man auf der SDA 
Leitung schön die Adresse des DS1307 + RW Bit also 0xD1 sehen kann denke 
ich mal es ist die rtc_init)

Schaltplan folgt, aber ausser drei Tastern nach Masse, ner LED + Rv an 
nem Port, ISP und I2C Leitungen inkl. Pullups (3-6 kOhm schon probiert) 
und dem RTC Modul selbst is nichts mehr auf dem Breadboard vorhanden.

Grüße

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

mar-io schrieb:
> Ansonsten bleibt mein Controller in der rtc_init() hängen
> (SCL bleibt auf High und SDA auf Low).
 Meiner Meinung nach ist RTC-Library Blödsinn.
1
  i2c_stop();
2
  rtc_write_ram(0x07, 0b00010000);
3
  rtc_enable(1);
4
  rtc_read();
 Es wird zuerst geschrieben und dann RTC enabled.

 DaBla DS1307:
 Illogical time and date entries result in undefined operation.
 Bit 7 of Register 0 is the clock halt (CH) bit. When this bit is set
 to 1, the oscillator is disabled. When cleared to 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.

mar-io schrieb:
> Verrückt ist nur das wenn ich merke das es nur nach zB. 8 Warmstarts
> funktioniert, das es dann immer nach jedem 8. Start klappt.

 Weil ein Byte 8 bits hat ?

: Bearbeitet durch User
von mar-io (Gast)


Lesenswert?

Soo, Danke an alle!
Das mit dem 8 Zyklen war ein Beispiel... Hatte auch erst an ein 
Rgeisterbyte gedacht aber mal war es der 8. mal der 10. und mal jeder 2. 
Start...

" Meiner Meinung nach ist RTC-Library Blödsinn. "

Diesen Satz kann ich so unterschreiben, auch wenn ich ihn in " Meiner 
Meinung nach ist diese RTC-Library Blödsinn.  " umändern muss...

Eine andere Lib, und zwar die von Davide Gironi 
(http://davidegironi.blogspot.de/2013/12/a-ds1307-library-for-avr-atmega.html#.VDkBYhYtzxI 
) hat jetzt auf Anhieb funktioniert.

Ich bin leider so ein Mensch der meist eine funktionierende Vorlage 
braucht um sie dann zu auseinander nehmen und verstehen zu können :)

Grüße

Mar-IO

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

mar-io schrieb:
> " Meiner Meinung nach ist RTC-Library Blödsinn. "
>
> Diesen Satz kann ich so unterschreiben, auch wenn ich ihn in " Meiner
> Meinung nach ist diese RTC-Library Blödsinn.  " umändern muss...

 Hmmm.
 Genau das habe ich auch gemeint.
 Natürlich ist nicht jede RTC-Library Blödsinn.

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.