C: Rücksprung aus Unterfunktion klappt nicht

Gast #2784195
Hallo,

ich bin hier seit einigen Tagen total am Verzweifeln. Ich starte gerade 
ein neues µC-Projekt (Habe schon sehr viele Projekte gemacht) und 
scheitere an den ersten drei Zeilen und weiß absolut nicht mehr weiter 
woran es liegen könnte.

Mein Projekt besteht aus folgenden drei Dateien:

main.c:
1
#include <avr/io.h>
2

3
#include "stuff.h"
4

5
int main(void)
6
{
7

8
  DDRA |= 0x08;
9

10
  while(1)
11
  {
12
    waitms(4);
13
    PORTA ^= 0x08;
14
  }
15

16
  return 0;
17

18
}

stuff.c:
1
#include <util/delay.h>
2

3
#include "stuff.h"
4

5

6
void waitms(uint16_t milliseconds)
7
{
8
  uint16_t i;
9

10
  for(i=0;i<milliseconds;i++)
11
  {
12
    _delay_ms(1);
13
  }
14
}

stuff.h:
1
#ifndef STUFF_H
2
#define STUFF_H
3

4
void waitms(uint16_t milliseconds);
5

6
#endif

Hier sollte ja der Pin PA3 alle 4ms Toggeln.
Statt dessen macht er gar nichts. Über mehrere Tests habe ich nun 
herausgefunden: Die Funktion waitms wird aufgerufen und auch bis zum 
Ende durchlaufen. Doch danach springt er nicht in die main-while zurück, 
sondern startet das Programm von Anfang an neu, aber ohne Reset
Das zeigt sich daran, das wenn ich den Pin-Toggel befehl direkt nach 
DDRA |= 0x08; schreibe, dann Toggelt der Pin tatsächlich alle 4ms...

Und es kommt noch besser: Wenn ich die Funktion waitms direkt in die 
main.c mit rein nehme funktioniert das Programm tadellos. Probleme 
Treten erst auf wenn die Funktion in der stuff.c liegt.

Ich finde das langsam sehr kurios. Habe das Projekt schon zwei mal neu 
aufgesetzt, ohne Erfolg. Mit der vorliegenden Entwicklungsumgebung und 
Compiler habe ich vor ein paar Wochen noch ein anderes Projekt 
fehlerfrei Kompiliert und genutzt.

Zu dem Workaround:
- ATMega128 (Brownout und Watchdog sind aus, Externer Quarz 8MHz)
- WinAVR20090313
- Editor: Codeblocks

Vielleicht kennt jemand das Problem und kann mir helfen?
Gast #2784197
die häufigste ursache bei diesem Problem war bis jetzt immer das der 
falsche Prozessortype eingestellt war. Damit stimmt der Stack nicht und 
das Return geht schief.

Zur not mal ein Blick in den ASM-Code werfen, dort solle man sehen 
welcher werte der Stack hat.
#2784208
Peter II schrieb:
> die häufigste ursache bei diesem Problem war bis jetzt immer das der
> falsche Prozessortype eingestellt war. Damit stimmt der Stack nicht und
> das Return geht schief.

In gewisser Weise hast du sogar recht :-)
Nur das diesmal nicht im AVR-Studio der 'falsche Prozessor' eingestellt 
ist, sondern am µC selber.

Mega128 - fabrikneu:
M-103 Fuse abschalten.
Gast #2784233
Juhuuu Danke, ihr seid spitze :)

an der M103 Fuse lag es...
Wenn das solche Auswirkungen hat, versteh ich allerdings nicht warum 
Atmel die defaultmäßig setzt...
#2784235
Robodriver schrieb:
> Juhuuu Danke, ihr seid spitze :)
>
> an der M103 Fuse lag es...
> Wenn das solche Auswirkungen hat, versteh ich allerdings nicht warum
> Atmel die defaultmäßig setzt...

Das versteht wohl keiner, warum Atmel einen µC verkauft, bei dem man 
erst mal eine Fuse löschen muss, damit man innen kriegt, was aussen 
drauf steht.

Da hat es wohl in der Vergangenheit einen Kunden mit sehr viel Geld 
gegeben, der eigentlich M103 haben wollte ....

Entweder das, oder da war seehr viel Alkohol im Spiel :-)

(Zumindest ist das Symptom sehr spezifisch. M128 - return geht schief -> 
M103 Fuse)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.