Forum: Compiler & IDEs PINxx in Struktur einlesen


von Andreas S. (aqian)


Lesenswert?

Hallo,

ich habe eine Struktur definiert:
1
struct  
2
{
3
  unsigned bTaster0:1;                //Taster 0 gedrückt
4
  unsigned bTaster1:1;                //Taster 1 gedrückt
5
  unsigned bTaster2:1;                //Taster 2 gedrückt
6
  unsigned bTaster3:1;                //Taster 3 gedrückt
7
}input;

Nun möchte ich PINB4 in das Bit input.bTaster0 einlesen. Wie geht das?

So funktioniert es leider nicht:
1
input.bTaster0 = PINB & (1<<PINB4);

von Andreas B. (andreas_b77)


Lesenswert?

Vielleicht mit
1
input.bTaster0 = (PINB & (1<<PINB4)) != 0;

von Dussel (Gast)


Lesenswert?

Du solltest die Struktur in ein Union mit einem Char zusammenfassen 
können und dann dem Char den Wert zuweisen. Wie das genau geht, weiß ich 
aber jetzt nicht, gemacht habe ich sowas aber mal.

von Andreas S. (aqian)


Lesenswert?

Andreas B. schrieb:
> Vielleicht mit
>
1
> input.bTaster0 = (PINB & (1<<PINB4)) != 0;
2
>


Prinzipiell ist das die Lösung für mein Problem. Da mein Taster 
Low-aktiv ist, musste ich eine kleine Anpassung machen.
1
input.bTaster0 = ~((PINB & (1<<PINB4)) != 0);

Besten Dank Andreas B. :)

von Hans (Gast)


Lesenswert?

Andreas Sperling schrieb:
> Andreas B. schrieb:
>> Vielleicht mit
>>> input.bTaster0 = (PINB & (1<<PINB4)) != 0;
>>
>
> Prinzipiell ist das die Lösung für mein Problem. Da mein Taster
> Low-aktiv ist, musste ich eine kleine Anpassung machen.
> input.bTaster0 = ~((PINB & (1<<PINB4)) != 0);
>
> Besten Dank Andreas B. :)

Dann doch lieber:
1
input.bTaster0 = ((PINB & (1<<PINB4)) == 0);

von Andreas S. (aqian)


Lesenswert?

Hans schrieb:
> Andreas Sperling schrieb:
>> Andreas B. schrieb:
>>> Vielleicht mit
>>>> input.bTaster0 = (PINB & (1<<PINB4)) != 0;
>>>
>>
>> Prinzipiell ist das die Lösung für mein Problem. Da mein Taster
>> Low-aktiv ist, musste ich eine kleine Anpassung machen.
>> input.bTaster0 = ~((PINB & (1<<PINB4)) != 0);
>>
>> Besten Dank Andreas B. :)
>
> Dann doch lieber:
>
1
input.bTaster0 = ((PINB & (1<<PINB4)) == 0);

Stimmt, sieht viel besser aus. Danke Hans.

von Andreas B. (andreas_b77)


Lesenswert?

Es geht ja nur darum, dass beim Zuweisen an eine 1-Bit Variable alles 
oberhalb des niedrigsten Bits abgeschnitten wird. Also kann man 
alternativ auch das eine interessante Bit nach unten schieben:
1
input.bTaster0 = (PINB & (1<<PINB4)) >> PINB4;

Oder, für den invertierten Fall:
1
input.bTaster0 = ~((PINB & (1<<PINB4)) >> PINB4);

Ob das schneller oder langsamer ist müsste man durch Experimentieren 
herausfinden. Bei der Zuweisung an das Bitfield muss sowieso geschoben 
werden, eventuell kann das der Compiler zusammenfassen.

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.