www.mikrocontroller.net

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


Autor: Rene Mayer (gozu)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rene Mayer (gozu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hab vergessen die Datei anzuhängen

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich verwende immer die lib von:

http://homepage.hispeed.ch/peterfleury/avr-softwar...

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

Autor: Rene Mayer (gozu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und mit welcher Adresse sprichst Du das device an?

Autor: Rene Mayer (gozu)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Rene Mayer (gozu)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Pete K. (pete77)
Datum:

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

Autor: Rene Mayer (gozu)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rene Mayer (gozu)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
poste mal deine ganze main routine.. oder strick eine zum testen...

Alles andere ist stochern im Nebel..

Autor: GoZu (Gast)
Datum:

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

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: GoZu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Guest23421 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.