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