Hallo Leute, ich versuche mich seit einer kurzen zeit mit einer ganz einfachen Select Case Anweisung, nur will es nicht funktioniert es ist schon so einfach das man normaler wei se keine fragen stellen sollte über das kleine Programm. ABER es geht einfach nicht, warum was ist an den schei... kleinen Programm nicht in Ordnung. ???? Kann mir da jemand etwas auf die Sprünge helfen. gruß Migelito $regfile = "m16def.dat" $crystal = 8000000 $framesize = 32 $swstack = 32 $hwstack = 32 Config Portd.0 = Input Portd.0 = 1 Config Portd.5 = Output Config Portd.6 = Output Portd.5 = 0 Portd.6 = 0 Taste Alias Pind.0 Do If Taste <> 0 Then Select Case Taste Case 1 : Portd.5 = 1 Case 2 : Portd.5 = 0 Case 3 : Portd.6 = 1 Case 4 : Portd.5 = 0 End Select End If Loop End
Erkläre mal Dein Programm, also schreibe bitte zu jeder Zeile einen Kommentar, der erklärt, was Du mit dieser Zeile bezweckst. Ich vermute, dabei geht Dir ein Licht auf und Deine Frage erübrigt sich. ...
Migelito schrieb: > ABER es geht einfach nicht Das ist ja mal ne sehr präzise Fehlerbeschreibung, damit kann jeder was anfangen. Eine Fehlerbeschreibung sieht so aus: 1. Was erwartest Du 2. Was passiert stattdessen Und Kommentare sind keine überflüssige Schreibarbeit. Sie helfen Dir, Deinen eigenen Code zu verstehen. Peter
Hi, Du hast mit dem Alias Taste den PIN D.0 zugewiesen. Da es ein digitaler Eingang ist, kann Taster nur NULL oder EINS sein. Von daher ist das "IF TASTE <> 0..." schon etwas übertrieben! ;-) Wenn das Proggi in der Select Case ankommt, ist TASTE also mit Sicherheit schon EINS. NUR... einen anderen Wert kann ein Digitaler Eingang gar nicht annehmnen. Immer nur 1 oder 0, aber er kann nie 2, 3, 4 oder sonst was sein! Hoffe geholfen zu haben. Gruß Hackes
Darauf hätte er beim Kommentieren (und drüber nachdenken, was jede Zeile bezwecken soll) selbst kommen sollen. ...
Hi, offensichtlich handelt es sich hier um eine grundsätzliche Verständnisfrage! Deine Variable "Taste" ist eine Bit (entweder 0 oder 1) und repräsentiert das Potential am Pin D.0 (0V oder 5V)! Du setzt den Pin selbst auf 5V ("Portd.0 = 1") und verbindest diesen Pin jetzt mit GND. Die komplette Spannung liegt jetzt im Controller an und der Pin liegt auf dem selben Potential wie GND: IM Controller | außerhalb | R | D.0 Taster VCC O-----|==|------O------ \-------O GND | | Das fragst du per "Taste" ab, Werte wie 2,3 oder 4 sind also grundsätzlich nicht möglich. Ich schließe mich "Peter" an. Um dir weiterzuhelfen musst du uns erst einmal sagen, was du mit dem Programm überhaupt machen willst!
Hallo Leute, ich habe versucht mit der function select case über eine taste mehrere funktionen hintereinander ab zu fragen, oder ausführen zu lassen. So wen ich nun das erste mal auf die taste drücke soll nun wie im Programm oben nur die LED Portd.5 = 1 an gehen bei der zweiten Betätigung der taste soll sie wieder aus gehen, bei der dritten Betätigung die nächste Diode an usw. es geht mir hauptsächlich um diese case funtion und habe mich an Hand des Beispielprogramm vom Buch bascom-AVR Sprachbefehle gehalten. dim x as byte input "x ? " , x select case x case 1 to 3 : print "1,2 oder 3 ist ok" case 4 : print "4" case is > 10 : print ">10" case else : print "nein" end select gruß
migelito schrieb: > So wen ich nun das erste mal auf die taste drücke soll nun wie im > Programm oben nur die LED Portd.5 = 1 an gehen bei der zweiten > Betätigung der taste soll sie wieder aus gehen, bei der dritten > Betätigung die nächste Diode an usw. Schöner Wunsch, aber davon weiß Dein Programm nichts. Du brauchst erstmal einen Programmablaufplan. D.h. in Worten aufschreiben, was passieren muß und wie man von einem Zustand in den anderen kommt. Schau Dir mal den Debounce-Befehl an, den brauchst Du. Peter
Nochn Tip: Woher weiß die Taste, wie oft sie gedrückt wurde? Richtig, sie kann es nicht wissen. Du brauchst also ne Zählvariable. Die Kunst bei einem Programmablauflan besteht darin, erstmal zu erkennen, welche Eigenschaft man auswerten will und diese dann in eine Zahl umzuwandeln. Peter
migelito schrieb: > So wen ich nun das erste mal auf die taste drücke soll nun wie im > Programm oben nur die LED Portd.5 = 1 an gehen bei der zweiten > Betätigung der taste soll sie wieder aus gehen, bei der dritten > Betätigung die nächste Diode an usw. Dein Problem ist erst mal nicht das select/case. Dein Problem sind eigentlich 2 getrennte Probleme # feststellen und Detektieren eines Tastendrucks. Du willst fest stellen ob eine Taste 1 mal gedrückt wurde Dein jetziger Code stellt fest, ob eine Taste gedrückt ist Der Unterschied ist ungefähr so, wie die Fensterheber im Auto. Es gibt welche, die drückt man 1 mal und dann fährt das Fester den ganzen Weg hoch. Und es gibt welche, bei denen fährt das Fenster nur dann wenn der Taster gedrückt ist. Du brauchst ersteres, hast aber letzteres programmiert # Dein anderes Problem besteht darin, dass du trotz deiner schönen Beschreibung nicht realisiert hast, dass du noch eine Variable brauchst. WEnn du beim ersten Tastendruck etwas anderes machen willst als beim zweiten Tastendruck. Und beim dritten wieder etwas anderes. Aber dazu wirst du wohl mitzählen müssen, um den wievielten Tastendruck es sich handelt. Und dazu brauchst du eine Variable in der du dir diese Anzahl aufhebst und bei jedem Tastendruck um 1 erhöhst. Insbesondere letzres Nichterkennen ist ein deutlicher Hinweis darauf, dass du zu schnell zum Keyboard greifst und dir nicht im Vorfeld die generelle Strategie, die du verfolgen willst überlegst bzw. zu oberflächlich überlegst. Von daher geh ich mit den anderen konform, wenn du dir vorher einen Programmablaufplan überlegen sollst.
hm na gut ich werfe nun noch mal was ein, ich habe es aber noch nicht getestet, meint iher in etwa so. Do For I = 1 To Keys Key = I Select Case Key Case 1 : Debounce Pind.0 , 0 , Test1 , Sub Case 2 : Debounce Pind.0 , 0 , Test2 , Sub Case 3 : Debounce Pind.0 , 0 , Test3 , Sub End Select Next Loop Test1: "anweisung" Return Test2: "anweisung" Return Test3: "anweisung" Return
migelito schrieb: > hm na gut ich werfe nun noch mal was ein, ich habe es aber noch nicht > getestet, meint iher in etwa so. Nein Du hast doch nur 1 Taster! Und wenn der gedrückt wird (debounce), dann erhöhst du eine Variable um 1. Machst du doch auch nicht anders, wenn du etwas mitzählen sollst, weil du abhängig davon verschiedene Dinge tun sollst. Beim ersten klingeln streckst du einen Finger aus, schaust auf deine Finger stellst fest wieviele es sind (einer) und kochst Kaffee. Beim nächsten klingeln streckst du noch einen Finger aus, schaust auf deine Finger, stellst fest wieviele ausgestreckt sind (zwei) und fütterst die Fische im Aquarium. Beim nächsten klingeln wird wieder ein Finger ausgestreckt, du stellst fest dass du jetzt 3 Finger ausgestreckt hast und 3 Finger bedeuten: Zähne putzen. Etc. etc. Das was du da skizziert hast ist doch viel zu umständlich Funktion = 1 do Debounce Pind.0 , 0 , KeyPressed , Sub Loop Test1: Select Case Funktion Case 1 : ..... Case 2 : ..... Case 3 : ..... End Select Funktion = Funktion + 1 if Funktion = 4 then Funktion = 1 Return
Hallo Karl heinz, endlich geschnallt, danke für die gut Beschreibung, ich stand voll auf dem Schlauch, nun funktioniert es. Gruß Migelito Funktion = 1 do Debounce Pind.0 , 0 , Test1 , Sub Loop Test1: Select Case Funktion Case 1 : Portd.5 = 1 Case 2 : Portd.5 = 0 Case 3 : Portd.6 = 1 End Select Funktion = Funktion + 1 if Funktion = 4 then Funktion = 1 Return
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.