Forum: Mikrocontroller und Digitale Elektronik switch-case ausdruck!


von Oli K. (waldmeister)


Angehängte Dateien:

Lesenswert?

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.


von johnny.m (Gast)


Lesenswert?

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

von Michael L. (Gast)


Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

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.

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

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

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>Untere 6 Pins Maskieren

mit 0x81 maskiert man das oberste und unterste Bit in einem Byte.
Erst denken, dann programmieren!

von Peter D. (peda)


Lesenswert?

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

von Oli K. (waldmeister)


Lesenswert?

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.

von Christian (Gast)


Lesenswert?

>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

von Karl heinz B. (kbucheg)


Lesenswert?

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

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

Naja, ist es nicht C-Standard, dass alles, was nicht gleich Null ist, 
wahr ist?

von Karl heinz B. (kbucheg)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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 "~"...

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

@Karl Heinz: OK, dann hab ich dich falsch verstanden.

von Karl heinz B. (kbucheg)


Lesenswert?

> @Karl Heinz: OK, dann hab ich dich falsch verstanden.

Mein Fehler.
Dann hab ich mich nicht verständlich genug ausgedrückt.

von Oli K. (waldmeister)


Lesenswert?

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
Noch kein Account? Hier anmelden.