Forum: Mikrocontroller und Digitale Elektronik Bitkampf auf Portebene


von chris (Gast)


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

von SNR (Gast)


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ß

von lboppi (Gast)


Lesenswert?

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

von chris (Gast)


Lesenswert?

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 :)))))

von C Grundlagen (Gast)


Lesenswert?

Dann solltest Du nochmal im Tutorial vorbeischauen oder ein C-Buch 
lesen!
Sind echt wichtige Grundlagen.

von heinz (Gast)


Lesenswert?

Hmm, wahrscheinlich hab ichs nicht kapiert...

uint8_t mask = 0b00011100;
uint8_t tmp = 0b00010100;

PORTB = (PORTB & ~mask) | tmp;

von chris (Gast)


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

von Michael D. (etzen_michi)


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.

von heinz (Gast)


Lesenswert?

jo, das war der Transferteil ;)

von chris (Gast)


Lesenswert?

Das hab ich erkannt ;)))

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
Noch kein Account? Hier anmelden.