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