PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehr als 12 sprünge auf eine Sprungmarke nicht möglich?



strunz
17.10.2006, 17:17
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).



$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


Bitte helft mir, ich bin am verzweifeln.

Ach ja, einen anderen Controller habe ich auch schon ausprobiert.

ogni42
17.10.2006, 17:27
Ich kann zwar kein Basic, aber sollten da nicht einfach return am Ende der Subroutine stehen und nicht Gosub FStart?

Windi
17.10.2006, 20:02
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.
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.

strunz
17.10.2006, 20:41
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?

Windi
17.10.2006, 20:44
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?
Probiers mal mit "Goto".

strunz
17.10.2006, 21:10
Werd´s morgen probieren.

Vielen dank für die Antworten...

raptor_79
17.10.2006, 21:31
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".

Vitis
18.10.2006, 00:15
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

strunz
18.10.2006, 07:17
ok, danke für all die tipps, es tut nun einwandfrei.

Windi
18.10.2006, 22:11
evtl. kannst die stacks vergrößern.
Bringt gar nix. Damit hängt sich das Programm wieder auf. Nur halt etwas später.

Wie Vitus schon schrieb muss man das einfach vernünftig programmieren und schon klappt es. (Sorry, nicht bös gemeint).

strunz
19.10.2006, 09:38
Habs jeztzt so wie VITUS erklärt gemacht. Jetzt kann ich immerhin um 50 werte hoch und runter gehen. HAbe dann noch den Stack erweitert, jetzt reicht mir das.