Forum: Mikrocontroller und Digitale Elektronik ATMEGA128: Probleme mit "Return"


von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hatte für eine Rolladensteuerung einen ATMEGA 168 vorgesehen und
nun bemerkt, daß der Flash viel zu klein ist. Daher möchte ich nun
einen ATMEGA 128 verwenden. Doch da gibt es beim Umstieg auf den
anderen Prozessor schon die ersten Probleme mit dem "Return-Befehl":

Nach dem Abarbeiten des Unterprogramms springt das Programm nicht an
die Stelle zurück, wo es aufgerufen wurde.

Hier die Hard- und Softwareumgebung:
* ATMEGA128-16
* GNU-Compiler
* AVR-Starterkit + Zusatzplatine mit TQFP-Schnellspannsockel
* AVR-Studio 4.11

Das kleine Testprogramm sieht wie folgt aus:


// *****  Hauptprogramm  *********
int main ()
  {
  ucTest = test1();
  test2();
  for (;;)
  {
    ;  // Do nothing
  }
    return (0);
  }


// *****  Unterprogramm 1 *********
int test1(void)
  {
  ucZaehler_1++;
  ucZaehler_2--;
  return(ucZaehler_1);
  }

// *****  Unterprogramm 2 *********
void test2(void)
  {
  ucZaehler_1--;
  return;
  }


Das Unterprogramm "test1" wird abgearbeitet, aber zum Unterprogramm
"test2" kommt das Programm erst gar nicht. Woran kann es liegen? Bin
schon am verzweifeln....

Anbei das C-File und Make-File.

von mmerten (Gast)


Lesenswert?

