Bascom Debounce-Befehl.. Ich bin am verzweifeln!

Gast #334369
Lesenswert?
• ▲
▼
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
Gast #334371
Lesenswert?
• ▲
▼
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
Gast #334372
Lesenswert?
• ▲
▼
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
Gast #334374
Lesenswert?
• ▲
▼
"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".
Gast #334375
Lesenswert?
• ▲
▼
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" ?
Gast #334376
Lesenswert?
• ▲
▼
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 :((
#334378
Lesenswert?
• ▲
▼
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
#334379
Lesenswert?
• ▲
▼
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...)
Gast #334380
Lesenswert?
• ▲
▼
@ 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?
Gast #334382
Lesenswert?
• ▲
▼
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 :)
#334383
Lesenswert?
• ▲
▼
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é
Gast #334385
Lesenswert?
• ▲
▼
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
#334386
Lesenswert?
• ▲
▼
"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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.