Ich kann zwar kein Basic, aber sollten da nicht einfach return am Ende der Subroutine stehen und nicht Gosub FStart?
Hallo Leute,
kann mir jemand von euch bitte erklären, warum ich nicht mehr als 12 mal auf eine Sprungmarke im Programm springen kann?
Folgendes Problem: Ich wähle im ersten Menüpunkt zb. Frequenz aus. Dann werde ich im nächsten Menüpunkt aufgefordert die gewünschte Frequenz einzustellen. Jetzt kann ich aber nur 12 mal hoch ODER 12 mal runter ODER 5mal hoch und 7mal runter gehen bevor der Controller resetet.
(Ich hofe ihr habt verstanden wie ich das meine)
Jetzt habe ich die Möglichkeit das Programm zu debugen: Das Programm hängt sich beim 13ten Durchlauf an folgender Stelle auf: LCD F (siehe Code).
Bitte helft mir, ich bin am verzweifeln.Code:$regfile = "m32def.dat" $crystal = 1000000 $baud = 9600 Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.4 , Db6 = Porta.5 , Db7 = Porta.6 , E = Porta.2 , Rs = Porta.1 Config Lcd = 16 * 2 Initlcd 'LCD initialisieren Config Porta.0 = Output 'PortA als Output setzten Config Portd = Input 'PortD Als Input Setzten Dim F As Integer Dim D As Integer Dim Puls As Integer Dim Pause As Integer Taste_1 Alias Pind.2 Taste_2 Alias Pind.3 Taste_ok Alias Pind.4 F = 13 Puls = 150 Pause = 150 Config Debounce = 100 'Entprellzeit für Tester auf 30ms Waitms 20 'warte wegen LCD 'Programm Start '+---------------------------------+ '| Startbildschirm & erste Auswahl | '+---------------------------------+ Cls 'lösche LCD Locate 1 , 1 Lcd "1-> Frequenz" Locate 2 , 1 Lcd "2-> Puls/Pause" Do Debounce Taste_1 , 1 , Fstart , Sub Debounce Taste_2 , 1 , Puls_start , Sub Loop '+---------------------+ '| Frequenz einstellen | '+---------------------+ Fstart: Cls Locate 1 , 1 Lcd "Frequenz = Hz" Locate 1 , 12 Lcd F '<--- genau hier hängt er Locate 2 , 1 Lcd "UP OK DOWN" Do Debounce Taste_1 , 1 , Fup , Sub Debounce Taste_2 , 1 , Fdown , Sub Debounce Taste_ok , 1 , Fok , Sub Loop Fup: F = F + 1 Waitms 15 Gosub Fstart 'Return Fdown: F = F - 1 If F <= 0 Then F = 0 End If Waitms 15 Gosub Fstart 'Return . . . . 'Das Programm geht eigentlich noch weiter, hier aber uninteresant
Ach ja, einen anderen Controller habe ich auch schon ausprobiert.
MfG Ich
-------------------------------------------------------------
http://www.lorenzschulz.de/Roboter.html
Ich kann zwar kein Basic, aber sollten da nicht einfach return am Ende der Subroutine stehen und nicht Gosub FStart?
Jedesmal wenn man etwas mit Gosub anspringt legt der Prozessor die Rücksprungadresse (2 Byte) auf den Stack.Zitat von ogni42
Wenn man nie zurückspringt (Return) dann läuft der Stack irgendwann über und das Programm hängt sich auf.
Genau das ist hier der Fall.
Achso, dass hört sich logisch an.
Aber ich will ja nicht an die Adresse zurück an der ich hin gesprungen bin, sondern weiter zurück.
Wie kann ich das denn realisieren?
MfG Ich
-------------------------------------------------------------
http://www.lorenzschulz.de/Roboter.html
Probiers mal mit "Goto".Zitat von strunz
Werd´s morgen probieren.
Vielen dank für die Antworten...
MfG Ich
-------------------------------------------------------------
http://www.lorenzschulz.de/Roboter.html
evtl. kannst die stacks vergrößern.
im Bascom oben bei den einstellungen.
oder du machst es im programm am anfang selber. besser ist´s wie der kollege schon sagt mit "goto".
Du hast nen typischen Spaghetticode zusammengetippt.
Normalerweise macht man ne "Mainloop", von welcher aus
man in du Unterprogramme springt und von dort zurück.
Klar kann ein Unterprogramm auch subprozeduren oder
Funktionen enthalten, aber der Weg zu einer Funktion sollte
in umgekehrter Reihenfolge wieder rückabgewickelt werden
bis man wieder in der Mainloop ist.
also :
do
gosub x
loop
x:
gosub y
return
end
y:
' hier tu ich was
return
end
Vor den Erfolg haben die Götter den Schweiß gesetzt
ok, danke für all die tipps, es tut nun einwandfrei.
MfG Ich
-------------------------------------------------------------
http://www.lorenzschulz.de/Roboter.html
Bringt gar nix. Damit hängt sich das Programm wieder auf. Nur halt etwas später.Zitat von raptor_79
Wie Vitus schon schrieb muss man das einfach vernünftig programmieren und schon klappt es. (Sorry, nicht bös gemeint).
Lesezeichen