Forum: Mikrocontroller und Digitale Elektronik Bestimmte Ausgänge von Ausgangsport manipulieren


von Gerd Harsen (Gast)


Lesenswert?

Hallo!

Ich habe eine Frage bezüglich der Portmaskierung bei Ausgängen.
Ich möchte vom Port 1 Bit 6 und 7 ändern, Bit 7 soll an sein, Bit 6 aus, 
die anderen sollen jedoch unbeeinflusst bleiben.

Ich habe es mit
1
(P1OUT & 0xCO) = 0x80;
probiert, jedoch bekomme ich eine Fehlermeldung, dass P1OUT "a 
modifiable value" sein muss.

Wie kann ich das lösen?


Vielen Dank!

von Gerd Harsen (Gast)


Lesenswert?

Sorry, das "O" in 0xC0 ist natürlich eine NULL.

von ohforf (Gast)


Lesenswert?

Bit 7 setzen:
P1OUT |= 0x80;

Bit 7 löschen:
P1OUT &= ~0x80

Bin mir nicht sicher, prüf mal nach ob das Sinn ergibt.

von Gerd Harsen (Gast)


Lesenswert?

ohforf schrieb:
> Bit 7 setzen:
> P1OUT |= 0x80;
>
> Bit 7 löschen:
> P1OUT &= ~0x80

Ja, das ergibt Sinn, klar geht das so, aber ich möchte in einem Rutsch 
Bit 6 und 7 meines Ausgnagsports manipulieren.

Also als Pseudo-Quelltext:

(Ausgangsport 1 UND_ZWAR_NUR_BIT6_UND_BIT7) = BIT6_AUS_UND_BIT7_AN

Wenn ich P1OUT = 0x80, dann schreibe ich ja auf den ganzen Port.

von Gerd (Gast)


Lesenswert?

Du hast den kleinen Strich vor dem = übersehen. Exklusiv-Oder ist dein 
Freund!

von Bastler (Gast)


Lesenswert?

Mach einen Zwischenschritt.

Var_Port = P1OUT; // hier PIN1 ?
Var_Port |= 0x80;
Var_Port &= ~0x40;
P1OUT = Var_Port;

von Gerd Harsen (Gast)


Lesenswert?

Gerd schrieb:
> Du hast den kleinen Strich vor dem = übersehen. Exklusiv-Oder ist dein
> Freund!

:) Ja ist er auch, aber nicht hier.

Mit EXOR setze ich ja nur, unabhängig von Bit6 das Bit von Bit7, jedoch 
wird dadurch nicht Bit6 gelöscht.

von Gerd Harsen (Gast)


Lesenswert?

Bastler schrieb:
> Var_Port |= 0x80;
> Var_Port &= ~0x40;

Gibt es dafür denn keinen gemeinsamen Ausdruck?

von Lord Z. (lordziu)


Lesenswert?

Var_Port = Var_Port | 0x80 & ~0x40;

von Gerd Harsen (Gast)


Lesenswert?

Wieso kann ich denn nicht direkt so auf den Port schreiben?
1
P1OUT &= ~H1 |= H2;

Das geht nicht, kommt immer Fehler mit modifiable value.

von Hc Z. (mizch)


Lesenswert?

> Var_Port = Var_Port | 0x80 & ~0x40;

Nein.  & bindet stärker.  Das ~0x40 tut hier gar nichts.

Var_Port = (Var_Port & ~0x40) | 0x80;

(Die Klammern dienen zur Verdeutlichung.)

von Karl H. (kbuchegg)


Lesenswert?

Gerd Harsen schrieb:
> Wieso kann ich denn nicht direkt so auf den Port schreiben?
>
>
1
P1OUT &= ~H1 |= H2;
>
> Das geht nicht, kommt immer Fehler mit modifiable value.

Wenn dir das Kopfzerbrechen macht, dann brauchst du dringend ein C-Buch.

von Gerd Harsen (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wenn dir das Kopfzerbrechen macht, dann brauchst du dringend ein C-Buch

Ja, das brauche ich! Kannst du mir trotzdem grad damit helfen und mir 
ggf. viellicht ein gutes Buch empfehlen?

von Karl H. (kbuchegg)


Lesenswert?

Gerd Harsen schrieb:
> Karl heinz Buchegger schrieb:
>> Wenn dir das Kopfzerbrechen macht, dann brauchst du dringend ein C-Buch
>
> Ja, das brauche ich! Kannst du mir trotzdem grad damit helfen und mir
> ggf. viellicht ein gutes Buch empfehlen?

Den Klassiker

Kernighan & Ritchie, Programmieren in C

Aber das steht in jedem C Buch
Das erklärt dir nämlich, dass diese ganzen Operatoren

   a op= b

Kurzschreibweisen für

   a =  a op b

sind.

Also steh bei dir

    P1OUT = P1OUT & ( ~H1 = ~H1 | H2 );

wie willst du denn an ~H1 etwas zuweisen? Ganz besonders dann, wenn H1 
eigentlich zb eine Konstante ist.

von Gerd Harsen (Gast)


Lesenswert?

Ich mein die ingänge kann ich ja auch mit
1
((P1IN & 0x3C) == 0x10)
auf Bit4 abfragen

von Karl H. (kbuchegg)


Lesenswert?

Gerd Harsen schrieb:
> Ich mein die ingänge kann ich ja auch mit
>
1
((P1IN & 0x3C) == 0x10)
> auf Bit4 abfragen

Das ist aber etwas völlig anderes. Da kommen keine 
Kurzschreibweise-Operatoren op= vor

von Gerd Harsen (Gast)


Lesenswert?

OK, vielen Dank, das werde ich mir zulegen!

von Gerd Harsen (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Das ist aber etwas völlig anderes. Da kommen keine
> Kurzschreibweise-Operatoren op= vor

Gibt es denn dafür auch einen Ausdruck?

von Gerd Harsen (Gast)


Lesenswert?

Zwei Ausdrücke kann ich ja so auch gleichzeitig auschalten.
1
(P1OUT &= ~(0x01 | 0x03))

Gibts es denn nun etwas für einen an, den anderen aus?

Karl heinz Buchegger schrieb:
> Kurzschreibweise-Operatoren op= vor

Was bedeutet das?

von Peter (Gast)


Lesenswert?

Gerd Harsen schrieb:
> Zwei Ausdrücke kann ich ja so auch gleichzeitig auschalten.
> (P1OUT &= ~(0x01 | 0x03))
> Gibts es denn nun etwas für einen an, den anderen aus?

Ja, wurde doch schon genannt, z.B. hier:

Beitrag "Re: Bestimmte Ausgänge von Ausgangsport manipulieren"

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.