Frage zur Bitmanipulation

Gast #2577495
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;
(Firma: guloshop.de) #2577505
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... 
;-)
Gast #2577509
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
Gast #2577942
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.
Gast #2578074
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
Gast #2578544
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
Gast #2578564
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

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