www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit I2C


Autor: Jerome (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

beim Auslesen und Beschreiben eines EEPROMS 24C02 über I2C habe ich
folgendes Problem:

Wenn der Programmcode nur die Routinen zum beschreiben und lesen des
EEPROMS enthält funktioniert alles einwandfrei.

Wenn ich jedoch den Programmcode erweitere um mein Tastenfeld
einzulesen (über Timer0 Compareinterrupt alle paar ms) und einen
Sekundentakt erzeuge (Timer1 ebenfalls Compareinterrupt) dann wird das
EEPROM oft falsch bechrieben und ausgelesen.

Wenn ich die Interrupts wieder deaktiviere (//#sei) funktioniert wieder
alles. Muß ich denn wirklich jedes mal die Interrupts zulassen bzw.
sperren wenn ich den I2C-Bus anspreche ? Gibt es dfür nicht andere
Lösungsmöglichkeiten ?

Falls es wichtig ist, der Prozessor ist ein ATmega128, der Compiler ist
Codevision.

Gruß
Jerome

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Datenblatt des 24c02 stehen beim Timing immer nur min-Zeiten.
Das heist doch eigentlich, dass man die Zeiten problemlos ausdehnen
kann, wenn z.B. ein Interrupt dazwischen kommt.
Hat der Interrupt nicht vielleicht irgndwelche Nebeneffekte ?
Benutzt Du den i2c-Port des Prozessors oder hast du das von Hand
programmiert ?

Autor: Jerome (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze den I2C-Port des Prozessors und verwende die Routinen von
Codevision (i2c_init,i2c_read,i2c_write). Den Quellcode dieser Routinen
kann man jedoch leider nicht einsehen.

Ein unerwünschter Nebeneffekt könnte sein:

Ich habe an den Portpins A0 bis A5 einen Teil der Matrixtastatur
angeschlossen. Für den I2C-Bus SDA/SCL verwende ich die Pins A6 und A7.
In der Interruptroutine wird zum Auslesen der Tastatur
das Richtungsregister DDRA gesetzt, z.B. durch DDRA=0x01.
Kann das die Ursache sein ? Bei einem Interrupt wird z.B. der
Lesevorgang des EEprom unterbrochen und über die Interruptroutine das
Richtungsregister geändert?

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jep, das nennt sich Seiteneffekt. In der Interrupt-Routine nur die für
die Tastatur benutzten Richtungsbits ändern.

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du darfts die Portrichtung der I2C-Signale nicht ändern.
Stell dir vor, es wird gerade eine 0 ausgegeben und Du schaltest auf
Eingang. Dann zieht der Pullup die Leitung auf 1.
Lese doch in der Interruptroutine das Richtungsregister aus, ändere die
Bits, die Du brauchst und schreib das Ergebnis zurück.

Autor: Jerome (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Interruptroutine werde ich so abändern, dass nur die Richtungsbits
A0...A5 geändert werden welche die Tastatur betreffen.Die Richtungsbits
für den I2C-Bus dürfen durch die Interruptroutine nicht verändert
werden, das ist mir jetzt klar geworden.

danke für die Antworten !

Gruß Jerome

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.