mikrocontroller.net

Forum: Compiler & IDEs Bits eines Ports merken und wieder herstellen.


Autor: Alexander Bauer (tuxx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte mir vor eine Portopertaion die Bits 5,6, und 7 merken,
und nach der Operation wieder genau so setzt wie sie vor der Operation
waren. Aber nur die 3 Bits, alle andern sollen unverändert bleiben.

Wie kann man das am schnellsten lösen ?

Das merken habe ich mal so gelöst:

unsigned char portd_old = 0x00;
portd_old = PORTD & 0xE0;

Aber wie setzte ich die Bits jetzt wieder möglichst effektiv ohne die
anderen Bits zu beeinflussen ?

Gruß Alex

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die eine grosse boolsche Operation hast du doch schon gefunden, da kann
der Weg zur Anderen doch auch nicht soooooo schwer sein....
Und wenn du doch nicht drauf kommst kannst du deine Merkvariable auch
einfach in eine Weitere umspeichern und später zurücklesen :-)
Viele Wege führen nach Rom.

bye

Frank

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, vergiss das rückspeichern, du wolltest ja die restlichen Bits
nicht anfassen. Also nur die Operation suchen die das Gegenteil von der
bisher genutzten macht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja. Mit einer Operation kommt er bei der Restaurierung
nicht weiter.
Es sind schon 2 Operationen:
Mit der ersten werden gezielt alle zu restaurierenden Bits
auf 1 gesetzt. Mit der 2-ten werden dann die 0-Bits aus
der gemerkten Variable gesetzt.

@Alexander: Wie man Bits gezielt auf 0 setzen weist du ja schon:
Mit einem &: Überall wo in der Maske eine 0 steht, kommt
im Ergebnis mit Sicherheit auf eine 0 hin.
Die andere Operation ist ein |. Mit der kann man Bits gezielt
auf 1 zwingen.

Autor: Alexander Bauer (tuxx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Tips.

Das scheint eine Lösung zu sein:

// Status von Bit 5,6 und 7 merken
unsigned char portd_old = 0x00;
portd_old = PORTD & 0xE0;

/* Do something */

// Status von Bit 5,6 und 7 wiederherstellen
PORTD &= ~(0xE0);
PORTD |= portd_old;

Gruß Alex

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das sieht gut aus.

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.