Forum: Compiler & IDEs RTC DS1307 I2C Peter Fleury Lib 8Mhz/16Mhz


von Nookie N. (nook)


Lesenswert?

Hallo,

ich sitze seit Tagen an diesem Problem.

Ich habe einen DS1307 über I2C an einem Atmega128.

Sobald ich den externen Quarz mit 16Mhz einstelle funktioniert das 
Ansprechen der Uhr nicht mehr. Wenn ich den internen 8Mhz Quarz benutze 
läuft alles super.

Der I2C soll wie im Datenblatt mit 100KHz laufen.

Die Taktrate ist auch im Pogramm definiert F_CPU 16000000UL

Ich habe extra die oft benutzte Peter Fleury Lib eingearbeitet und diese 
macht die gleichen Probleme wie meine vorherige Variante.

Sobald ich alles auf 8Mhz stelle läuft die Uhr. Ich habe auch noch eine 
RS232 Verbindung zum PC diese läuft mit beiden Taktraten.

Der DS1307 hat auch seine Pullups (fertige Platine aus I-Net).

Irgendwo ist der Fehler versteckt!

Gruß Nook

von Timmo H. (masterfx)


Lesenswert?

Sicher, dass F_CPU auch "richtig" definiert ist? Denn in der TWI-Master 
wird es ggf. nochmal auf 8MHz definiert
1
/* define CPU frequency in Mhz here if not defined in Makefile */
2
#ifndef F_CPU
3
#define F_CPU 8000000UL
4
#endif
Setze ggf. mal SCL_CLOCK auf die halbe Geschwindigkeit.
Du hast nicht zufällig CKDIV8 an? Dann würde der AVR beim internen Quarz 
real mit 1 MHz laufen, wohingegen mit gesetztem CKDIV8 und externem 
16MHz der AVR mit 2MHz laufen würde.

Welchen du AVR du verwendet hast sowie jeglichen Quellcode hast du uns 
ja dummerweise verschwiegen.

von Nookie N. (nook)


Lesenswert?

ja, dort hatte ich auch die 16mhz eingestellt.
ich hab eben mal 50KhZ ausprobiert. geht leider auch nicht.

von Timmo H. (masterfx)


Lesenswert?

Wie siehts mit CKDIV8 aus? Und wo bleibt der Quellcode? Wie groß sind 
deine Pullups an SDA und SCL? Erzähl bloß nicht zu viel!

von Nookie N. (nook)


Lesenswert?

ohh was ist CKDIV8 ????

quellcode kann ich erst wieder morgen schicken.

Pullups 3.3K.

Den RTC habe ich:
http://www.ebay.de/itm/I2C-RTC-DS1307-AT24C32-Real-Time-Clock-Realtime-Module-Batterie-for-AVR-ARM-PIC-/320854497094?pt=Bauteile&hash=item4ab46b1746

von Timmo H. (masterfx)


Lesenswert?

CKDIV8 ist ein Fusebit (hat nicht jeder AVR, aber die neueren wie 
ATmega88). Standardmäßig ist CKDIV8 immer an. Aber ich glaube der 
Atmega128 hat kein CKDIV8 (sorry hatte erst überlesen dass du den 128er 
hast)

von Nookie N. (nook)


Lesenswert?

ich glaub es sind die Pullups. 3.3Kohm ist wohl zu wenig.

laut diversen Foren sollte diese 10K seien. Es hatten wohl einige auch 
Probleme mit 4.7K.

dies kann ich haber leider erst morgen testen.

von Timmo H. (masterfx)


Lesenswert?

3.3k ist voll OK. Je schneller du übertragen willst um so kleiner muss 
er sein. 4,7k sind so quasi standard für 100khz. Bei 400khz sollte man 
langsam kleinere nehmen aber das kann der 1307 eh nicht.
Bis 3mA darf man machen, bei 5V also ~1,7k

von Peter D. (peda)


Lesenswert?

Timmo H. schrieb:
> /* define CPU frequency in Mhz here if not defined in Makefile */
> #ifndef F_CPU
> #define F_CPU 8000000UL
> #endif

Sowas ist natürlich großer Mist.
Da darf man sich über Fehlfunktion nicht aufregen.

Wennschon, dann nur so:
1
#ifndef F_CPU
2
#error Fatal Error, F_CPU unknown !!!
3
#endif

Such mal im gesamten Quellcode (*.c, *.h) nach "F_CPU", ob da irgendwo 
son Mist auftaucht und lösche ihn umgehend.

