mikrocontroller.net

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


Autor: Klaus Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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
aktuellerStand = PIND | ((PINB & 0xC0) << 8);

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe da mal eine Frage zu dem oben angegebenen Code:
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.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

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

Dann sollte
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.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas B. (andreasb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Aha, danke für die schnelle Antwort. Ich glaub, ich habe es verstanden.
>
> Dann sollte
>
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.

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.