Forum: Mikrocontroller und Digitale Elektronik XMega-Bit-Manipulation: Einlesen mehrerer Pins gleichzeitig


von Peder (Gast)


Lesenswert?

Hallo,

ich möchte eigentlich nur prüfen, ob zwei Pins (gleichzeitig) high oder 
low sind, aber ich verstehe diese Bit-Schreibweise einfach nicht 
ausreichend und verzweifle langsam.

Gibt es eine Schreibweise wie diese hier,
1
if (PORTA.IN & (PIN0_bm | PIN1_bm)) {}
mit der ich prüfen kann, ob Pin0 und Pin1 gesetzt sind?

Und um es etwas schwieriger zu machen, gibt es eine solche Schreibweise 
auch, um zu prüfen, ob beide Pins gleichzeitig nicht gesetzt sind?

Ich könnte natürlich auch das IN-Register mit einer Zahl vergleichen, 
aber das finde ich schwer zu lesen und nicht elegant. Zudem müsste ich 
wahrscheinlich viel rum-odern, um die nicht betroffenen Pins zu 
ignorieren, was mein Lesbarkeitsproblem noch intensivieren würde...


Danke

Peder

von Falk B. (falk)


Lesenswert?

@ Peder (Gast)

>ich möchte eigentlich nur prüfen, ob zwei Pins (gleichzeitig) high oder
>low sind, aber ich verstehe diese Bit-Schreibweise einfach nicht
>ausreichend und verzweifle langsam.

Siehe Bitmanipulation

>if (PORTA.IN & (PIN0_bm | PIN1_bm)) {}

>mit der ich prüfen kann, ob Pin0 und Pin1 gesetzt sind?

Nein, das prüft, ob Pin0 ODER Pin1 gesetzt sind.

>Und um es etwas schwieriger zu machen, gibt es eine solche Schreibweise
>auch, um zu prüfen, ob beide Pins gleichzeitig nicht gesetzt sind?

!(PORTA.IN & (PIN0_bm | PIN1_bm))

Siehe oben.

von Peder (Gast)


Lesenswert?

Danke für die "Nicht-Und"-Lösung. Die scheint zu funktionieren.

Falk B. schrieb:
> Nein, das prüft, ob Pin0 ODER Pin1 gesetzt sind.

Wahrscheinlich war die Satzkonstruktion hier etwas unglücklich. Ich 
meinte, ob es analog zu meinem Beispiel, das eine Oder-Prüfung vornimmt, 
eine Schreibweise gibt, die eine Und-Prüfung vornimmt.
Zwar funktioniert folgendes:
1
if ((PORTA.IN & 0b00000011) == 0b00000011) {}
Mir gefiele aber eine Schreibweise mit PIN0_bm und PIN1_bm mehr. Gibt es 
da eine?

von Karl H. (kbuchegg)


Lesenswert?

Peder schrieb:

>
1
if ((PORTA.IN & 0b00000011) == 0b00000011) {}
> Mir gefiele aber eine Schreibweise mit PIN0_bm und PIN1_bm mehr. Gibt es
> da eine?

sicher.

0b00000011 ersetzt du an allen vorkommenden Stellen durch deine 
Schreibweise mit PIN0_bm | PIN1_bm

Wichtig: an ALLEN vorkommenden Stellen.

Es reicht dann eben nicht mehr, wenn nach der Verundung etwas ungleich 0 
rauskommt, sondern es muss eben genau rauskommen, dass PIN0 und Pin1 
gesetzt sind.
1
if ( (PORTA.IN & (PIN0_bm | PIN1_bm)) == (PIN0_bm | PIN1_bm) ) {}

was dich wahrscheinlich ins Boxhorn getrieben hat, das ist die Operator 
Precedence (also die Vorrangregeln für Operatoren wie zb & | oder auch 
==). Wenn man die nicht komplett auswendig kennt (und wer kennt schon 
alle), dann setzt man eben Klammern.

Kann natürlich auch sein, dass dein eigentliches Problem darin besteht, 
dass dir nicht klar ist, was die Binäroperationen eigentlich machen und 
was uns das Ergebnis so einer Binäroperation alles erzählt.

Wenn man einfach nur auswendig gelernt hat, dass ein Pin so abgefragt 
wird
1
    if( PORTA.IN & PinMask )
und sich nie überlegt hat, warum man da eigentlich ein & schreibt, was 
das macht und was das Ergebnis davon ist, bzw. einem nicht klar ist, wie 
ein if funktioniert, dann steht man eben da wie der Ochs vorm Tor.

: Bearbeitet durch User
von Peder (Gast)


Lesenswert?

Das Problem ist wahrscheinlich, dass ich diese Bit-Operationen nur 
einmal alle paar Monate brauche. Und irgendwann kopiert man natürlich 
die Zeile für so einfache Abfragen, so dass man das irgendwann nicht 
mehr kann. Und alles, was sich dann IM Controller abspielt, fragt meiner 
Erfahrung nach immer nur nach einem Wert aus den Registern ab (z.B. 
diverse Status-Register). Ich hatte noch nie den Fall, dass zwei Werte 
aus einem Register gebraucht werden.

Dazu kommt noch, dass ich zwar "mathematisch" nachvollziehen kann, was 
diese Operationen machen, aber in die andere Richtung fällt es mir 
schwer. Sprich, ich kann kompliziertere Ausdrücke nicht so ohne weiteres 
herleiten, verstehe sie aber, wenn ich sie lese.


Habt Dank!

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.