Forum: Mikrocontroller und Digitale Elektronik Frage zur Bitmanipulation


von Peter K. (Gast)


Lesenswert?

Hallo,

wie kann man denn aus einer Variable tmp z.B. Bit3(0b00000100) auf ein 
anderes Bit eines PORTs übertragen(also z.B. PORTB.1)?

Viele Grüße

von Timmo H. (masterfx)


Lesenswert?

tmp & (1<<3) ? PORTB |= 1 : PORTB &= ~1;

von Gerhard (Gast)


Lesenswert?

1
 wie kann man denn aus einer Variable tmp z.B. Bit3(0b00000100) auf ein
2
anderes Bit eines PORTs übertragen(also z.B. PORTB.1)?
3
4
 if ((tmp & 0b100) > 0)
5
   PORTB |= 0b1;
6
 else
7
   PORTB &= ~0b1;

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Ich würds übers T-Flag machen, mit BLD, und dann mit SBI und CBI 
arbeiten. Das ist am sichersten, weil man ja damit rechnen muss, dass 
sich der Inhalt von PORTB zwischen dem Lesen und Schreiben ändern kann - 
jedenfalls wenn dort auch Input-Pins verwendet werden - oder Output per 
Interrupt geschrieben wird.

Peter K. hat uns allerdings nicht verraten, welchen Mikrocontroller er 
verwendet oder welche Programmiersprache er benutzt... Geheimnisvoll... 
;-)

von Peter K. (Gast)


Lesenswert?

Hi und Tschuldigung,

ich benutze C und arbeite mit einem ATMega.

Irgendwie krieg ich's ned hin.