auch den M103 Kompatibilätsmode ausgeschaltet ? sonst geht beim Mega128
die Stack Initialisierung in`s "Leere"

von Martin (Gast)


Lesenswert?

wie schaltet man den M103 Kompatibilätsmode aus? Per Quellcode oder muß
man mit dem Programmer ein Bit "rein brutzeln"?

von Ralf H. (Gast)


Lesenswert?

Hallo,

den Kompatibilitätsmodus kann man über die Fusebits abschalten
(extended fuse byte).

Gruß,
Ralf

von Martin (Gast)


Lesenswert?

hab versucht, das Bit zu verändern. Leider komme ich nicht in den
Programmiermodus. Das Programm meldet "Error entering programme mode"
oder so ähnlich....

Muß man da irgend wie den Emulator-Modus ausschalten, um in den
Programmiermodus zu kommen?
Oder muß man an den Frequenzen vom AVR-Testboard was ändern? Welche
Einstellungen der Frequenzen (Board und ISP) sind sinnvoll?

von Rahul (Gast)


Lesenswert?

>Muß man da irgend wie den Emulator-Modus ausschalten, um in den
Programmiermodus zu kommen?

Ja, drück die Stopp-Taste oben in der Debugger-Zeile, oder SHIFT-F5.

von Martin (Gast)


Lesenswert?

Der Emulator war angehalten, als ich es probiert habe. Hab gedacht es
gibt da so ein Debug-Bit wie beim Atmega 88 bzw. 168, daß man
deaktivieren muß, bevor man programmieren kann.

Ich hatte auch mit dem Atmega88 / 168 diverse Probleme beim
Programmieren. Aber nach dem Verstellen der Frequenzen ging das
eigentlich. Könnte es auch am PC liegen, daß es Probleme macht?

von Lars (Gast)


Lesenswert?

Hi,

mal ein paar Fragen:
- main:
  an wen oder was soll das Programm einen Wert zurückgeben?
  bei mir heisst es immer void main (void)!
- test1:
  gibt einen Integer-Wert zurück. ucZaehler_1 ist ein vermutlich ein
  unsigned char. Das sollte so noch funktionieren, wenn auch unsauber
- test2
  hat keinen Rückgabewert weil void. Wozu ein return?? Ob das
  funktionieren soll oder kann hab ich noch nicht probiert, der
  Compiler sollte aber maulen.

Test1 müsste also noch gehen, in main würde ich void machen und ohne
return(0). Bei test2 würde ich mir das return schenken. Vielleicht
hilfts!?

Oder liege ich hiermit völlig falsch?

Viele Grüße

von Rahul (Gast)


Lesenswert?

>void main (void)
ist C++- aber nicht C-Konform. Die Main eines C-Programms liefert immer
einen Wert zurück. Bei Mikrocontroller-Programmen erledigt sich das eh
durch die Endlosschleife.

von Karl H. (kbuchegg)


Lesenswert?

> Oder liege ich hiermit völlig falsch?

So ziemlich.

Das Problem des OP ist mit 99% Sicherheit der eingeschaltete
Kompatibiliaetsmodus M103.

Deine Analyse:
ad 1) nun. Im C Standard ist vorgeschrieben dass main() einen
      Returntyp von int hat. Theoretisch gilt dies nur in einem
      sog. 'hosted environment' und ob ein µC ohne Betriebssystem
      als solches angesehen werden kann, ist fraglich. Dann
      wären allerdings auch andere Return-typen erlaubt. Kratzt
      aber den gcc herzlich wenig, der möchte trotzdem einen
      int sehen.

ad 2) geb ich dir recht. Ist von der Sprache her etwas unsauber
      programmieren.

ad 3) Warum sollte der Compiler hier maulen?
      Auch in einer void Funktion kann man nach Herzenslust
      'return'-en.

von Martin (Gast)


Lesenswert?

Hallo,

das Problem ist gelöst! Es lag am Kompatibiliaetsmodus M103. Da wäre
ich selber nie drauf gekommen.

Und das Programmieren der Fuses funktioniert nun auch. Man sollte das
Flachbandkabel richtig herum stecken - dann geht es problemlos...

Und was das Programmieren betrifft, da hab ich noch nicht all zu viel
Erfahrung.

Nochmals vielen Dank für Eure Hilfe!

Martin

von Eike Frerichs (Gast)


Lesenswert?

Kann mir jemand sagen welche fuse bits ich setzen muss damit der befehl
(RET) return unterprogramm funktioniet !

von Karl H. (kbuchegg)


Lesenswert?

> Kann mir jemand sagen welche fuse bits ich setzen muss damit der befehl
> (RET) return unterprogramm funktioniet !

Wenn du das gleiche Problem hast, wie der OP, dann steht
die Lösung doch schon da: MP103 Fuse

Ansonsten: Es gibt viele Möglichkeiten warum ein return
in die Hose geht. Abgesehen von der MP103-Fuse beim Mega128
und einem Stackoverflow haben alle anderen Möglichkeiten
praktisch immer damit zu tun, dass du einen Programmierfehler
im Programm hast.
Das könnte sein
  * Stackoverflow
  * Array Zugriff out of Bounds
  * Zugriff über einen Pointer der in den Wald zeigt
  * ...

von Peter D. (peda)


Lesenswert?

Auch wenns schon veraltet ist, Rolladensteuerung mit Mega128 finde ich 
hoffnungslos oversized.

Da reicht doch schon ein ATTiny13 dicke aus.

Was ist denn das bloß für ein Monsterprogramm ?

Wird etwa die Rolladenpostion per Kamera und Bildverarbeitung ermittelt 
und auf nem Grafikdisplay animiert dargestellt ?


Peter

von Elektrikser (Gast)


Lesenswert?

>Wird etwa die Rolladenpostion per Kamera und Bildverarbeitung ermittelt
>und auf nem Grafikdisplay animiert dargestellt ?

Beim ersteren hätte der Mega128 auch ein Problem, da wäre ein ARM 
vielleicht besser.
Das zweite wäre eine schöne Spielerei, aber bei jedem Rollo?

Gruß Gerd

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.