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.
auch den M103 Kompatibilätsmode ausgeschaltet ? sonst geht beim Mega128 die Stack Initialisierung in`s "Leere"
wie schaltet man den M103 Kompatibilätsmode aus? Per Quellcode oder muß man mit dem Programmer ein Bit "rein brutzeln"?
Hallo, den Kompatibilitätsmodus kann man über die Fusebits abschalten (extended fuse byte). Gruß, Ralf
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?
>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.
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?
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
>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.
> 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.
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
Kann mir jemand sagen welche fuse bits ich setzen muss damit der befehl (RET) return unterprogramm funktioniet !
> 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 * ...
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.