Forum: Mikrocontroller und Digitale Elektronik Software-I2C Master von Fleury funktioniert nach wechsel von Mega16 zu 644 nicht mehr


von Chris (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Chris (Gast)


Angehängte Dateien:

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.

von Chris (Gast)


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

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.