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
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 ?
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?
Jep, das nennt sich Seiteneffekt. In der Interrupt-Routine nur die für die Tastatur benutzten Richtungsbits ändern.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.