Problem mit I2C

Gast #71071
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
Gast #71072
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 ?
Gast #71073
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?
Gast #71075
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.
Gast #71076
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren