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?
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); |
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.