mikrocontroller.net

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


Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: mmerten (Gast)
Datum:

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

Autor: Martin (Gast)
Datum:

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

Autor: Ralf Hochhausen (ralf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß,
Ralf

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eike Frerichs (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
  * ...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Elektrikser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.