Hey ich habe momentan folgendes Problem: Ich programmiere einen Atmega128 und will Funktionen extern auslagern. Wenn ich alles in meine Hauptdatei packe (prog.c) funktioniert es tadellos. Aber sobald ich Funktionen extern einbinde, geht nichts mehr am Controller, obwohl der Compiler avr-gcc mir problemlos die prog.hex-Datei erstellt. So sieht das momentan aus: http://pastebin.com/D8EyeYzj Wenn ich dummy() in prog.c auskommentiere, bekomme ich im Millisekunden-Abstand ein Signal am entsprechenden Port. Wenn ich es drin lasse (bedenke: es macht überhaupt nichts), ´passiert an diesem Port leider nichts. Wäre cool wenn jemand einen Hinweis hat, was falsch läuft Das ist noch das Makefile http://pastebin.com/Q6tUWPcW
Anonym schrieb: > Wenn ich dummy() in prog.c auskommentiere, bekomme ich im > Millisekunden-Abstand ein Signal am entsprechenden Port. Laut Deinem posting ist dummy() in bus.c definiert. Hast Du vielleicht Warnungen übersehen, die hilfreich wären?
Ja ist es auch ;) "Build succeeded with 0 Warnings..." bekomme ich jedes mal. Mir ist das zum ersten mal aufgefallen (habe eben erst angefangen), als ich den ganzen Block PORTA |= (1<<2); _delay_ms(10); PORTA &= ~(1<<2); _delay_ms(10); ausgelagert und eingebunden habe. Aber es ist wohl ein grundsätzliches Problem, dass der Controller nicht mitmacht, sobald eine Funktion von außerhalb aufgerufen wird
Der liegt schon eine Weile rum, aber programmiertechnisch ist er "neu". Das weiß ich im Moment nicht, da ich nur das AVR-Studio-Projekt griffbereit hab. Physischen Zugriff hab ich erst morgen wieder ;)
Anonym schrieb: > Wenn ich dummy() in prog.c auskommentiere, bekomme ich im > Millisekunden-Abstand ein Signal am entsprechenden Port. Wenn ich es > drin lasse (bedenke: es macht überhaupt nichts), ´passiert an diesem > Port leider nichts. Erzeuge doch mal Assembler Dateien (Flag -S) und lade diese hoch!
>Der Mega128 ist 'neu'? >Die M103 Fuse ist deaktiviert? Fehler bei den Fuses sind unwahrscheinlich, wenn es in anderer Kombination (alles in main.c) funktioniert. >Aber es ist wohl ein grundsätzliches >Problem, dass der Controller nicht mitmacht, sobald eine Funktion von >außerhalb aufgerufen wird Von wo her eine Funktion aufgerufen wird bekommt der Controller gar nicht mit. Der arbeitet einen Programmbereich nach dem anderen ab. Sowohl innerhalb als auch außerhalb von main.c aufgerufene Funktionen erscheinen nur als call oder jump an die entsprechende Stelle.
Wie genau mache ich das mit der Assembler-Datei und Flag-S? Habe dazu in den Projektoptionen nichts gefunden :/ Momentan kann ich mit .o, .map, .lss, .hex, .elf und .eep dienen
Frage an Radio Eriwan: Kannst Du mit einem eventuell ellenlangen Assebler-Listning überhaupt etwas anfangen? Schalte nach dem Kompilieren mal die Ansicht auf Assembler um und schau Dir das Resultat an.
Sebastian S. schrieb: > Fehler bei den Fuses sind unwahrscheinlich, wenn es in anderer > Kombination (alles in main.c) funktioniert. Doch, hier schon. Bei falscher Fuse liegt der Stack im Wald. Ohne echtem Funktionsaufruf wird der Stack in diesem Code aber nicht verwendet. Und den Aufruf gibts nur bei externer Funktion, weil die Funktion sonst inlined wird.
:
Bearbeitet durch User
Sebastian S. schrieb: >>Der Mega128 ist 'neu'? >>Die M103 Fuse ist deaktiviert? > Fehler bei den Fuses sind unwahrscheinlich, wenn es in anderer > Kombination (alles in main.c) funktioniert. Nicht wenn die Funktionen so läppisch sind, dass sie vom Compiler geinlined werden. Liegt die Funktion so, dass der Compiler kein inline machen kann, dann muss ein echter Funktionsaufruf her. Wenn dann der M128 noch auf M103 steht, dann kracht es.
Hier die Assembler-Dateien :) Das mit der Fuse check ich morgen mal. Da kann man glaub echt viel falsch machen...
Kann es sein, dass der Stack-Pointer nicht richtig initialisiert ist? Kannst Du da mit einem Debugger im single step durch gehen?
:
Bearbeitet durch User
Also der Debugger sagt dass die Ports funktionieren sollten. Vom Stack Pointer hör ich grad zum ersten mal, aber ich bin auf dem Gebiet auch komplett neu
Karl Heinz schrieb: > Die M103 Fuse ist deaktiviert? Vermutlich nicht. Siehe AVR Fuses. Bei kurzen Dummy Programmen kann der Compiler oftmals alle Stack-Operationen wegoptimieren - aber nicht wenn Function calls über mehrere C Dateien verstreut sind. Deshalb funtionieren die Tests, bei denen alles in einem File ist.
:
Bearbeitet durch User
Es lag tatsächlich an der Fuse M103... :) Vielen Dank Leute!!
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.