Forum: Mikrocontroller und Digitale Elektronik ATmega128 Stackproblem?


von Ronny Schulz (Gast)


Lesenswert?

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?

von marcel (Gast)


Lesenswert?

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.

von dave (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

M103-Fuse


Peter

von Rufus T. Firefly (Gast)


Lesenswert?

R.T.F.M.

von Jens (Gast)


Lesenswert?

@ falscher "Rufus T. Firefly"

LDEB

von Der Philosoph (Gast)


Lesenswert?

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

von dave (Gast)


Lesenswert?

Argh... ich bin blöd.

von Ronny Schulz (Gast)


Lesenswert?

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;
}

von Peter D. (peda)


Lesenswert?

Du liest nicht gerne Antworten ?

Bzw. wenn der Tip daneben lag, bricht man sich keinen ab, das auch zu
sagen.


Peter

von Ronny Schulz (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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

von dave (Gast)


Lesenswert?

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.

von Ronny Schulz (Gast)


Lesenswert?

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.

von dave (Gast)


Lesenswert?

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