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
End am Ende ist eigentlich nur ein Do-Loop damit die CPU sich nicht hinten durch den Speicher durchfrisst und Unsinn ausführt
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
@Gast Das ist unfair. Du hast in die Doku geschaut :-)
"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"?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.