Forum: Mikrocontroller und Digitale Elektronik Problem mit I2C


von Jerome (Gast)


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

von Uwe Nagel (Gast)


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 ?

von Jerome (Gast)


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?

von thkais (Gast)


Lesenswert?

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

von Uwe Nagel (Gast)


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.

von Jerome (Gast)


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

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
Noch kein Account? Hier anmelden.