Problem mit I2C

Gast #71071
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
Gast
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 ?
Gast
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?
Gast
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.
Gast
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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.