es funktioniert einfach nicht..
Erstmal was grundlegendes. wann muss ich "sub" am ende des befehls
schreiben und wann nicht?
wann schreibt man den befehl "end " in dem programm? wofür überhaupt?
muss man den schreiben?
warum funktioniert dieses programm?
Do
Debounce Pind.0 , 0 , Schalter , Sub
Loop
Schalter:
Toggle Portb.0
Return
End
Remarks
Px.y
A port pin like PINB.0 , to examine.
State
0 for jumping when PINx.y is low , 1 for jumping when PINx.y is high
Label
The label to GOTO when the specified state is detected
SUB
The label to GOSUB when the specified state is detected
"When you specify the optional parameter SUB, a GOSUB to label is
performed instead of a GOTO."
Auf Deutsch, wenn du optional den Parameter Sub angibst springt er zum
Unterprogram mit dem Label angegebenen Namen
danke!
ich habe das buch auf deutsch :)
verstehe es trotzdem nicht wann "sub" dahinter soll.
eigentlich wenn ein sprung in eiene subroutine erfolgen soll..
was ist eien subroutine?
ist das da unten eine?
Do
Debounce Pind.0 , 0 , Schalter , Sub
Loop
Schalter:
Toggle Portb.0
Return
End
"was ist eien subroutine?"
Autsch. Ist das Dein Ernst? Da fehlen aber noch viele Grundlagen...
Subroutine = Unterprogramm. Wird mit "return" abgeschlossen und
springt nach Ausführung wieder zu dem Punkt zurück, von dem aus es
ausgeführt wurde. Aufruf mit "Gosub", ganz im Gegensatz zum "Goto".
muss man eine Subroutine nicht mit "declare sub xyz" deklarieren?
und wird die nicht mit "call xyz" aufgerufen?
zb.:
Beispiel1:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
declare sub xyz
do
call xyz
loop
sub xyz
blabla
end sub
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Besipiel2:
do
gosub xyz
loop
xyz:
blabla
return
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Uebrigens wo (wenn ueberhaupt) schreibe ich jetzt "End" dahinter..
wofuer eigentlich? muss ich das bei einer endlossschleife a la"do
loop" ?
Uebrigens "Debounce" befehlhabe ich zurseite gelegt.
habe mich gestern (nicht lachen) 6 stunden damit beschaeftigt.
Jetzt weiss ich , dass der nicht richtig funktioniert und irgendeine
make hat.. woran das genau liegt kann ich mir bis jetzt nicht
erklaeren..
der fuehrt einen einfachen sprung aus, zb. LED in einer subroutine
toggeln. bei meinem programm hat er aber nix gemacht. obwohl die
Subroutinen identisch waren..
d.h.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
so funktioniert nicht(macht nur LEDs togglen, den rest nicht):
do
debounce pina.0 , 1 , label1, sub
loop
label1:
toggle portb.1
bla bla
blabla
blaaaa
blablaaa
return
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
und so funktioniert:
do
gosub label1
loop
label1:
toggle portb.1
bla bla
blabla
blaaaa
blablaaa
return
wobei die subroutinen absolut identisch sind!!!!!!!!!!!!!!!!!!
kann doch nicht?!?!?!?!?!?! irgendwo greift deiser befehl "debounce"
noch ein , und es klappt nicht :((
Declare Sub Label1
Config Porta = 0
Config Portb = &B00000010
Do
Debounce Pina.0 , 1 , Label1 , Sub
Loop
End
Label1:
toggle portb.1
bla bla
blabla
blaaaa
blablaaa
End Sub
Versuchs doch bitte mal so :).
Beste Gruesse
Das End kommt einfach hinter die Hauptschleife. Falls dein Programm doch
mal die Schleife verlaesst, findet es im End wieder eine Schleife vor.
Damit wird verhintert, dass der µC unkontrolliert irgendwas ausfuehrt,
was er grad im Flash findet.
Bei Bascom gibts 2 Formen von Subs:
Die erste wird mit "Gosub xx" aufgerufen:
Diese Subs werden mit "return" abgeschlossen und nicht deklariert.
Die anderen werden mit "Call xx" aufgerufen. Moechte man Parameter
mit uebergeben, muss man dieses "Call" auch hinschreiben.
Parameterlose Subs koennen alternativ einfach mit "xx" aufgerufen
werden, da sie deklariert werden MUESSEN und der Compiler somit weiss,
dass "xx" der Name einer Sub ist. Diese Subs werden mit "End sub"
abgeschlossen.
Aus den Gosub-Subs kann man einfach durch ein zweites "return" (in
einem "if...then return" beispielsweise) springen. Dies kann man
nicht auf die Call-Subs uebertragen. Ein zweites "End Sub" innerhalb
einer dieser Subs fuehrt im Normalfall zu Chaos: End Sub kommt nur ans
Ende. Um die Sub mittendrin zu verlassen, nutzt man "Exit sub".
Beste Gruesse
Sorry fuer den 3-Fach Post. Ich warte sehnlichst auf die Edit-Funktion:
"Das End kommt einfach hinter die Hauptschleife. Falls dein Programm
doch
mal die Schleife verlaesst, findet es im End wieder eine Schleife vor.
Damit wird verhintert, dass der µC unkontrolliert irgendwas ausfuehrt,
was er grad im Flash findet."
Bevor wieder einer dieser netten kleinen "Kruemelkacker"
hervorgerochen kommt: Das Programm wird natuerlich keine Schleife
verlassen, das war nicht ganz korrekt ausgedrueckt. Der AVR wird es tun
(unter Umstaenden zumindest...)
@ andre
und wenn man "end" ganz unten hinter den ganzen subroutinen schreibt
ist das falsch? oder bewirkt das was anderes?
weil mal sieht man es so , mal so.. das verwirrt einen unheimlich. was
bewirkt befehl "stop" im gegensatz zu dem befehl "end"?
du schreibst , dass man die subroutinen nicht deklartieren muss und
mit return verlassen kann..
in dem beispiel hast du es aber deklariert und mit "end sub "
verlassen... das moechte ich verstehen.. warum?
bewirkt der befehl "return" in einer subroutine das selbe wie der
befehl "exit sub"?
zu dem da oben.. "return" kehrt zurueck in die hauptschleife auf die
position wo die verlassen wurde.. stimmts?
und "exit sub" verlaesst einfach die subroutine .. wohin geht es
dann? in die do loop schleife? an welche position? oder ist dann
ende?
so viele fragen :)
ei weh. Also:
Das End gehoert normalerweise unter die Hauptschleife. Danach kommen
die Subs, Funktionen und was auch immer. So mache ich es immer. Wie
sich das Programm in anderen Faellen verhaelt, weiss ich nicht. Ich
vermute aber, dass die Subs dann "dazwischencompiliert" werden und
das "End" nutzlos machen.
"bewirkt der befehl "return" in einer subroutine das selbe wie der
befehl "exit sub"?"
Jaein. "Return" bewirkt in einer Gosub-Sub das gleiche wie "Exit
sub" in einer Call-Sub.
@Hans Peter:
Du hast das misverstanden:
Das "Return" am Ende einer Gosub-Sub laesst den µC ganz klar zurueck
zu dem Befehl in der Mainloop springen, der nach dem "Gosub"
ausgefuehrt werden soll. Das gleiche macht "End Sub" bei Call-Subs.
Nun ist es aber oft so, dass man eine Sub nicht ganz durchlaufen will,
um an den abschliessenden Ruecksprungbefehl zu kommen, sondern dass man
die Sub unter bestimmten Bedingungen FRUEHZEITIG verlassen moechte. In
diesem Fall nutzt man "Return" (wie der normale Ruecksprungbefehl)
bei Gosub-Subs und "Exit sub" bei call-subs
Beispiel:
Gosub blah
End
blah:
irgendwas
if a= 0 then return 'fruehzeitiger Abbruch
irgendwas
return
Alternativ:
declare sub blah
blah
end
sub blah:
irgendwas
if a =0 then exit sub 'fruehzeitiger Abbruch
irgendwas
end sub
Ich persoenlich empfehle, immer die Call-Subs zu verwenden, da sie doch
einige Vorteile bieten (zb Parameteruebergabe). Dies wird bei ISRs
beispielsweise leider ausgeschlossen, da diese IMMER als Gosub-Subs
ausgefuehrt sind.
Beste Gruesse,
André
"und "exit sub" verlaesst einfach die subroutine .. wohin geht es
dann? in die do loop schleife? an welche position? oder ist dann
ende?"
Der AVR springt auch zurueck in die Hauptschleife. Nur eben
fruehzeitig, bevor die Sub komplett ausgefuehrt ist.
Beste Gruesse
Andre danke sehr!!!!!!
Nur noch letzte frage , dann hoere ich auf dich zu nerven...
das programm da unten von dir..
wenn man die subroutinemit "label:" anfaengt , muss man die mit
"return" verlassen? oder ist egal ob "return" oder "end sub"?
weil wenn ich das so an besipielen sehe muss:
label:
bla bla
return
oder
sub label
bla bla
end sub
aber nicht
label:
bla bla
ens sub
Declare Sub Label1
Config Porta = 0
Config Portb = &B00000010
Do
Debounce Pina.0 , 1 , Label1 , Sub
Loop
End
Label1: <-- die zeile
toggle portb.1
bla bla
blabla
blaaaa
blablaaa
End Sub <-- die zeile
"Label" ist ein frei gewaehltes Wort als Name der Sub. Du koenntest
stattdessen auch "Baum" nehmen. Ob du mit return oder end sub
abschliessen musst, entscheidet sich erst dadurch, wie du sie
aufrufst.
Du kannst eine Sub namens Label also abschliessen, wie du willst,
solang der ganze Rest dazu passt.
Beste Gruesse