Bitkampf auf Portebene

Gast #2519246
Nabend an alle...

ich stell mich gerade wahnsinnig bescheuert an! Folgendes Problem:

ich möchte bestimmte Bits von PORTB mit dem Wert aus einer uint8_t 
Variablen betanken, während die anderen Bits von PortB unverändert 
bleiben.

Beispiel:
uint8_t tmp = 0b00010100

Wenn ich nun PORTB = tmp setze, werden ja alle mit null definierten Bits 
auch null gesetzt. Nun möchte ich, das aus der Variablen tmp nur die 
kombination "101" die entsprechenden Bits auf PORTB ändert. Alle anderen 
Bits sollen hiervon unberührt bleiben. Ich glaub das Stichwort ist 
Bitmaskierung. Jedoch frage ich mich, wie ich die Maske in diesem Fall 
auf PORTB anwenden kann?

Herzlichen Dank schonmal im Voraus...

Grüße
Gast #2519253
chris schrieb:
> kombination "101" die entsprechenden Bits auf PORTB ändert

Das heißt Du willst die Einsen setzen, oder auch die Nullen am Port 
löschen?

Wenn Du nur die Einsen aus Deiner Tempvariable setzen möchtest, ohne die 
Null in der Variable ebenfalls auf den Port zu übertragen, dann geht das 
einfach mit einem ODER:
1
PORTB = PORTB |temp;

Gruß
Gast #2519271
Hallo chris,

wenn Du wirklich "101" setzen willst, sollte es so funktionieren

uint8_t tmp_mask = 0b00011100;

PORTB = (PORTB & ~tmp_mask) | (tmp & tmp_mask);

Viele Grüße
l_boppi
Gast #2519282
SUUUPPPPPER! Danke lboppi.... genau das wollte ich!
Da wär ich so nich drauf gekommen... das ist DIE LÖSUNG!

Allerherzlichen Dank für die superschnelle Lösung :)))))
Gast #2519300
Hrmpf...
wenn ich jetz erzähle das ich studierter Informatiker bin...
aber muss leider von Berufs wegen nur mit java Webapps schreiben... da 
hab ich mir nen knoten Gegrübelt... Bin voll raus aus hardwarenaher 
Programmierung in c.
Aber ich gelobe Besserung und werd den K&R mal wieder ausm Keller holen. 
Versprochen
#2519531
heinz schrieb:
> Hmm, wahrscheinlich hab ichs nicht kapiert...
>
> uint8_t mask = 0b00011100;
> uint8_t tmp = 0b00010100;
>
> PORTB = (PORTB & ~mask) | tmp;

Mit dieser Variante hättest du das Problem das wenn in tmp zufällig 
nicht nur Bit[5:3] high sind, das du auch die anderen bits mit übergibst 
...

Beispiel: tmp= 0b11100011 würde in jedem Fall an PORTB 0b11100011 
ergeben auch wenn PORTB 0x00 war.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.