Brauche Hilfe bei I2C mit RTC

OP #1066894
Lesenswert?

Hallo,

ich habe eine Problem. Und zwar habe ich gerade ein kleines Testprogramm 
geschrieben, damit ich mit einem RTC (ds1340) über I2C eine Verbindung 
aufbaue. Ich benutze dazu einen atmega32 uC. Das Problem ist nun, dass 
sich überhaupt nichts tut, also sprich TWSR (Status Register) ist 0xFF 
und verändert sich nicht (sollte ja nach einem Start Signal 0x08 
werden). Jemand eine Idee, was ich da machen könnte? Bzw. wie ich den 
Fehler suchen kann?

Hier nur kurz der betroffene Codeabschnitt (ganzer Code liegt als Anlage 
bei):

         // Sende START Signal
  TWCR = (1 << TWINT) | (1<<TWSTA) | (1<<TWEN);

  // Warte bis TWINT gesetzt ist (also START gesendet)
  while(!(TWCR & (1<<TWINT)));

  // Status Register richten Status? Ansonsten ERROR
  if((TWSR & 0xF8) != TW_START)
  {
    ERROR();
  }

Mein problem ist, dass ich immer sofort in der ERROR Routine lande, wenn 
ich mir TWSR ausgeben lassen, ist es 0xFF. Wenn ich TWCR ausgebe, ist es 
1000000. Das bedeutet aber, dass ja TWEn nicht gesetzt ist, also TWI 
nicht eingeschaltet ist, obwohl ich es ja oben einschalte???
Bin wirklich gerade total verwirrt, bin über jede Hilfe wirklich 
dankbar!
OP #1066970
Lesenswert?

device Addresse ist 1101000 und dann habe ich oben SLA_W mit 0b11010000 
definiert. Also 0 am Ende für Writte Mode. Aber ich habe ersteinmal nur 
ein START Signal auf die Leitung gelegt, ohne noch irgendwohin etwas 
addressiert zu haben. Die Addresse würde ich erst nach der IF Anweisung 
wegschicken, aber soweit komme ich ja gar nicht.
Mein Status in TWSR ist 0b111111 also 31 dezemal. Im Datenblatt vom 
atmega32 stehen aber nur die Statuscodes von 8, 10, 18, 20, 28, 30 und 
38. Also keine Ahnung was 31 bedeutet.. (da aber alles auf 1 ist, denke 
ich einmal, dass einfach nichts verändert wurde.)
OP #1067014
Lesenswert?

Ok habe es schonmal so weit, dass ich weiß, welcher Statuscode kommt:

Statuscode: $F8

No relevant state information
available; TWINT = “0”

Next Action Taken by TWI Hardware: Wait or proceed current transfer


Das bedeutet doch, dass er gerade noch einen Job fertig machen muss, 
aber ich habe doch vorher überprüft, ob er schon fertig ist? Und dort 
war er schon fertig...... Hat wirklich niemand eine Ahnung, was ich 
gerade falsch mache?
OP #1067039
Lesenswert?

Hab 2 mal 1,5k als Pullup und keinen Abblockkondensator.
Aber kann das an der HW liegen?

Beim Fehlercode steht, dass er nicht lesen kann, weil TWINT = 0 ist. 
Wenn ich aber direkt über der IF Anweisung TWINT auslese, steht dort 1 
und wenn ich direkt danach abfrage steht dort auch 1....
OP #1067101
Lesenswert?

Mein Lehrer meinte, dass das nicht an HW liegen kann, da bis jetzt alles 
erst auf atmega32 Seite ist. (Hab jetzt auch leider die Widerstände 
nicht per Hand, deshalb kann ich das auch nicht testen) Hab jetzt statt 
mit meinem Programm zu testen die Lib von Fleury genommen und da hat es 
genausowenig funktioniert. Habe dort ebenfalls den Status kurz vor der 
IF Anweisung abgegriffen und dort habe ich den Status A0 bekommen! Der 
Fehlercode steht in der Tabelle für "Status Codes for Slave Receiver 
Mode" Also der Mikrocontroller als Slave? Keine Ahnung warum der 
Mikrocontroller als Slave arbeitet.... der sollte doch eigentlich Master 
sein?
Hab in meinem eigenen Programm auch die erste IF Anweisung 
auskommentiert und dann das Programm weiter durchlaufen lassen 
(übertragung von SLA+W und warten bis TWINT gesetzt ist) Danach wieder 
den Status ausgelesen, da bekam ich den Statuscode 80 raus und der liegt 
auch in der Tabelle, wo der Mikrocontroller als Slave arbeitet.... Warum 
und wie kann es bitte sein, dass mein Mikrocontroller als Slave 
arbeiten? Normalerweiße hätte da ein anderer uC ein Start Signal 
schicken müssen, damit ich als Slave arbeite oder?
#1067319
Lesenswert?

Schreibe erst einmal die Routinen für i2c. Du kannst Dich an der Fleury 
Lib orientieren.

Dann die Routinen für den Zugriff auf die RTC.

Zum Schluss ein main.c mit dem Hauptprogramm.

\offtopic on
Wie lernt man heute eigentlich programmieren ?? (kopfschüttel)
\offtopic off

Wenn die Fleury Lib nicht funktioniert, dann ist es die Hardware. Den 
Kommentar vom Lehrer verstehe ich übrigens nicht.
Gast #1067370
Lesenswert?

Mir ist schon klar, dass das nicht wirklich schön geschrieben ist, es 
sollte ja auch nur kurz zum testen sein....

Und was verstehst du am Kommentar vom Lehrer nicht? Im Prinzip kann ich 
ja SDA und SCL frei lassen und nicht mit dem RTC connecten, dann müsste 
ja trotzdem in TWSR zumindest der Status stehen, dass Start gesendet 
wurde (zu diesem Zeitpunkt muss ja der RTC noch nichts gesendet haben). 
Also sprich, wenn hier ein Fehler auftritt, hat das nichts mit HW zu 
tun.
Gast #1069871
Lesenswert?

Hey Leute ich habe auch ein kleines Problem mit einer I2C Schnittstelle.

Muss jetzt so eine I2C Schnittstelle programmieren für eine 
kommunikation zwischen dem ATMEGA8 und dem AD774. Die Schnittstelle soll 
befehle an AD7747 senden können und Dateien empfangen. Kann mir jemand 
sagen wie ich mein Programm erweitern soll dass es funktioniert und wie 
ich es testen könnte??

Ich danke schon im voraus.
Angehängte Dateien:

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