von Karl H. (kbuchegg)


Lesenswert?

Welche Version der I2C Routinen vom P.Fleury hast du genommen?
Die Assembler Version oder die C-Version?

In der Assembler-Version ist die Realisierung des Timings ... nicht so 
toll. Da muss man eingreifen, denn es sieht nicht so aus, als ob Peter 
da eine automatische Anpassung vorgesehen hat.

Die C-Version sollte allerdings ok sein, solange F_CPU auch korrekt 
gesetzt ist.
Sicherheitshalber würde ich mal bei

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

den #ifndef Kram weglassen, nicht dass dir ein im Makefile angegebener 
Wert da einen Strich durch die Rechnung macht und der Code gar nicht mit 
16Mhz rechnet. Früher hat man das gerne mit dem #ifndef gemacht. Aber im 
Laufe der Zeit hat sich herausgestellt, dass das gar nicht so schlau 
ist. Wenn F_CPU nicht gesetzt ist, dann ist das als Fehler zu betrachten 
und nicht als Aufforderung einen Default-Wert zu benutzen.


Edit: PeDa war schneller

von Nookie N. (nook)


Lesenswert?

@Peter Dannegger:

ich habe nur selbst in der Hauptdatei F_CPU. Aber auch testweise in die 
twimaster reingeschrieben.

in der makefile sollte es nicht stehen, oder macht AtmelStudio, dass von 
selbst? Beim AVR Studio musste man es extra angeben.

ich benutze die C Version die aktuelle gestern von der Webseite geladen 
und eingespielt. zudem habe ich die abläufe mit meiner version aus dem 
großen internet verglichen.

von Karl H. (kbuchegg)


Lesenswert?

Nookie Nook schrieb:

> in der makefile sollte es nicht stehen,

doch.
Eigentlich sollte es genau dort, und nur dort stehen.
Denn nur so ist defnitiv sicher gestellt, dass alle C-Files auch 
tatsächlich immer mit dem gleichen Wert für F_CPU rechnen.


> und eingespielt. zudem habe ich die abläufe mit meiner version aus dem
> großen internet verglichen.

Alles schön und gut.
Aber wenn dein Programm mit einer realen Taktfequenz von 8Mhz und einer 
Einstellung for F_CPU von 8000000 funktioniert und du dann den µC auf 
16Mhz umfused und als Ausgleich dafür den F_CPU auf 16000000 setzt, dann 
muss (wenn alles richtig programmiert ist), wieder das gleiche 
Zeitverhalten herauskommen. Und dein Problem dürfte ein Timingproblem 
sein. Irgendwas ist zu schnell. Und das kann wiederrum nur sein, wenn 
irgendwo irgendwelche Warteschleifen oder Timereinstellungen nicht 
korrekt von F_CPU abhängig gemacht wurden, bzw. wenn Portpins zu schnell 
hintereinander (ohne Wartezeit dazwischen) gesetzt oder gelöscht werden.

von Nookie N. (nook)


Lesenswert?

FUNKTIONIERT!

Icd hab die 3.3K Widerstände mit 10K ersetzt!

Danke für eure Mühe!

von holger (Gast)


Lesenswert?

>FUNKTIONIERT!
>
>Icd hab die 3.3K Widerstände mit 10K ersetzt!

Lächerlich, das muss auch mit 3k3 funktionieren.
Genau genommen sogar besser weil die Flanken steiler werden.
Nimm mal deine 3k3 und miss mal nach ob das nicht 330 oder 33 waren.

von holger (Gast)


Lesenswert?

>Nimm mal deine 3k3 und miss mal nach ob das nicht 330 oder 33 waren.

Oder 33k, 330k.

von Peter D. (peda)


Lesenswert?

Nookie Nook schrieb:
> FUNKTIONIERT!
>
> Icd hab die 3.3K Widerstände mit 10K ersetzt!

Das beweist nur, daß ein Timingfehler vorliegt.
Anstatt den Fehler zu beheben, verlangsamst Du die 
Anstiegsgeschwindigkeit durch einen größeren Pullup.

Dein Verhalten entspricht etwa folgendem:
Du fährst 60 und kommst in eine 30-Zone. Anstatt nun den Gang runter zu 
schalten, ziehst Du die Handbremse an.

Das eine ist nicht gut für Dein Auto, das andere ist nicht gut für die 
Zuverläsigkeit Deines Programms.

Man sollte daher immer die Ursache beseitigen und nicht die Wirkung 
bekämpfen.


Peter

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.