Ich habe hier ein Problem mit meinem ATmega128. Auf dem ATmega32 lief alles. Aber als ich umgestiegen bin lief garnichts mehr. Ich starte mein Programm und Portausgaben werden auch im Hauptprogramm erledigt. Aber sobald ich eine Funktion aufrufe oder eine Schleife anlege geht nichts mehr. Ich vermute da ein Stackproblem. Aber wo kommt das her? Oder muss ich den vorher irgendwie initialisieren?
hast du den stack-pointer ordentlich initialisiert? (die 4 Anweisungen am Anfang nach RESET wie im Datenblatt) Wenn nicht, dann wundert es mich überhaupt das das läuft. Der Atmel initialisiert den SP NICHT bei Reset.
Wenn es beim 32 ging, dann wird er wohl auch beim 128 den Stack initialisiert haben... Wie merkst du, dass nichts mehr läuft? Wenn durch LEDs etc.: die oberen oberen I/Os (von 0x60 bis 0x100?) werden mit STS/LDS angesprochen. Vielleicht mal nen Codeschnipsel.
Wer entscheidet, was falsch und was richtig ist? Nach bürgerlichem Gesetzbuch sind jedenfalls Nicknames nicht schützbar und somit ist jeder Rufus T. Firefly echt...
Achja vielleicht hätte ich erwähnen sollen, dass ich WinAVR nutze... Das es wie oben funktioniert sehe ich daran, dass der Beeper an geht. Und hier mal Codeschnipsel: Geht: DDRB |= 1<<PB4; PORTB &= ~(1<<PB4); Geht nicht: DDRB |= 1<<PB4; while(1) { PORTB &= ~(1<<PB4); delay_ms(2000); PORTB |= 1<<PB4; delay_ms(2000); } An den Delay-Funktionen liegt es nicht. Denn das geht auch nicht. Also der Aufruf der Funktionen, wie ich es ja schon auf dem Atmega32 genutz habe: #define BUZZER_PORT_DDR DDRB #define BUZZER_PORT_OUT PORTB #define BUZZER_BIT_SET PB4 #define BUZZER_OFF 0 #define BUZZER_ON 1 #define BUZZER_BEEP 2 #define BUZZER_ALERT 3 void buzzer_init(void) { BUZZER_PORT_DDR |= 1<<BUZZER_BIT_SET; /* SET auf Ausgang */ buzzer_switch(BUZZER_OFF); return; } void buzzer_switch(char mode) { switch (mode) { case BUZZER_OFF: BUZZER_PORT_OUT |= 1<<BUZZER_BIT_SET; /* Buzzer ausschalten */ break; case BUZZER_ON: BUZZER_PORT_OUT &= ~(1<<BUZZER_BIT_SET); /* Buzzer einschalten */ break; } return; }
Du liest nicht gerne Antworten ? Bzw. wenn der Tip daneben lag, bricht man sich keinen ab, das auch zu sagen. Peter
Welchen der Tipps meinst Du? Ich ging davon aus im letzten Post darauf reagiert zu haben. Da der ATmega verbaut ist, kann ich auch nicht jeden der einzelnen Ports antesten. Die M103-Fuse dachte ich, hätte irgendwas mit einem Kopatibilitäts-Modus zu tun, sodass ich die ja garnicht bräuchte oder? Aber hier nochmal meine Fusebits als Anhang.
Hi eben. M103C ist ab Werk "programmed". Solange läuft der Mega128 im Mega103 Modus was unter anderem den SRAM in einen anderen Adressbereich verschiebt. Dein SP wird aber für einen Mega128 initialisiert. Beim ersten ret krachts dann da der Controller seine Rücksprungadresse nicht mehr richtig bekommt. Mach das Häckchen da weg und gut ist. Matthias
Ich werd das zwar nie mit den Fuses blicken, aber wenn du nichts an der M103 geändert hast, dann ist der M128 noch ein M103, d.h. er hat weniger RAM, eingeschränkte Portfunktionen etc. Du musst also das M103 ändern, dann ist es ein "echter" M128.
DANKE! Das Häkchen und es läuft. Nochmal vielen Dank für die Hilfe? Aber ATMEL verstehe ich echt nicht. Die AVRs nerven mich langsam immer mehr. Erst ist das MOSI und MISO nicht sofort ersichtlich und liegt auf PDI und PDO. Und dann der blöde Kompatibilitätsmodus. Wenn den jemand speziell einschalten will, also keinen normalen 128er haben will, dann kann er das doch tun. Aber nicht andersherum. So sammeln sich die Probleme, die nicht sein müssten immer weiter.
Eben nicht! Sagen wir, du hast ne Schaltung, vielleicht Serienfertigung.. und jetzt gibts keine m103 mehr und auf deinen 10.000 Platinen, die du schon machen lassen hast, is keine möglichkeit für ISP oder JTAG oder einfach keine Fuses veränderbar. Dadurch, dass der AVR als 103 läuft, kann man den ohne Probleme da einsetzen, will man halt nen 128, dann muss man eben in seinem neuen Layout das einbeziehen und/oder beim Flashen das Fuse setzen. Najut... den neuen m103 müsste man ja auch flashen, da könnte man das Fuse ändern.
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.