mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik switch-case ausdruck!


Autor: Oli K. (waldmeister)
Datum:
Angehängte Dateien:

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


Autor: johnny.m (Gast)
Datum:

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

Autor: Michael L. (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

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

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Untere 6 Pins Maskieren

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Oli K. (waldmeister)
Datum:

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

Autor: Christian (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz: OK, dann hab ich dich falsch verstanden.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> @Karl Heinz: OK, dann hab ich dich falsch verstanden.

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

Autor: Oli K. (waldmeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit der einführung der variablen klappt es. somit war meine vermutung 
richtig.
thanks @ all!

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.