Software-I2C Master von Fleury funktioniert nach wechsel von Mega16 zu 644 nicht mehr

Gast #2129140
Lesenswert?

Hi!

Eine typische Glaskugelfrage, aber vielleicht kann ja jemand einen Tipp 
geben, wonach ich suchen könnte:

Ich hatte einen Atmega16 im Einsatz und habe diesen nun gegen einen 
Atmega644 getauscht.

An PA6 und PA5 ist ein externes I2C-Eeprom (24x irgendwas) 
angeschlossen, wobei ich Software-I2C mit der Lib von Peter Fleury 
nutze. Hardware-I2C geht nicht da die Pins schon vergeben sind.

Mit dem Atmega16 hat das problemlos geklappt, aber seit dem Tausch hängt 
sich entweder das Programm auf, oder es werden nur Nullen aus dem Eeprom 
gelesen.
Lustig ist auch, dass ich keine Aktivität an PA5 und PA6 sehen kann 
(Ozi, LogicAnalyzer).
Wenn ich die Pins als Test im Programm als Low oder High definiere, sehe 
ich das. Die Hardware ist also ok.

Mein Eindruck ist, dass der gesamte I2C-Code einfach keine Wirkung hat, 
was ich nicht verstehe. Im Atmel-Dokument zur Migration von Atmega16 auf 
644 wurde ich nicht fündig, und spezielle Port-Funktionen gibt es auf 
PortA auch nicht die ich irgendwie nutzen würde.

Gibt es irgend welche Unterschiede zwischen dem Atmega16 ung 644, die 
sich so auswirken könnten?

Gruß,
Chris
Moderator (Firma: Titel) Persönliche Seite #2129168
Lesenswert?

Lass mal deine Hardwareinitialisierung (=Sourcecode) sehen.
Beim 644 gibts Pin-Change-Interrupts...

Chris schrieb:
> Lustig ist auch, dass ich keine Aktivität an PA5 und PA6 sehen kann
Das ist doch schon mal ein toller Ansatzpunkt.
Irgendwer müsste ja an den Leitungen rumzerren.
Warum tut er das nicht?
Der Sourcecode der Lib ist ja nun nicht megaunübersichtlich, da kann man 
problemlos die 3 Funktionsaufrufe nachverfolgen...
Gast #2129186
Lesenswert?

So sieht der eeprom-Teil aus (mittlerweile unschön verbastelt da ich 
seit einem Tag nach dem Fehler suche :( )

Von main.c aus werden nur Funktionen der exteeprom.c angesteuert.

Die Pin-Change Interrupts nutze ich nicht. Ich habe auch in der main.c 
eine Endlosschleife in main{} eingefügt um zu verhindern, dass irgendwo 
vom Rest des Programms etwas rein funkt, aber an den Pins tut sich immer 
noch nichts.

Wenn ich sie beim Programmstart low setze, bleiben sie low. Setze ich 
sie high, bleiben sie high.
Angehängte Dateien:
Gast #2129599
Lesenswert?

Ich habe das Problem nun gelöst. Wie immer war es eigentlich ganz 
simpel:

Durch einen (bisher nicht näher untersuchten) Fehler im makefile hat er 
beim make clean die Object-Datei des Assembler-Files nicht gelöscht, so 
dass er beim Make all auch nicht alles neu kompiliert hat. Dadurch 
stimmten natürlich die Konstanten für I/O usw. nicht mehr.

Chris

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