Hallo, nach langem ausprobieren und simulieren bin ich nun dahintergestiegen, dass der Stackpointer nicht richtig initialisiert wird. (WinAVR mit ATmega8) Zum Problem: Bisher konnte ich keine Funktionen in C verwenden, sie simulation klappte ohne Probleme, nur der Mikocontroller wollte nicht. Nun ich bin dahinter gestiegen, dass WinAVR den SP (Stackpointer) zwar initialisert, aber vollkommen falsch: LDI R28,0x00 LDI R29,0x00 OUT 0x3E,R29 OUT 0x3D,R28 Also auf Adresse 0x00. Resultat war, dass meine Programme nicht mehr vom unterprogramm/funktion wieder zurückspringen konnten. Nun, ich hab das Problem jetzt gelöst, in dem ich den SP von Hand initialisiere: .... void main() { SP=RAMEND; .... daraus wird dann ca. sowas: LDI R28,0x00 LDI R29,0x00 OUT 0x3E,R29 OUT 0x3D,R28 ' Erstmal falsch initialisieren LDI R24,0x5F LDI R25,0x04 OUT 0x3E,R25 OUT 0x3D,R24 ' Dann richtig von Hand Zu meiner Frage: Ist das bei euch auch so?? und wieso wird der SP erst falsch initialisiert? Danke für Tipps
Bei mir stimmts: int main( void ) { 136: cf e5 ldi r28, 0x5F ; 95 138: d4 e0 ldi r29, 0x04 ; 4 13a: de bf out 0x3e, r29 ; 62 13c: cd bf out 0x3d, r28 ; 61 Hast Du dem Compiler den Typ richtig angegeben: avr-gcc.exe -mmcu=atmega8 Peter
Außerdem ist SP=RAMEND; schlichtweg falsch ! Wie es aussieht, werden Variablen im main() hinter dem Stack abgelegt, d.h. diese Variablen würden dann munter übergePUSHt, wie z.B. in nachfolgendem Listung mit "char s[30];" zu sehen ist. int main( void ) { 80: c1 e4 ldi r28, 0x41 ; 65 82: d4 e0 ldi r29, 0x04 ; 4 84: de bf out 0x3e, r29 ; 62 86: cd bf out 0x3d, r28 ; 61 char s[30]; Vielleicht solltest Du mal Dein "MAKE" anhängen, damit einer der Experten da einen Fehler entdecken kann. Ich benutze kein MAKE. Ich könnte Dir höchstens meine "AC.BAT" geben, die alle C-Files im aktuellen Verzeichnis compiliert und zusammenlinkt. Zuerst solltest Du Dein Programm aber weitmöglichst minimieren, ob der Fehler bleibt. Eventuell kann dann der letzte Minimierungsschritt, bevor der Fehler verschwand, mehr Aufschluß geben. Peter
Also hier ist schonmal mein Makefile. Mein Programm hab ich schon soweit wie möglich minimiert um das Problem zu finden. Wäre echt super wenn ich deine Bat Datei bekommen könnte, dann kann ich mal schauen, ob es dann klappt
hmm, mit deiner Datei geht es. Aber dadurch wird mein Programm von 21 Befehlen auf 77 Befehle aufgestockt. Die ersten 20 bestehen nur aus irgendwelchen Sprüngen. Aber jetzt hab ich meinen Fehler gefunden. Es liegt wirklich an meiner Makefile. Und zwar wird bei mir nicht gelinkt. Weil dort die Angaben "-c" mit übergeben wird. Mal schauen ob ich irgendwo ein lauffähiges Makefile bekomme
Der GCC hat eine Großschriftallergie. Der Code ist zwar funktional richtig, aber manchmal etwas größer, wenn der Name des Sourcefile mit ".C" statt ".c" endet. Hier steht näheres dazu. http://www.mikrocontroller.net/forum/read-2-44224.html Peter
@Philipp B Ein lauffähiges Makefile findest Du im \Winavr\sample Verzeichnis. Kopiere es in dein Projekt-Verzeichnis und passe es für dein Projekt an gemäss den Kommentaren im Makefile oder nach folgender Anleitung: http://www.avrfreaks.net/Tools/ToolFiles/376/install_config_WinAVR.pdf
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.