RTC DS1307 I2C Peter Fleury Lib 8Mhz/16Mhz

#3010953
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
#3011384
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.
#3012051
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.
#3012067
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
#3012319
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.
#3013573
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.
#3014744
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

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