Forum: Mikrocontroller und Digitale Elektronik Nur 2 Pins mit einer case abfrage abfragen


von Tobias x. (dertobias)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Tobias x. (dertobias)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Tobias xxx schrieb:

> KAnnst du mir noch sagen, wieso jetzt PINB auftaucht?

Nur wenn du mir verrätst, um was für einen Controller es geht. Weils für 
Portbezeichnungen keinen IEEE-Standard gibt und das jeder macht wie er 
will.

von Tobi (Gast)


Lesenswert?

PORTX = Ausgaberegister
PINX = Eingaberegister
DDRX = Datenrichtungsregister

von Tobi (Gast)


Lesenswert?

Tobi schrieb:
> PORTX = Ausgaberegister
> PINX = Eingaberegister
> DDRX = Datenrichtungsregister

Zumindest bei ATMEL.

von (prx) A. K. (prx)


Lesenswert?

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.

von Tobias x. (dertobias)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?


von Tobias x. (dertobias)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

Wenn Links und Rechtslauf nun vertauscht sind, dann musst du einfach 
selber die Aufrufe vertauschen. ;-)

Alle Bits umzudrehen führt in die Irre.
Case 0x01000000 bedeutet, dass der Taster an Pin 7 aktiv ist.

von Tobias x. (dertobias)


Lesenswert?

Ich kann ja einfach die beiden funktionen vertauschen ^^ vielen dank. 
auf die einfachste Lösung nicht gekommen

von Karl H. (kbuchegg)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Die einfachste Lösung ist imho immer noch

Fast. Seine Taster sind aktiv = 0. Also

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

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

von Tobias x. (dertobias)


Lesenswert?

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.

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.