ATMEGA128: Probleme mit "Return"

Gast #332023
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.
Angehängte Dateien:
Gast #332027
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?
Gast #332029
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?
Gast #332030
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
#332032
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.
Gast #332033
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
#483365
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
  * ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren