Hallo zusammen, ich habe die Aufgabe bekommen ein Programm zu schreiben, welches Daten in einem I2C EEPROM (M24256) speichert und auch wieder auslesen kann. Zu erwähnen wäre evtl., dass ich in der Richtung noch nie etwas gemacht habe. Nun stehe ich vor dem Problem, dass ich geschriebene Werte nur am Oszi wieder auslesen kann. Die zum Master gesendeten Bits werden bei einem Pulldown nie genau auf logisch 0 gezogen. So gibt mir mein Programm immer 255 aus. Das ganze sieht dann wie im Anhang aus (auslesen vom dez. Wert 17 mit anschließendem NOACK und Stop Condition). Nun stellt sich mir die Frage: Warum? Kann dies am Pulldown/-up Widerstand liegen (zu klein)? Oder gibt es evtl. noch andere Fehlerquellen? Bin am verzweifeln... Gruß Talisca
Talisca schrieb: > Die zum Master gesendeten Bits werden bei einem > Pulldown nie genau auf logisch 0 gezogen. Was meinst du mit "logisch 0" und was mit "genau"? Digitalsignale gelten im allgemeinen als Low oder logisch 0, wenn sie unterhalb einer gewissen Schwelle sind. Bei TTL Pegeln ist das ca. 0,8V, bei CMOS Pegeln typisch 1/3 Vcc. MfG Klaus
Wäre besser, wenn die beiden Traces nicht überlappen. So sieht man nur sehr schwer was du meinst. Da liegt vermutlich ein Fehler in der Beschaltung, sieht aus als ob zwischen dem Pullup auf Vcc und dem Datenpin des EEProms noch ein zu grosser Widerstand in Serie ist.
Talisca schrieb: > Kann dies am Pulldown/-up Widerstand liegen (zu klein)? I2C kennt nur Pullup-Widerstände... Wie sieht die Beschaltung zwischen uC und EEPROM aus? > Nun stehe ich vor dem Problem, dass ich geschriebene Werte nur am Oszi > wieder auslesen kann. Was bedeutet das: "nur am Oszi"? > ich habe die Aufgabe bekommen ein Programm zu schreiben, welches Daten > in einem I2C EEPROM (M24256) speichert und auch wieder auslesen kann. Und wie sieht dieses Programm aus? Was sieht man eigentlich auf dem Oszi? Was ist gelb, was blau?
Talisca schrieb: > Die zum Master gesendeten Bits werden bei einem > Pulldown nie genau auf logisch 0 gezogen. Könnte es sein, daß Du die beiden Signale mit unterschiedlichem Offset anzeigen lässt? Das ist eine Einstellungssache Deines Oszilloskopes; wie sieht das Bild aus, wenn Du beide Eingänge auf Masse legst? Sind dann die gelbe und blaue Linie auch etwa um ein Kästchen verschoben?
Lothar Miller schrieb: > Was bedeutet das: "nur am Oszi"? Rufus Τ. Firefly schrieb: > Könnte es sein, daß Du die beiden Signale mit unterschiedlichem Offset > anzeigen lässt? Schaut euch den angehängten Ausschnitt an. Lattice User schrieb: > Da liegt vermutlich ein Fehler in der Beschaltung, Könnte auch sein, dass die I2C Pins am µC falsch konfiguriert sind und die Datenleitung vom µC aktiv auf high gezogen wird.
Noch ein Nachtrag. Lattice User schrieb: > Könnte auch sein, dass die I2C Pins am µC falsch konfiguriert sind und > die Datenleitung vom µC aktiv auf high gezogen wird. darauf deuten auch die relativ steilen Low nach High Flanken.
>Könnte auch sein, dass die I2C Pins am µC falsch konfiguriert sind und >die Datenleitung vom µC aktiv auf high gezogen wird. Das sieht wirklich so aus. Zwei Ausgänge prallen aufeinander oder der Pullup ist viel zu klein. Wenn das ein AVR ist dann den SDA nicht auf Ausgang schalten.
Lattice User schrieb: > Schaut euch den angehängten Ausschnitt an. Auf dem sieht man nicht, wie das Bild aussieht, wenn beide Signale auf Masse liegen. Aussehen tut Dein Bild nämlich so, als ob da ein Anzeigeoffset ist, d.h., daß der Bezugspunkt beider Signalzüge nicht der gleiche ist.
Rufus Τ. Firefly schrieb: > Aussehen tut Dein Bild nämlich so, als ob da ein Anzeigeoffset ist, > d.h., daß der Bezugspunkt beider Signalzüge nicht der gleiche ist. Guck nochmal hin. Wo ist der blaue Pegel am linken Rand, und wo ist er am Rechten.
Wohl vergessen, SDA während des Lesens auf Input zu setzen? SCL sieht übrigens auch alles andere als ideal aus, sollte ein Tastverhältnis von 1 zu 1 ergeben.
Meine Güte, wie schnell das hier geht. Klaus schrieb: > Was meinst du mit "logisch 0" und was mit "genau"? Digitalsignale gelten > im allgemeinen als Low oder logisch 0, wenn sie unterhalb einer gewissen > Schwelle sind. Bei TTL Pegeln ist das ca. 0,8V, bei CMOS Pegeln typisch > 1/3 Vcc. > > MfG Klaus Da liegt mein Problem. Wie der Grafik entnommen werden kann, wird auf ca. die Hälfte "runtergezogen", was aber noch als 1 interpretiert wird. Wäre halt doch irgendwie praktisch, wenn z. B. ein ACK als 0 gewertet wird und nicht als 1. Lothar Miller schrieb: > Wie sieht die Beschaltung zwischen uC und EEPROM aus? Der genaue Schaltplan vom Aufbau liegt mir leider nicht vor. > Was bedeutet das: "nur am Oszi"? Dass jedes Bit, welches ich lese, stets als 1 interpretiert wird, so lange vor dem letzten ACK als lsb eine 1 gesendet wurde. Lese/Schreibe ich bsp. 0x05, so wird der folgende ACK nur auf diese halbe Flanke gezogen. Bei bsp. 0x04 bleibt die SDA auf 0. > Und wie sieht dieses Programm aus? Dieses hab ich leider nicht parat. Befindet sich bei meiner Praktikumsstelle. Evtl. noch erwähnenswert: Es wurde in LabVIEW zusammengeklickt. > Was sieht man eigentlich auf dem Oszi? Was ist gelb, was blau? Wie konnte ich das nur vergessen. Blau = SDA Gelb = SCL Rufus Τ. Firefly schrieb: > Könnte es sein, daß Du die beiden Signale mit unterschiedlichem Offset > anzeigen lässt? Das ist eine Einstellungssache Deines Oszilloskopes; wie > sieht das Bild aus, wenn Du beide Eingänge auf Masse legst? Sind dann > die gelbe und blaue Linie auch etwa um ein Kästchen verschoben? Das war so beabsichtigt. Hat mir zumindest die Auswertung vereinfacht. Anbei hätte ich noch eine Grafik, welche einen Schreibvorgang mit dem Wert 0xAB zeigt. Hab den Teil vom ACK mal markiert. Ist eigentlich schön zu sehen, wie die SDA nach der achten Clock Periode nach unten ziehen will bzw. zieht. Aber eben nicht sehr weit kommt. Werde morgen gleich mal schauen, welches Bild sich ergibt, wenn ich die Eingänge auf Masse lege. Vielen Dank aber schonmal für eure Antworten :-)
>SCL sieht übrigens auch alles andere als ideal aus, sollte ein Tastverhältnis >von 1 zu 1 ergeben. Jupp, das sieht nach Software I2C aus. Da lässt man den SDA Portpin im Portregister immer auf 0 und schaltet zum erzeugen von High und Low Pegel mit dem DDR Register um, nicht mit PORT.
Klaus2m5 schrieb: > Wohl vergessen, SDA während des Lesens auf Input zu setzen? SCL sieht > übrigens auch alles andere als ideal aus, sollte ein Tastverhältnis von > 1 zu 1 ergeben. War froh, dass das Teil heute wenigstens endlich mal seinen Zweck erfüllen konnte :D Werde die Pegel noch genauer anpassen, nur bei jedem kompilieren 7 Minuten Wartezeit geht dann doch schon auf die Nerven.
Hi >War froh, dass das Teil heute wenigstens endlich mal seinen Zweck >erfüllen konnte :D >Werde die Pegel noch genauer anpassen, nur bei jedem kompilieren 7 >Minuten Wartezeit geht dann doch schon auf die Nerven. Um welchen Controller geht es überhaupt? Und ist es Hard- oder Sofware-I2C? MfG Spess
Klaus2m5 schrieb: > SCL sieht > übrigens auch alles andere als ideal aus, sollte ein Tastverhältnis von > 1 zu 1 ergeben. Warum? Wäre nur was fürs Auge. Das Verhältnis ist unerheblich, solange jede der beiden Zeiten nicht kleiner als die halbe Bitzeit ist. Beim letzten Bit, wenn der Slave die Clock verlängert, passt das mit 1 zu 1 sowieso nicht. MfG Klaus
Klaus schrieb: > Das Verhältnis ist unerheblich, solange > jede der beiden Zeiten nicht kleiner als die halbe Bitzeit ist. Stimmt - aber wir sind uns hoffentlich einig, dass man die maximale Übertragungsrate nur erreichen kann, wenn beide Hälften der Clock die halbe Bitzeit haben. Wenn ich mit einem EEPROM nur mit Morsegeschwindigkeit kommunizieren will, ist es wirklich egal.
Lattice User schrieb: > Guck nochmal hin. > Wo ist der blaue Pegel am linken Rand, und wo ist er am Rechten. Und? Wo ist das Bezugspotential? Also, nochmal: Lege beide Eingänge Deines Oszilloskops auf Masse. Wo sind dann die gerade durchgehenden Linien? Ich tippe darauf, daß die blaue gut ein Kästchen oberhalb der gelben sein wird.
Rufus Τ. Firefly schrieb: > Ich tippe darauf, daß die blaue gut ein Kästchen oberhalb der gelben > sein wird. Das hat er ja schon gesagt/erklärt wie sich die beiden zueinander verhalten (bzw wie sie sich nicht zueinander verhalten) Unabhängig jedoch von der Referenz sind 3 stabile Pegel bei I2C meines Wissens nicht vorgesehen.
Rufus Τ. Firefly schrieb: > Wo ist das Bezugspotential? Schau doch mal auf die beiden Zeiger "1" und "2" an der linken Seite - dass sind die Nullpunkte. Gruß Dietrich
Rufus Τ. Firefly schrieb: > Und? > > Wo ist das Bezugspotential? > > Also, nochmal: Lege beide Eingänge Deines Oszilloskops auf Masse. Mal zur Klarstellung, es ist nicht mein Scope und ich bin auch nicht der TE, habe nur versucht ein paar Missverständnisse aufzuklären, wohl umsonst. Allerdings ist das ursprüngliche Bild des TE etwas ungünstigt, da es das Auge irreführt. Auch mich am Anfang. Dietrich L. schrieb: > Schau doch mal auf die beiden Zeiger "1" und "2" an der linken Seite - > dass sind die Nullpunkte. Exactly.
Klaus2m5 schrieb: > Wenn ich mit einem EEPROM nur mit Morsegeschwindigkeit kommunizieren > will, ist es wirklich egal. Auch Morsegeschwindigkeit ist schneller als geht garnicht. Und in der Realität kommt es darauf nicht an, das Clock-Stretching beim ACK, die Verzögerungen zwischen den Bytes und geschicktes oder eher ungeschicktes Abwarten nach einem Write machen mehr aus. Nicht zu vergessen die ganzen delay_ms(), die man in den so vorgezeigten Codestücken so sieht (wenn ein Cast nicht hilft, dann vielleicht ein Delay?) ... MfG Klaus
Lothar Miller schrieb: > Was sieht man eigentlich auf dem Oszi? Was ist gelb, was blau? Rufus Τ. Firefly schrieb: > Könnte es sein, daß Du die beiden Signale mit unterschiedlichem Offset > anzeigen lässt? Kinners, so schwer ist das doch nicht. ;-) Wer schon mal mit I2C gearbeitet hat, sieht sofort, dass gelb nur SCL sein kann und folglich SDA in cyan dargestellt ist. Der Nullpegel ist, wie bei DSOs üblich, jeweils durch ein kleines Symbol am linken Rand markiert. Natürlich ist da ein Offset drauf. Und wer sich dann auch noch das Signal im Ausgangspost etwas genauer ansieht, kann auch leicht feststellen, dass beim SCL zwei Pegel auftreten, beim SDA dagegen drei. Der mittlere SDA Pegel liegt auf gleicher Höhe mit dem H-Pegel von SCL (innerhalb des Bytes) und gehört da definitiv nicht hin.
Das mag wohl sein, aber zunächst mal: Wer misst, misst Mist. Und wer auf erstes Nachfragen nicht klar erkennen lässt, daß er tatsächlich mit seinem Oszilloskop umzugehen weiß, der muss einfach mit weiteren Nachfragen leben. So, jetzt sollte zumindest dieser Teil der Übung geklärt sein. Jetzt wird die beteiligte Hardware interessant; welcher µC wird hier genutzt und was genau ist wie mit dessen I2C-Bus verbunden? Wie groß bzw. wie klein sind die Pullup-Widerstände?
Diverse Leute haben es weiter oben schon geschrieben: Da arbeiten zwei Ausgänge gegeneinander. Jedes mal, wenn der Master lesen soll, geht der Pegel nicht auf Null. Also wird der SDA des Master nicht auf Eingang geschaltet.
Talisca schrieb: > nur bei jedem kompilieren 7 > Minuten Wartezeit geht dann doch schon auf die Nerven. Was isn das für ein komisches System (welches Target, Compiler, Programmer, OS). Ich würde 7s für angemessen erachten. Ich sehe das auch so, der Slave kämpft gegen einen falsch implementierten SW-Master. Peter
@Talisca Der I2C-Bus arbeitet mit Open-Collector-Ausgängen! Der High-Pegel ist rezessiv (schwach), d.h. er wird dadurch erzeugt, daß alle Ausgänge die Leitung "in der Luft hängen" lassen und dann der Pullup die Leitung auf High-Pegel zieht. Der Low-Pegel ist dominant (stark), d.h. er wird erzeugt, indem (mindestens) ein Ausgang die Leitung aktiv per Endstufe auf Low-Pegel zieht (und dabei den Pullup überbietet). Deine Osci-Bilder sagen ziemlich eindeutig, daß Du anstatt mit einem Open-Collector-Ausgang mit Push-Pull-Ausgang arbeitest. D.h. in dem Fall, wo Du diesen halben Pegel hast, zieht legt der Master einen starken High-Pegel an (was beim I2C verboten ist!) und der Slave legt einen starken Low-Pegel an, und das Resultat ist Murks.
Laie schrieb: > Und wer sich dann auch noch das Signal im Ausgangspost etwas genauer > ansieht, kann auch leicht feststellen, dass beim SCL zwei Pegel > auftreten, beim SDA dagegen drei. Eine klassische Buskollision: der eine zieht nach GND, der andere nach VCC. Der VCC-Zieher ist ein wenig stärker... Beim I2C darf aber gar keiner aktiv nach Vcc ziehen, das macht ein Pullup.
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.