Hallo,
ich habe in dem zitierten Code mal etwas hinzugefügt und markiert. Das Grüne würde ich der Übersicht halber mit aufnehmen, da sonst die Bascom IDE Einstellungen gültig sind, die man nicht immer gegenwärtig hat.

Bei dem roten Gosub liegt ziemlich sicher ein Problem vor. Das Programm verläßt dort das Unterprogramm ohne den Stackpointer richtig zu bedienen, sondern legt eine weitere Rücksprungadresse auf den Stack statt sich die richtige zurückzuholen. Es muß mit Return zurückgesprungen werden! In der "Main" kann das Programm nur wieder zu einem neuen Gosub aber nicht auf ein Return treffen und der Stack wird vermutlich irgendwann überlaufen. Ob da sonst noch Fehler sind hab ich jetzt nicht weiter überprüft.

Zitat Zitat von derrabe Beitrag anzeigen
Code:
$regfile "m88def.dat"
$crystal = 8000000
$swstack = 32
$hwstack = 32
$framesize = 32
$baud = 19200
.
.
Main:
Do
   If Sw1 = 0 Then
     Waitms 4000
     If Sw1 = 0 Then
       Gosub Pumpen
     End If
  End If
Loop
End

Pumpen:
  Set Led
  If Sw1 = 1 Then
    Waitms 4000
    If Sw1 = 1 Then
      Reset Led
      Gosub Main
    End If
  End If
Return

Um die Konstruktion zu umgehen könnte man den SW1 in der Main Loop auf beide Zustände prüfen und dann in jeweils ein Unterprogramm springen. zB:
Code:
Do
  If Sw1 = 0 And Led = Aus Then Gosub Pumpe_an   'Aus ist eine Konstante mit Wert 0
  If Sw1 = 1 And Led = An Then Gosub Pumpe_aus   'Ein ist eine Konstante mit Wert 1
Loop
In den jeweiligen Unterprogrammen kann man dann die 4 Sekunden warten, nochmal SW1 abfragen, eventuell schalten und dann ordnungsgemäß mit Return zurück zum Hauptprogramm.

Eine von vielen Möglichkeiten mit und ohne Timer. So ein waitms hält ja das Programm immer an ...

Gruß
Searcher