Forum: Mikrocontroller und Digitale Elektronik Wert aus verschiedenen Porteingängen erzeugen


von Andreas (Gast)


Lesenswert?

Guten Morgen,

kann ich mit diesem Code eine Variable beschreiben, deren Werte von 
verschiedenen PORTs und PINs kommen?

Die Pins sind mit einem 8 Fach DIP-Schalter versehen. Das 7. Bit soll 
immer null sein. Auf Grund des Layouts ist es nicht möglich alle 
Schalter an einem Port zu legen.
1
uint8_t zahl = 0;
2
3
zahl |= ((PINB & (1<<PB7))<<6)|
4
        ((PIND & (1<<PD5))<<5)|
5
        ((PIND & (1<<PD6))<<4)|
6
        ((PIND & (1<<PD7))<<3)|
7
        ((PINB & (1<<PB0))<<2)|
8
        ((PINB & (1<<PB1))<<1)|
9
        ((PINB & (1<<PB2))<<0);

Danke

von Programmierer (Gast)


Lesenswert?

Ich vermute das funzt so nicht (oder?), weil du damit die Bits weit über 
die Bytegrenzen rausschiebst. Versuch mal die kompakte if/then Syntax:

wert = (port & pin) ? (1<<6) : 0 ¦ ...

von Klaus W. (mfgkw)


Lesenswert?

oder ähnlicher zum Original:
1
 zahl |= ( ((PINB & (1<<PB7))!=0 ) << 6 )|
2
         ( ((PIND & (1<<PD5))!=0 ) << 5 )|
3
         ( ((PIND & (1<<PD6))!=0 ) << 4 )|
4
         ( ((PIND & (1<<PD7))!=0 ) << 3 )|
5
         ( ((PINB & (1<<PB0))!=0 ) << 2 )|
6
         ( ((PINB & (1<<PB1))!=0 ) << 1 )|
7
         ( ((PINB & (1<<PB2))!=0 ) << 0 );

von Klaus W. (mfgkw)


Lesenswert?

PS: Das Oder in der Zuweisung ist natürlich überflüssig.

von Andreas (Gast)


Lesenswert?

Danke für die Antworten.

Kann es momentan leider nicht praktisch testen,
aber das sieht sehr gut aus.

Gruß
Andreas

von Klaus W. (mfgkw)


Lesenswert?

P.S.: Solange die Bits schon an der richtigen Stelle stehen, kann man 
das Schieben natürlich auch weglassen:
1
 zahl |= ( ((PINB & (1<<PB7))!=0 ) << 6 )|
2
         ( ((PIND & (1<<PD5))!=0 ) << 5 )|
3
         ( ((PIND & (1<<PD6))!=0 ) << 4 )|
4
         ( ((PIND & (1<<PD7))!=0 ) << 3 )|
5
         ( ((PINB & (1<<PB0))!=0 ) << 2 )|
6
         ( ((PINB & (1<<PB1))!=0 ) << 1 )|
7
         ( ((PINB & (1<<PB2))!=0 ) << 0 );

wird zu:
1
 zahl |= ( ((PINB & (1<<PB7))!=0 ) << 6 )|
2
         ( ((PIND & (1<<PD5))    )      )|
3
         ( ((PIND & (1<<PD6))!=0 ) << 4 )|
4
         ( ((PIND & (1<<PD7))!=0 ) << 3 )|
5
         ( ((PINB & (1<<PB0))!=0 ) << 2 )|
6
         ( ((PINB & (1<<PB1))    )      )|
7
         ( ((PINB & (1<<PB2))!=0 ) << 0 );

von Programmierer (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> wird zu:


Überlass dem Compiler das optimieren und schreib wartbaren Code.

SCNR.

von Klaus W. (mfgkw)


Lesenswert?

Wenn der Compiler das hinbekommt...

Außerdem finde ich diese Version jetzt auch nicht sooo unübersichtlich.
Wenn ich es noch klarer formulieren will, sind auch diese 
Bitschiebereien nicht elegant.

von Peter D. (peda)


Lesenswert?

1
  uint8_t zahl;
2
3
  zahl = (PINB & 1<<PB7 ? 64 : 0)
4
       | (PIND & 1<<PD5 ? 32 : 0)
5
       | (PIND & 1<<PD6 ? 16 : 0)
6
       | (PIND & 1<<PD7 ?  8 : 0)
7
       | (PINB & 1<<PB0 ?  4 : 0)
8
       | (PINB & 1<<PB1 ?  2 : 0)
9
       | (PINB & 1<<PB2 ?  1 : 0);

Peter

von Andreas (Gast)


Lesenswert?

Danke für alle Vorschläge...

Gruß
Andreas

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.