Forum: Mikrocontroller und Digitale Elektronik Brauche Hilfe bei I2C mit RTC


von Rene M. (gozu)


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!

von Rene M. (gozu)


Angehängte Dateien:

Lesenswert?

Sorry, hab vergessen die Datei anzuhängen

von ... .. (docean) Benutzerseite


Lesenswert?

ich verwende immer die lib von:

http://homepage.hispeed.ch/peterfleury/avr-software.html#libs

Kannst die ja mal den Code runterladen und reingucken...

von Rene M. (gozu)


Lesenswert?

Hab die Lib auch und genauso wie dort alles genau so.. und auch genauso 
wie im Datenblatt.

Aja hab mich vorher verschrieben, das TWEN ist doch eins.... Trotzdem 
funktioniert nichts.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Und mit welcher Adresse sprichst Du das device an?

von Rene M. (gozu)


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.)

von Rene M. (gozu)


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?

von Pete K. (pete77)


Lesenswert?

Wie sieht der HW-Aufbau aus ? Sind 4k7 oder 10k Pullups vorhanden ?
Abblockkondensatoren ?

von Rene M. (gozu)


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....

von Pete K. (pete77)


Lesenswert?

Versuch es mal mit 100nF Abblockkondensatoren am µC und an der RTC sowie 
mind. 4k7 als Pullups an SDA und SCL.

Die Fleury Lib hat bei mir nie Probleme gemacht...

von Rene M. (gozu)


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?

von ... .. (docean) Benutzerseite


Lesenswert?

poste mal deine ganze main routine.. oder strick eine zum testen...

Alles andere ist stochern im Nebel..

von GoZu (Gast)


Lesenswert?

In meinem zweiten post habe ich die Datei RTC.rar angehängt, da sind 
alle Daten drinnen.

von Pete K. (pete77)


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.

von GoZu (Gast)


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.

von Guest23421 (Gast)


Angehängte Dateien:

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.

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.