Bascom AVR Simulator Verständnisproblem

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Bascom AVR Simulator Verständnisproblem

      Moin Leute,

      nach 12 Jahren Bascom-Abstinenz versuche ich mich gerade wieder einzuarbeiten. Weiß nur noch wenig von damals. Ich habe ein kleines Progrämmchen geschrieben und dafür die Simulation gestartet.
      Frage 1: Wenn ich oben in der Leiste "LED" anklicke, sehe ich ja die Ein-und Ausgänge des Attiny. Grün sollen wohl die Eingänge sein, rot die Ausgänge?
      Weil zunächst erstmal gar nix passierte, habe ich in meinem Progrämmchen den Ausgang D6 auf 1 gesetzt und war so naiv, zu glauben, dass jetzt der Punkt PD6 rot leuchtet.
      Tut er aber nicht.
      Frage 2: Warum stoppt das Programm sofort nach Start und der Pfeil zeigt auf Zeile 53? Ist im Anhang...

      Gruß
      Dateien
      • DEMO.JPG

        (105,51 kB, 36 mal heruntergeladen, zuletzt: )
    • Kannst du bitte dein Programm immer als Text anhängen. (auf </> klicken)
      Als Grafik kann man es sehr schlecht in die Bascom-IDE kopieren um dein Problem zu testen.
      Und das Bild hat 20x mehr Speicher als Text.

      Den Ausgang kannst du im Simulator nicht setzen, das geht nur mit den Eingängen.
      Dein Programm stoppt, weil die keine Rücksprungadresse hast.
      Die IF-Abfrage ist nicht erfüllt, die Elseif auch nicht, also wird das Label Initialisierung abgearbeitet und trifft dort auf ein Return.

      Das Return sollte auch immer am Ende der Unterprogramms stehen und nicht zwischendrin. Notfalls mit Goto ans Ende sprongen.

      Welche Bascom-Version benutzt du?
    • Mit einem do in Zeile 30 und ihr loop in 40 funktioniert es. Auch wenn die Initalisierung: unkonventionell ist arbeitet sie korrekt. Das Else (Zeile 54) kann gespart werden wenn das Loop (Zeile 55) zu Zeile 58 verschoben wird.

      Krakeman schrieb:

      der Punkt PD6 rot leuchtet.
      Tut er aber nicht.
      Sollte er aber. Der Button "refresh Variables" (links neben Terminal) muß aktiviert werden damit die "LEDs" funktionieren. Die grünen gehen leider nicht mit an :( Der Simmulator vermutet wohl einen Kurzschluß auf allen Pinns :D
    • Pluto25 schrieb:

      Mit einem do in Zeile 30 und ihr loop in 40 funktioniert es. Auch wenn die Initalisierung: unkonventionell ist arbeitet sie korrekt. Das Else (Zeile 54) kann gespart werden wenn das Loop (Zeile 55) zu Zeile 58 verschoben wird.

      Krakeman schrieb:

      der Punkt PD6 rot leuchtet.
      Tut er aber nicht.
      Sollte er aber. Der Button "refresh Variables" (links neben Terminal) muß aktiviert werden damit die "LEDs" funktionieren. Die grünen gehen leider nicht mit an :( Der Simmulator vermutet wohl einen Kurzschluß auf allen Pinns :D
      Jupp, hast recht, der PIN leuchtet jetzt, leider bleibt das Programm stehen, wenn ich den Hardwaresimulator starte ?( Liegt das an Win 11, dass das alles nicht mehr so funzt? Ich starte Bascom im Win7 Kompatibilitätsmodus
    • Michael schrieb:

      Kannst du bitte dein Programm immer als Text anhängen. (auf </> klicken)
      Hi, habe ich versucht, dann hieß es, mein Beitrag hat mehr wie 1000 Zeichen. Beim Abarbeiten des Befehls Gosub springt das Programm doch zum Label und beim Return in die Zeile nach dem Gosub- Befehl, zumindest war das in Basic so. Somit wäre doch eine Rücksprungadresse vorhanden, oder nicht? Sehe ich das falsch? Ist übrigens Bascom 2.0.7.9. Zum alternativen Sprung: Also müsste ich ein Label erstellen, das nur den Return- Befehl enthällt?
    • Krakeman schrieb:

      Hi, habe ich versucht, dann hieß es, mein Beitrag hat mehr wie 1000 Zeichen.
      Wie gesagt, beim Posten auf </> klicken, da kannst du dein Programm hineinkopieren.
      Der Beitrag selbst sollte für den beschreibenden Text benutzt werden.
      Große Programme kannst du normal als Anhang (unten bei Dateianhänge) anhängen.

      Krakeman schrieb:

      Beim Abarbeiten des Befehls Gosub springt das Programm doch zum Label und beim Return in die Zeile nach dem Gosub- Befehl
      Schon richtig, nur in deinem speziellen Fall ist die IF-Abfrage nicht erfüllt und danach kommt das Label mit einem Return.
      Da es vorher kein Gosub zum Return gab, (das If war ja nicht erfüllt), gibt es auch keine Rücksprungadresse auf dem Stack - also Crash.

      Krakeman schrieb:

      Ist übrigens Bascom 2.0.7.9
      Hast du die Demo-Version?

      Krakeman schrieb:

      Zum alternativen Sprung: Also müsste ich ein Label erstellen, das nur den Return- Befehl enthällt?
      Hier mal ein schlechtes Beispiel:
      Label:
      If irgendwas Then
      Return
      End If

      Und hier, wie es besser sein sollte:
      Label:
      If Irgendwas Then
      Goto Ende
      End If
      Ende:
      Return
    • Michael schrieb:

      Dein Programm stoppt, weil die keine Rücksprungadresse hast.
      Habe dieses Testprogramm geschrieben. Man deutlich sehen, dass das Programm nach Return auf die Zeile unter Gosub springt. Warum bei mir nicht?
      Do
      waitms 500
      Gosub Mach_was
      waitms 500
      Loop
      End
      'Unterprogramm
      Mach_was:
      waitms 500
      Return

      Hier nochmal mein Programm-Ausschnitt:

      if pinB.0 = 1 and Merker2 = 0 then
      Merker1 = 1
      gosub Initialisierung
      end if
      Initialisierung:
      do
      Portd.1 = 1
      Portd.0 = 1
      if pinb.0 = 0 then
      Merker1 = 0
      Portd.0 = 0
      Portd.1 = 0
      Merker2 = 1
      return
      else
      loop


      end if
    • Michael schrieb:

      Schon richtig, nur in deinem speziellen Fall ist die IF-Abfrage nicht erfüllt und danach kommt das Label mit einem Return.
      Jetzt habe ich den Fehler: Das Programm springt nach Initialisierung, geht mit Return tatsächlich unter die Gosub-Zeile und trifft dann wieder auf Return. So langsam kommt es alles wieder, was ich in den letzten 10 Jahren verdrängt habe :thumbup: . Vielen Dank zunächst. Dann kann es ja weitergehen mit meiner vollautomatischen Zigarettenstopfmaschine :D

      Pinb.0 = 0
      if pinB.0 = 0 and Merker2 = 0 then
      Merker1 = 1

      gosub Initialisierung

      end if

      Initialisierung:
      do
      Portd.1 = 1
      Portd.0 = 1
      if pinb.0 = 0 then
      Merker1 = 0
      Portd.0 = 0
      Portd.1 = 0
      Merker2 = 0
      return
      else
      loop


      end if

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Krakeman ()

    • Krakeman schrieb:

      Warum bei mir nicht?
      Deine IF-Abfrage ist nicht erfüllt

      Krakeman schrieb:

      Hier nochmal mein Programm-Ausschnitt:
      Beim Posten erscheint im Antwortfenster oben eine Leiste mit Symbolen, dort das Symbol </> nutzen.

      Dein Programm-Ausschnitt ist nur ein Ausschnitt.
      Poste Programme bitte immer komplett mit Header.
      Anfänger vergessen nämlich oft die banalsten Dinge wie Stackwerte.
      Auch Variablenfehler werden so sichtbar.
    • @Krakeman
      Mir persönlich würde es innerlich widerstreben, ein Return irgendwo innerhalb einer If-Abfrage zu verstecken.
      Du hast ja selbst schon geschrieben, wie der Aufbau eines Unterprogrammes aussehen sollte (beginnt mit Label, endet mit Return)

      Krakeman schrieb:

      'Unterprogramm
      Mach_was:
      ...Anweisung
      Return

      Davon würde ich in der Regel auch nicht abweichen. So bleibt der Code viel übersichtlicher und Fehler werden leichter gefunden.
      Spätestens wenn Du aus einem Unterprogramm in ein weiteres Unterprogramm springen möchtest, wirds mit solchen "If-Else-Return-End If Konstrukten" echt unübersichtlich.

      Deinen Programm-Ausschnitt würde ich persönlich eher so aufbauen:

      BASCOM-Quellcode

      1. Initialisierung:
      2. Do
      3. Portd.1 = 1
      4. Portd.0 = 1
      5. Loop until PinB.0 = 0
      6. Merker1 = 0
      7. Portd.0 = 0
      8. Portd.1 = 0
      9. Merker2 = 0
      10. Return

      Macht genau das gleiche wie Dein Code, ist nur deutlich einfacher zu lesen. ;)