- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Mittels goto an Programmanfang springen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348

    Mittels goto an Programmanfang springen

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    ich hätte folgende Frage, ich würde gerne um einen µC Reset zu erzeugen mittels Goto-Befehl an den Anfang meines Programmes springen. Bzw. an einen Punkt nach der Hardwarekonfiguration und vor den Variablenzuweisungen.

    Ist das möglich?

    Was passiert mit den Variablen wenn sie neu erstellt werden? Sie müssten doch dann alle wieder unbeschrieben sein oder?

    Gruß

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Hey,

    wenn du mit dem Goto an eine Stelle springst wo du die Variablen auf 0 setzt geht das (nicht an die Stelle wo du die Variablen deklarierst).
    Generell kannst du so einen "Reset" auslösen.
    Du kannst den Reset aber auch z.B. auslösen indem du den Reset-Pin per Transistor schaltest.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    Das mit dem Resetpin usw. kenne ich.

    Ich wollte aber eigentlich nur die Variablen "richten" keinen Hardwarereset. Das heißt ich müsste mir eine Funktion schreiben in der alle Variablen gerichtet werden.

    Was passiert denn wenn ich an den Punkt springe an dem die Variablen deklariert werden? Hängt sich der µC dann auf oder so?

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.655
    ... einen µC Reset ... mittels Goto-Befehl an den Anfang meines Programmes springen ...
    Die Frage lässt vermuten, dass Du Dinge vorhast, die unschön sind - oder dass Dein Programm vermeidbare Macken hast. Ich spreche da aus Erfahrung - leider.

    Watchdog-Reset hier ausführlich, in Bascom hier.

    Zitat Zitat von demmy Beitrag anzeigen
    ... Resetpin usw. kenne ich ... wollte aber eigentlich nur die Variablen "richten" ...
    Für solche Zwecke - Einrichten von VARIABLNE - habe ich in fast allen Programmen eine Routine

    Code:
      void init_KO_lst(void) ;      // Vorgabe von Konstanten in dieser Liste
    da weiß ich dann recht genau, was ich tue . . . denn bekanntlich tut der Computer/Controller immer das was man ihm sagt, das ist aber nicht immer das, was man meint, ihm gesagt zu haben.
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    da weiß ich dann recht genau, was ich tue . . . denn bekanntlich tut der Computer/Controller immer das was man ihm sagt, das ist aber nicht immer das, was man meint, ihm gesagt zu haben.
    das hast du schön gesagt.

    Also was ich genau vor habe ist, wenn ein bestimmter Befehl über die UART rein kommt, soll der µC an den Anfang des Programmes springen (aus der Hauptschleife raus) und sein Programm von vorne anfangen ohne komplett neu gestartet zu werden. Da vor der Hauptschleife einmalig ein paar Berechnungen stattfinden. Dazu müsste ich ein paar Variablen zurücksetzen und eben auf den besagten Punkt springen. Ich denke so ein "Softwarereset" müsste doch ohne Probleme mittels einer Routine zum Richten der Variablen und der Verzweigung auf einen Einstigespunkt möglich sein oder?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Es dürfte wohl kein Problem sein, mittels eines GOTO vor die Deklaration der Variablen zu springen.

    Was passiert mit den Variablen wenn sie neu erstellt werden? Sie müssten doch dann alle wieder unbeschrieben sein oder?
    Das kann man wunderschön im Simulator testen! Ich habe es gerade versucht, und die Variablen bleiben absolut unverändert! Sie durch erneutes Deklarieren auf 0 zu setzen, funktioniert wenigstens in der Simulation nicht.

    Da wirst Du wohl um eine Rücksetz-Routine nicht herumkommen...

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    52
    Beiträge
    765
    Wenn UART Empfang nicht in der Hauptschleife ausgewertet wird, passen die Werte auf dem Stack nicht. Irgendwann wird dieser dann überlaufen.
    Ich würde für die Berechnungen am Anfang des Programmes eine Sub erstellen und diese dann nach dem bestimmten UART Befehl aufrufen.

    Goto 0 springt an den Anfang des Programmes (Adresse 0). Dort wird normal auch alles neu initialisiert. Aber so weit wolltest Du ja nicht zurückspringen. Ich nutze für einen Reset
    immer den Watchdog. Einfach einschalten und dann ein do:loop hinterher und der AVR startet neu.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.655
    Zitat Zitat von demmy Beitrag anzeigen
    ... Da vor der Hauptschleife einmalig ein paar Berechnungen stattfinden ...
    Die doofe Bemerkung vorneweg: ich kenn mich mit Bascom nicht aus, ich programmiere in C, sehr selten in Assembler. Ne Vermutung hinterher: kann es sein, dass es bei Bascom Direktiven für den Präprozessor gibt (den Präprozessor müssts doch da auch geben)?

    Feststellung: Wenn ich vorneweg EINMALIG ein paar Berechnungen anstelle, dann nenne ich diese Werte ("... ein paar Variablen zurücksetzen ...") aber KONSTANTEN. Diese Berechnungen lasse ich dann nach Möglichkeit vom Präprozessor erledigen, das spart Programmspeicher. Auch wenn Programmspeicherplätze bei mir selten ein Problem sind. Und ne Konstante muss ja nicht online oder im Controller berechnet werden. WENN sie neu berechnet würde - dann müssten sich doch die Gegebenheiten ändern/geändert haben . . . oder versteh ich da was falsch?

    Nochne Vermutung: kann es sein, dass es bei Dir garnicht um Berechnungen im Controller geht - sondern im Präprozessor? Irgendwie sind solche Fragereien gelegentlich mit eher nicht vollständiger oder unklarer oder .... Problembeschreibung verbunden.
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Man kann mit Goto 0 an den Programmanfang springen und wenn das NOINIT nicht gesetzt ist werden dann auch die Variablen auf Null gesetzt, aber, es hat ja einen Grund warum Du das Programm neu starten willst, eine Fehlfunktion z.B. und es werden eben nur die Varablen neu gesetzt, der Stack bleibt. Wenn Dein Programmfehler in nem Überlauf besteht, dann geht das so in einem fort
    Besser ist es einen kompletten Reset durchzuführen, auch für die Peripherie, sprich, zum Einen per Watchdog einen Reset herbeiführen und in der Startroutine Deines Programmes z.B. nen externen AD-Wandler vor der Initialisierung zu resetten.
    Der Vorteil ist auch, dass ggf. ein Bootloader dann ausgeführt werden kann für Firmwareupdates, da der noch vor dem Programmstart ausgeführt wird.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    Hi zusammen,
    nein nein, es handelt sich nicht um eine Fehlfunktion oder ähnliches. Es ist etwas komplizierter das hier zu erklären und würde sicher den Rahmen hier sprengen.

    Bei der Problematik mit den Konstanten / Variablen gebe ich dir nur bedingt recht. Wenn es sich um Konstanten handelt, dann hätte ich sie auch so bezeichnet. In Wirklichkeit sind es aber Variablen, deren Startwert berechnet wird, die dann aber im laufenden Programm überschrieben werden.

    Ich habe es jetzt so gelöst, das ich mittels goto an einen definierten Startpunkt springe, da vor diesem Startpunkt noch Verzögerungszeiten / Wartezeiten / Berechnungen usw. ausgeführt werden. Die wirklich nur bei einem kompletten neustart des Systems einmalig benötigt werden um angeschlossene , ich bezeichne sie jetzt mal als "Pheripherie" zu Initialisieren bzw. Ihr Zeit zum Anlaufen zu geben.

    Was ich erreichen wollte ist im Prinzip nur ein simpler "Softwarereset", wo an einem definierten Punkt wieder neu ins Programm eingesprungen wird.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. An bestimmte Programmstelle springen
    Von petzi-- im Forum Robby RP6
    Antworten: 12
    Letzter Beitrag: 17.10.2012, 19:56
  2. if then else Schleife möglich mit goto zu verlassen?
    Von mat-sche im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 27
    Letzter Beitrag: 14.04.2009, 09:17
  3. Bootloader goto addresse bei Mega644 ?
    Von Keksdose im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 01.04.2007, 19:09
  4. goto ist böse
    Von _maddin im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 11.02.2007, 16:58
  5. Frage zu Goto und Return
    Von Murus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 20.04.2006, 11:28

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests