Forum: Mikrocontroller und Digitale Elektronik Bascom Debounce-Befehl.. Ich bin am verzweifeln!


von Hans Peter (Gast)


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

von Gast (Gast)


Lesenswert?

End am Ende ist eigentlich nur ein Do-Loop damit die CPU sich nicht
hinten durch den Speicher durchfrisst und Unsinn ausführt

von Gast (Gast)


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

von Hans Peter (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

@Gast

Das ist unfair. Du hast in die Doku geschaut :-)

von thkais (Gast)


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".

von Hans Peter (Gast)


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" ?

von Hans Peter (Gast)


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 :((

von André K. (andre-)


Lesenswert?

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

von André K. (andre-)


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

von André K. (andre-)


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...)

von Hans Peter (Gast)


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?

von Hans Peter (Gast)


Lesenswert?

bewirkt der befehl "return" in einer subroutine das selbe wie der
befehl "exit sub"?

von Hans Peter (Gast)


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 :)

von André K. (andre-)


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é

von André K. (andre-)


Lesenswert?

"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

von Hans Peter (Gast)


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

von André K. (andre-)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.