Ich möchte gerne die SoftPWM v.3 aus dem Forum benutzen 
(http://www.mikrocontroller.net/articles/Soft-PWM), die allerdings für 
einen ganzen Port geschrieben ist - ich bekomme von dieser ein Array aus 
8 Elementen ausgegeben, die dann direkt auf einen ganzen Port umgesetzt 
werden.
Ich habe aber leider keinen vollständigen Port zur Verfügung und 
versuche irgendwie, es umzubasteln.

... damit werden die PWM-Werte übergeben:
pwm_setting[0] = x; // PD0
pwm_setting[1] = x; // PD1
pwm_setting[2] = x; // PD2
... und hier die PORT-Bits gesetzt > aber dies darf halt so auch nicht 
mehr sein, da ich ja sonst PIN-Zustände, die ich anderweitig benutzen 
will, verändern würde:
PWM_PORT = tmp;
...


Und so bräuchte ich es...
pwm_setting[0] = 50;  // PD3
pwm_setting[1] = 100; // PB1

Jemand einen Rat?

LG

von J. S. (bb84)


Lesenswert?

Hat sowas

PORTB = (PORTB & 0b111101111) & (temp & 1<<3)

nachteile gegebüber der if schleife?

von Cyblord -. (cyblord)


Lesenswert?

Julian S. schrieb:

>
> nachteile gegebüber der if schleife?

Was ist eine if-schleife? Sowas gibts nicht.

von Ein (Gast)


Lesenswert?

Peter K. schrieb:
> wie kann man denn aus einer Variable tmp z.B. Bit3(0b00000100) auf ein

Du weisst aber schon, das in deiner Binärzahl Bit2 und nicht Bit3 
gesetzt ist.

von marcus6100 (Gast)


Lesenswert?

Peter K. schrieb:
> wie kann man denn aus einer Variable tmp z.B. Bit3(0b00000100) auf ein
> anderes Bit eines PORTs übertragen(also z.B. PORTB.1)?

Das geht übrigens auch ohne if (ist aber nicht unbedingt schneller)

PORTB = (PORTB & 0b11111101) | (tmp & 0b00000100) >> 1;

von marcus6100 (Gast)


Lesenswert?

Julian S. schrieb:
> Hat sowas
>
> PORTB = (PORTB & 0b111101111) & (temp & 1<<3)
>
> nachteile gegebüber der if schleife?

Es gibt keine if Schleifen, und sowas ist kaputt.

Mal angenommen du ersetzt das mittlere & durch ein | dann hats folgende 
Vorteile:

- Schneller auf Architekturen wo Sprünge teuer sind
- Konstante Ausführungszeit

Nachteile:

- Bei auf Bitmanipulation optimierten Mikrokontroller Architektur 
potentiell langsamer weil längerer Code.
- PORTB wird komplett neu beschrieben, problematisch wenn in Interrupts 
einzeln andere Bits des gleichen Port gesetzt/gelöscht werden.

von Peter K. (Gast)


Lesenswert?

Hallöchen,

ich weiß ned ganz... irgendwie komm ich absolut ned mit. Durch's 
rumprobieren komm ich aber auch ned weiter.:(

Hier vielleicht einmal zum besseren Verständnis:
In der besagten PWM-Funktion gibt es eine Variable 'tmp' mit 8 Bits für 
die I/Os des Ports D.
Diese Funktion ist also so aufgebaut, dass immer der volle Port für PWM 
benutzt wird. Da ich aber z.B. PD0+1 für den UART benötige, dürfen diese 
Bits beim Beschreiben des Ports niemals verändert werden. Desweiteren 
benötige ich auch PORTB.1. Spezieller gesagt möchte ich PD3,PD5,PD6 und 
PB1 für die LEDs benutzen und sonst auch keinerlei Bits durch die 
Funktion verändern.
Also wie bekommt man es hin, mit dem Funktionsaufruf...

pwm_setting[0] = 50; //für PD3
pwm_setting[1] = 50; //für PD5
pwm_setting[2] = 50; //für PD6
pwm_setting[3] = 50; //für PB1

... in der PWM-Routine auch die richtigen Ausgänge ansprechen zu können? 
(und natürlich auch in der Port-Beschreibung nur die Bits der LED-Pins 
zu verändern?)

Bin für jeden Rat dankbar.

Liebe Grüße

von Peter K. (Gast)


Lesenswert?

Keiner einen Rat?

Lg

von Cyblord -. (cyblord)


Lesenswert?

Peter K. schrieb:

> ich weiß ned ganz... irgendwie komm ich absolut ned mit. Durch's
> rumprobieren komm ich aber auch ned weiter.:(

D.h. für dich erstmal Grundlagen Pauken. Dann denke weiter an dein PWM 
und sonstiges. Vorher wird das nichts.
Also fang damit an, Bitmanipulationen und grundsätzlichen C Syntax zu 
verstehen.

gruß cyblord

von Klaus W. (mfgkw)


Lesenswert?

Peter K. schrieb:
> Keiner einen Rat?

Mal das Tutorial lesen?
Dazu ist es da!

von Peter K. (Gast)


Lesenswert?

Das Tutorial hab ich glaub ich schon an die zwanzig Mal gelesen, genauso 
wie eine C-Referenz. Ich schnall es aber trotzdem irgendwie nicht.:(

lg

von Cyblord -. (cyblord)


Lesenswert?

Peter K. schrieb:
> Das Tutorial hab ich glaub ich schon an die zwanzig Mal gelesen, genauso
> wie eine C-Referenz. Ich schnall es aber trotzdem irgendwie nicht.:(
>
> lg

Völlig und in Gänze oder wie? Wenn du eine konkrete Frage hast, kannst 
du sie hier stellen. Ansonsten nicht nur lesen sondern ausprobieren. In 
kleinen Schritten. Lesen , Probieren Lesen usw.

von Peter K. (Gast)


Lesenswert?

Danke, werd ich machen.
Ich glaube, dass ich mit Hex-Werten doch ein größeres Problem habe, als 
ich dachte. Deshalb fällt's mir wahrscheinlich so schwer, eine Abfrage 
zu realisieren.

Bis denne...

lg

von Cyblord -. (cyblord)


Lesenswert?

Niemand zwingt dich Hex-Werte zu benutzen. Binär oder Dezimal geht auch. 
Nur sind Hex-Werte eigentlich optimal um Bytes oder Words für den 
Menschen dazustellen.

von Peter K. (Gast)


Lesenswert?

Hmmm... ich glaub, ned ganz. Der µC ist wohl der einzige, dem Hex-Werte 
positiv gegenüberstehen.^^

Ich hab' wohl leichte Konzentrationsprobleme. Mit ein wenig mehr 
investierter Zeit klappt's nun endlich^^:

if(tmp & 0x08) PORTB |= (1<<1);
if(tmp & 0x04) PORTD |= (1<<3);

if((tmp & 0x08) == 0) PORTB &= ~(1<<1);
if((tmp & 0x04) == 0) PORTD &= ~(1<<3);

Danke für die "Hilfe zur Selbsthilfe"!!!;-)

Liebe Grüße

von Cyblord -. (cyblord)


Lesenswert?

Peter K. schrieb:
> Hmmm... ich glaub, ned ganz. Der µC ist wohl der einzige, dem Hex-Werte
> positiv gegenüberstehen.^^

Doch kannst mir glauben.
Und der µC kennt nur Binärwerte. Andere Zahlendarstellungen sind ihm 
unbekannt.

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.