Bitkampf auf Portebene

Gast #2519246
Lesenswert?

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
Lesenswert?

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 #2519300
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren