Forum: Mikrocontroller und Digitale Elektronik I2C Uhr zeigt I2c Error!


von Alexander K. (bandit1200)


Angehängte Dateien:

Lesenswert?

hallo Leute.

Ich arbeite getrade an einer LCD I2C uhr.
Habe jetzt den Code fertig und nun sagt mir meine LCD i2c uhr i2c error! 
anstelle der uhrzeit.

schätze , dass irgendwo an der Stelle es nicht weiter geht.

  if ( ret )
  {
        //wenn bei I2C ein Fehler auftritt: Meldung Error an LCD
       i2c_stop();

       lcd_string("I2C Error!!");

    }
  else

habe einen DS1307 an 0x68 adressiert..
wo könnte der Fehler liegen?
Wer kann mir helfen???

von Stephan W. (sir_wedeck)


Lesenswert?

Hi,
1
#define DS1307  0x68       // Adresse des DS1307 ist 0x68

nimm mal dies:
1
#define DS1307  0xD0       // Adresse des DS1307 ist 0x68 * 2

Deine I2C-Lib will nicht die Adresse deines Chips sondern das 
Commandbyte haben!

Stephan

von Alexander K. (bandit1200)


Lesenswert?

Stephan W. schrieb:
> Hi,
>
1
> #define DS1307  0x68       // Adresse des DS1307 ist 0x68
2
>
>
> nimm mal dies:
>
>
1
> #define DS1307  0xD0       // Adresse des DS1307 ist 0x68 * 2
2
>
>
> Deine I2C-Lib will nicht die Adresse deines Chips sondern das
> Commandbyte haben!
>
> Stephan

Danke Stephan.
Diese Änderung führte leider nicht zum Erfolg..
Lcd Meldet immer noch I2C Error!!
Icha habe einen Atmega 8 und den DS 1307 an PC4 SCA(mega) ->Pin 5(DS)
                                            PC5 SCL(mega) ->Pin 6(DS)

von Alexander K. (bandit1200)


Angehängte Dateien:

Lesenswert?

habe hier nochmal den Schaltplan im Anhang..

von Stephan W. (sir_wedeck)


Lesenswert?

hmmm.....
kannst du sagen wo in der Start-Funktion der Fehler kommt?
Wie sieht das Statusregister aus?

Also langsam fange ich an die Lib zu "hassen", alle paar Tage kommt 
einer und hat damit Probleme!!!

Der Anschluss scheint i.O. das ist gut, das mit der Adresse haste 
verstanden?

Stephan

von Jens G. (jensig)


Lesenswert?

Vor dem IF block muß doch irgendwas sein, was die Variable ret setzt. 
Dort musste mal schauen, was das Programm dort macht, bzw. welche 
Bedingung zum Setzen von ret führt.

von Alexander K. (bandit1200)


Lesenswert?

Stephan W. schrieb:
> Der Anschluss scheint i.O. das ist gut, das mit der Adresse haste
> verstanden?

Ganz verstanden habe ich es nicht, da in dem Tutorial die festgelegte 
Adresse 0x68 steht, aber ich
habe deinen Vorschlag in mein programm kopiert, es hat sich nichts 
geändert.

der fehler kommt direkt nach der Übertragung des Programms.
Es ist doch irgendwo in der main vor der while schleife..
Ich bin relativ frisch in diesem Milleau.

Jens G. schrieb:
> Vor dem IF block muß doch irgendwas sein, was die Variable ret setzt.
> Dort musste mal schauen, was das Programm dort macht, bzw. welche
> Bedingung zum Setzen von ret führt.
>
>

hier fängt es an und dort wird auch die Var gesetzt.


unsigned char ret;
i2c_init();                                // I2C initialisieren
  lcd_init();                  // LCD initialisieren

  lcd_clear();



    ret = i2c_start(DS1307+I2C_WRITE);        // set device address and 
write mode
    _delay_ms(50);                // sicherheitshalber warten
  if ( ret )
  {
        //wenn bei I2C ein Fehler auftritt: Meldung Error an LCD
       i2c_stop();

       lcd_string("I2C Error!!");

ich versuche gleich nochmal den ds 1307 auszutauschen. Ich habe den 
verdacht, dass ich den Baustein beim Löten dringelassen hatte als sich 
eine leiterbahn gelöst hatte.

von Stephan W. (sir_wedeck)


Lesenswert?

Alexander Kr schrieb:
> Ganz verstanden habe ich es nicht, da in dem Tutorial die festgelegte
> Adresse 0x68 steht,

Dann schau dir mal im DB die Bilder 4 und 5 auf der Seite 12 an.
Dort siehst du wie das 1. Byte aufgebaut ist, dann vergleiche das mit 
deinem Code.

Die Adresse deines I2C-Baustein stimmt! (0x68 ist richtig, steht ja im 
DB)

Welches Tutorial meinst du?

>ret = i2c_start(DS1307+I2C_WRITE);
Du musst festellen welche 1 in ret landet!!!
Und WIE das Statusregister vom TWI aussieht!!!

Sonst kann ich dir nicht weiter Helfen.

Stephan

von Alexander K. (bandit1200)


Lesenswert?

Stephan W. schrieb:
> Welches Tutorial meinst du?

http://www.mikrocontroller.net/articles/AVR_TWI

diese meine ich.

Stephan W. schrieb:
>>ret = i2c_start(DS1307+I2C_WRITE);
> Du musst festellen welche 1 in ret landet!!!
> Und WIE das Statusregister vom TWI aussieht!!!

ist das aus dem Datenblatt ersichtlich?? oder kann ich das irgendwie 
anders auslesen???
Das ist mein erstes Projekt mit dem TWI.

Eine Frage ergibt sich da.
Ich habe einen 0,032768 MHz Quarz am DS1307 und die frequenz in meinem 
Pojekt ist:
/* I2C clock in Hz */
#define SCL_CLOCK  100000L
müsste vllt. auf #define SCL_CLOCK 32768000???

von morph1 (Gast)


Lesenswert?

hast du überhaupt pull-ups an den leitungen?

von Alexander K. (bandit1200)


Lesenswert?

morph1 schrieb:
> hast du überhaupt pull-ups an den leitungen?

ja, die habe ich. Siehe Schaltplan

von Stephan W. (sir_wedeck)


Lesenswert?

Alexander Kr schrieb:
> Ich habe einen 0,032768 MHz Quarz am DS1307 und die frequenz in meinem
> Pojekt ist:
> /* I2C clock in Hz */
> #define SCL_CLOCK  100000L
> müsste vllt. auf #define SCL_CLOCK 32768000???
NEIN, das ist schon so richtig!!!!

Alexander Kr schrieb:
> ist das aus dem Datenblatt ersichtlich?? oder kann ich das irgendwie
> anders auslesen???
Du hast eine Lib für den I2C, dort gibt es die Funktion: i2c_start()
Diese Funktion gibt bei einem Fehler 1 zurück, dies aber an 2 Stellen.
Du sollst bitte heraus bekommen an welche Stelle er die Funktion 
verlässt.

Was für ein Quarz ist an deinem MC dran? Welchen MC benutzt du?

Stephan

von Alexander K. (bandit1200)


Lesenswert?

Stephan W. schrieb:
> Was für ein Quarz ist an deinem MC dran? Welchen MC benutzt du?

Ich habe einen ATmega 8 ohne externen Quarz

Stephan W. schrieb:
> Du hast eine Lib für den I2C, dort gibt es die Funktion: i2c_start()
> Diese Funktion gibt bei einem Fehler 1 zurück, dies aber an 2 Stellen.
> Du sollst bitte heraus bekommen an welche Stelle er die Funktion
> verlässt.

Im einzelschrittdebugger Verschwindet der gelber Zeiger komplett bei
ret = i2c_start(DS1307+I2C_WRITE);

Habe gerade auch den Fehler eines kapputen Bausteins ausgeschlossen.

von Alexander K. (bandit1200)


Lesenswert?

Ich habe gerade eine Korrektur am board durchgeführt:
Der DS1307 hatte keinen vernünftigen Kontakt im Sockel...
Jetzt ist der Fehler weg aber die uhrzeit wird in Hyroglyphen angezeigt

von Alexander K. (bandit1200)


Lesenswert?

Alexander Kr schrieb:
> Jetzt ist der Fehler weg aber die uhrzeit wird in Hyroglyphen angezeigt

Der Text TEST wird angezeigt, die UHrezit aber in Hyroglyphen :((
Habe ich Falsche timing?? Habe meinen ATMega 8 auf 4mhz eingestellt.

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.