www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einfache Select Case Anweisung


Autor: Migelito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hackes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darauf hätte er beim Kommentieren (und drüber nachdenken, was jede Zeile 
bezwecken soll) selbst kommen sollen.

...

Autor: Josh I. (aproquos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: migelito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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ß

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: migelito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: migelito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.