Forum: Compiler & IDEs verschiedene Werte von 2 Ports in eine Variable?


von Klaus Fischer (Gast)


Lesenswert?

Hallo,

ich möchte die aktuellen Werte von

PINB.6
PINB.7

PIND.0
PIND.1
PIND.2
PIND.3
PIND.4
PIND.5
PIND.6
PIND.7

in einer Variablen

static int akutellerStand;

abspeichern und beim nächsten Funktionsaufruf vergleichen, ob sich was 
geändert hat, wenn nicht, dann möchte ich die Funktion mit return 
verlassen.

Wie kann ich nun die Werte in eine Variable schreiben und vergleichen, 
damit ich es nicht für jedes Bit einzeln tun muss?

von Hc Z. (mizch)


Lesenswert?

Ich würde nicht int nehmen, sondern uint16_t, um zu verdeutlichen, dass 
es sich um eine vorzeichenlose 16-Bit-Variable handelt.  Zusammenbasteln 
kannst Du sie Dir z.B. mit
1
aktuellerStand = PIND | ((PINB & 0xC0) << 8);

von Oliver (Gast)


Lesenswert?

Hallo,
habe da mal eine Frage zu dem oben angegebenen Code:
1
aktuellerStand = PIND | ((PINB & 0xC0) << 8);

Das PINB & 0xC0 nimmt gibt mir nur die Bits von PINB.6 und PINB.7. Aber 
warum kommt dann noch << 8 dahinter?
Soll das bedeuten, dass die 2 zusätzlichen Bits aus Port B nach dem 8. 
Bit von PortD geschrieben werden?

Sorry, ich fange gerade erst an, mich mit µ-Controller zu beschäftigen.

von Thomas E. (thomase)


Lesenswert?

Oliver schrieb:
> Das PINB & 0xC0 nimmt gibt mir nur die Bits von PINB.6 und PINB.7. Aber
> warum kommt dann noch << 8 dahinter?
> Soll das bedeuten, dass die 2 zusätzlichen Bits aus Port B nach dem 8.
> Bit von PortD geschrieben werden?
PORTD:         DDDDDDDD
PORTB:         BBbbbbbb
wird:  BBbbbbbbDDDDDDDD

2x schieben würde in diesem Fall auch reichen:
             BBDDDDDDDD

Ohne Schieben würden B6 und D6 sowie B7 und D7 miteinander verknüpft 
werden.

mfg.

von Oliver (Gast)


Lesenswert?

Aha, danke für die schnelle Antwort. Ich glaub, ich habe es verstanden.

Dann sollte
1
aktuellerStand = PIND | ((PINB & 0xC0) << 2);
auf BBDDDDDDDD die gewünschte 8-bit-Zahl zusammensetzen.
Mit dem Schieben um 8 Stellen hätte ich dann ja noch 6 redundante 
Stellen in der Zahl, und somit Speicherplatz verschenkt.

von Thomas E. (thomase)


Lesenswert?

Oliver schrieb:
> Mit dem Schieben um 8 Stellen hätte ich dann ja noch 6 redundante
> Stellen in der Zahl, und somit Speicherplatz verschenkt.
Speicherplatz verschenkst du nicht. Beides braucht 16 Bit. Aber mit 
zweimal schieben ist die Zahl "lesbarer zusammengesezt". Ist teilweise 
Geschmackssache, teilweise aber auch von der Anwendung abhängig wie man 
es "richtig" macht.

mfg.

von Andreas B. (andreasb)


Lesenswert?

Oliver schrieb:
> Aha, danke für die schnelle Antwort. Ich glaub, ich habe es verstanden.
>
> Dann sollte
>
1
aktuellerStand = PIND | ((PINB & 0xC0) << 2);
2
>
> auf BBDDDDDDDD die gewünschte 8-bit-Zahl zusammensetzen.
> Mit dem Schieben um 8 Stellen hätte ich dann ja noch 6 redundante
> Stellen in der Zahl, und somit Speicherplatz verschenkt.

RAM braucht beides gleich viel, da die 6 Byte trotzdem gebraucht werden.

Nur weil ein Smart kürzer ist braucht er trotzdem einen ganzen 
Parkplatz...
(Jaja, ein hinkender Vergleich, ich weiss).

Aber das Verschieben um 2 Bits verbraucht 4 Byte mehr Flash, weil um 8 
bit verschieben ist bei einem AVR ein normaler Memory Zugriff, ohne 
verschieben.

Ein AVR Addressiert Byteweise. Ein Verschieben um 2 Bit muss tatsächlich 
noch verschoben werden.

Daher ist das verschieben um 2 Bit tatsächlich schlechter als das 
Verschieben um 8 Bit, wenn auch ggf. nicht relevant.

mfg 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.