Nur 2 Pins mit einer case abfrage abfragen

OP #2552268
Hallo,

Ich versuche mit einer case abfrage 2 Pins an einem Port abzufragen.
Es handelt sich dabei um PORTB6 und PORTB7.
Wenn der eine von 1 auf 0 gezogen wird soll case 1 ablaufen und beim 
anderen case2 wenn beide 0 sind soll keiner der beiden ausgeführt werden 
und beide 1 kann nicht auftreten, da als hardware ein auswahlschalter 
dahinter ist, der aber auch eine nullstellung hat.
Wie funktioniert die case anweisung? Da ja auf den anderen Pins dieses 
Ports was ganz anderes abläuft und nix mit der auswahl zu tuen hat.
1
switch(PORTB)
2
    {
3
      case 0b01000000:
4
      {
5
        linkslauf();
6
        break;
7
      }
8
      case 0b10000000:
9
      {
10
        rechtslauf();
11
      }
12
    }

Weil so habe ich ja das problem, das sobald an den Pins 0-6 irgendwas 
ist, ist meine Bedingung ja nicht erfüllt, und zusätzlich reagiert er 
jetzt darauf wenn ich eine 1 anlege und nicht wenn ich das Signal auf 
Masse ziehe.

Kann mir da wer weiterhelfen?

Danke
#2552271
1
switch(PINB & 0b11000000) // oder PORTB, je nach Controller
2
    {
3
      case 0b01000000:
4
      {
5
        linkslauf();
6
        break;
7
      }
8
      case 0b10000000:
9
      {
10
        rechtslauf();
11
        break;
12
      }
13
    }

Ein anderes Thema wäre Entprellung. Taster/Schalter prellen.
OP #2552276
Super für die schnelle super Antwort.

KAnnst du mir noch sagen, wieso jetzt PINB auftaucht?
Das ist ja eine Maskierung wenn ich das richtig sehe. Muss dann nicht 
der ganze Port maskiert werden?

bin anfänger. desshalb diese warscheinlich banalen Fragen.

Aber vielen Dank für die Antwort
#2552285
Tobias xxx schrieb:

> Das ist ja eine Maskierung wenn ich das richtig sehe. Muss dann nicht
> der ganze Port maskiert werden?

Wenn du genau 2 Bits abfragen willst, dann musst du die übrigens Bits 
ausblenden. Die Interpretation, ob der Stand 1 nun aktiv oder inaktiv 
ist, überlasse ich deiner Hardware - evtl. ist es genau andersrum wie 
gezeigt.
OP #2552286
JA benutze einen AtMega 168

super das hat mir viel weitergeholfen. hatte irgendwie nie wirklich 
rausgefunden, wo der unterschied zwischen PINB und PORTB ist.

Wo genau muss ihc denn bei soeiner Case anweisung das entprell 
unterprogramm einfügen?
OP #2552297
Okay das hilft mir zum entprellen jetzt schonmal weiter.

HAbe aber gerade gemerkt, das er immernoch darauf reagiert, wenn ein 
signal kommt. Er muss aber im grunde darauf reagieren, wenn eine 
negative flanke kommt, da auf allen eingängen 1 signal anliegt und bei 
betätigtem schalter das signal auf MAsse gelegt wird. Muss ich jetzt 
meine 1 en und 0en nur alle umdrehen? oder gibt es da eine andere 
Möglichkeit?
#2552322
Die einfachste Lösung ist imho immer noch

  if( PINB & ( 1 << PB6 ) )
    linkslauf();

  if( PINB & ( 1 << PB7 ) )
    rechtslauf();


kurz, leicht zu verstehen, simpel, und auch leicht an die tatsächlichen 
Schaltergegebenheiten anzupassen.
OP #2552416
klappt auch super.
1
while(1)
2
    {
3
        if ((PINB & (1 << PB6)) == 0)
4
    linkslauf();
5
      else
6
        if ((PINB & (1 << PB7)) == 0)
7
        rechtslauf();
8
          else
9
            automatik();
10
  }

vielen Dank.
Habe gleich nocheine Frage. Aber dafür mache ich ein anderes Thema auf.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.