hallo zusammen. ich möchte div. Befehle mit switch case anweisung steuern. doch ich denke, dass mein ausdruck in der case anweisung falsch ist. ich schaffe es nur, den ersten case fall abzurufen leider komme ich auf keine lösung. wäre klasse, wenn ihr da lösungen hättet. p.s.: wenn ich statt switch case die if anweisung benutze funktioneiert es. aber mich ist das break wichtig, da die taster nach dem drücken in diesem zustand bleiben sollen und nicht mehr verändert werden.
> switch(!(PORTA&=0x81))
Überlege mal, was der Ausdruck in der Klammer überhaupt macht. Das
Ergebnis dieses Ausdrucks ist immer entweder 1 oder 0. Ich vermute mal,
es klappt besser, wenn Du statt der logischen Negierung "!" den
Bitkomplement-Operator "~" benutzt...
Hallo, müsste das nicht switch(!(PINA&=0x81)) heißen? Schon mal versucht den Port erst in eine Variable einzulesen und die Variable im switch-case zu prüfen? Gruß, Michael L.
Ach ja, das mit PORTA hab ich auch noch übersehen. Es muss selbstverständlich PINA heißen, sonst werden nur die Zustände der Porttreiber abgefragt.
>PINA&=0x81
Genau... Port einlesen, mit 0x81 verunden und dann wieder an dein
EINGANGSPORT zurückschreiben.
Wenn man "switch(x = (PINA & 0x81))", "switch(x = ~(PINA & 0x81))" oder
"switch(~(x = (PINA & 0x81)))" schreibt, könnte es vielleicht noch
funktionieren.
Switch erfordert einen nummerischen Ausdruck, keinen logischen.
>Untere 6 Pins Maskieren
mit 0x81 maskiert man das oberste und unterste Bit in einem Byte.
Erst denken, dann programmieren!
1 | if(!(PIND&(1<<PIND2))) //irgendein Taster wurde gedrueckt, entprellt. |
Du scheinst umständlicher Weise eine externe Entprell-Hardware zu benutzen. Trotzdem sollte man immer einen Port einmalig in eine Variable einlesen, wenn man den Wert mehrmals braucht. Externe Hardware ist ja immer asynchron, d.h. Du weißt nie, ob nicht zwischendurch der Wert geändert wurde. Es ist daher durchaus möglich, daß beim ersten Lesen von PINA, Bits gesetzt sind, aber beim späteren nochmaligen Abfragen der Pins alle rüchgesetzt sind. Eine Variable dagegen speichert den Zustand unbegrenzt lange (bis der Saft weg ist). Mit der Variable erzwingt man ein synchrones Abarbeiten, die Variable ist quasi wie ein Latch. Peter
ich habe die taster noch an einem interrupt angeschlossen, desshalb ist zusätzlich noch pd2 in gebrauch. die möglichkeit mit der variable hatte ich auch schon gehabt, aber dann unverständlicher weise wieder verworfen. vielen dank für die tipps, ich werde mich gleich mal an die arbeit machen.
>switch(!(PORTA&=0x81))
1. Im switch wird immer ein boolscher Ausdruck abgefragt (wegen dem "!")
--> nicht gut und wohl auch nicht beabsichtigt
2. Wenn ich mich nicht täusche sollte das Ergebnis doch eigentlich immer
false sein, also "case 0" würde verwendet werden, oder?
Der Ausdruck (PORTA&=0x81) ist eigentlich eine Zuweisung, das Ergebnis
dieses Ausdrucks ist immer true, da die Zuweisung erfolgreich war. Mit
dem "!" davor wird das ganze dann false, und das ist ja wohl gar nicht
was du erreichen willst, oder?
Versuchs doch mal mit:
uint x = PORTA & 0x81;
PORTA &= 0x81;
switch (x)...
ODER
switch (~(PORTA&0x81))
Gruß,
Christian
> Der Ausdruck (PORTA&=0x81) ist eigentlich eine Zuweisung, das > Ergebnis dieses Ausdrucks ist immer true, da die _Zuweisung_ > erfolgreich war. Das Ergebnis einer Zuweisung ist der Wert der zugewiesen wurde. Das hat nichts damit zu tun, ob eine Zuweisung erfolgreich durchgeführt werden konnte. Letzteres ist sowieso jenseits der Kontrolle des Programmierers in C.
Naja, ist es nicht C-Standard, dass alles, was nicht gleich Null ist, wahr ist?
Schon. Aber das hat ja nichts mit der getätigten Aussage zu tun, dass > das Ergebnis dieses Ausdrucks ist immer true, da die _Zuweisung_ > erfolgreich war. wobei Zuweisung auch noch extra hervorgehoben wurde. Das Ergebnis einer Zuweisung ist immer der Wert der zugewiesen wurde. Andernfalls würde i = j = 5; ja nicht funktionieren. Wenn dann dieses Ergebnis in einem boolschen Ausdruck benutzt wird, dann gilt die (0 = false, alles andere ist true) Regel. > Der Ausdruck (PORTA&=0x81) ist eigentlich eine Zuweisung, das > Ergebnis dieses Ausdrucks ist immer true Das Ergebnis dieses Ausdrucks ist mitnichten immer true. Wenn PORTA den Wert 0 hat, dann ist das Ergebnis der Verknüpfung PORTA & 0x81 ebenfalls 0. Die weitere Zuweisung an PORTA ändert daran nichts und das Ergebnis der daraus resultierenden Zuweisung PORTA = 0 ist daher ebenfalls 0 (weil 0 zugewiesen wurde und nicht weil die Zuweisung selbst 'erfolgreich' war, was auch immer 'erfolgreich' in diesem Zusammenhang bedeuten soll).
Ups, ich glaub ich war noch nicht ganz wach. Die Zuweisung hab ich doch glatt ebenfalls übersehen. Aber Rahul hat natürlich recht: Deshalb klappt das ja auch mit dem "!"-Operator nicht, sondern wenn überhaupt, dann mit "~"...
> @Karl Heinz: OK, dann hab ich dich falsch verstanden.
Mein Fehler.
Dann hab ich mich nicht verständlich genug ausgedrückt.
mit der einführung der variablen klappt es. somit war meine vermutung richtig. thanks @ all!
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.