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 von
derrabe
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
Lesezeichen