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!
ich verwende immer die lib von: http://homepage.hispeed.ch/peterfleury/avr-software.html#libs Kannst die ja mal den Code runterladen und reingucken...
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.
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.)
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?
Wie sieht der HW-Aufbau aus ? Sind 4k7 oder 10k Pullups vorhanden ? Abblockkondensatoren ?
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....
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...
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?
poste mal deine ganze main routine.. oder strick eine zum testen... Alles andere ist stochern im Nebel..
In meinem zweiten post habe ich die Datei RTC.rar angehängt, da sind alle Daten drinnen.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.