mikrocontroller.net

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


Autor: Gerd Harsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
(P1OUT & 0xCO) = 0x80;
probiert, jedoch bekomme ich eine Fehlermeldung, dass P1OUT "a 
modifiable value" sein muss.

Wie kann ich das lösen?


Vielen Dank!

Autor: Gerd Harsen (Gast)
Datum:

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

Autor: ohforf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bit 7 setzen:
P1OUT |= 0x80;

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

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

Autor: Gerd Harsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerd (Gast)
Datum:

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

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach einen Zwischenschritt.

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

Autor: Gerd Harsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerd Harsen (Gast)
Datum:

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

Gibt es dafür denn keinen gemeinsamen Ausdruck?

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Var_Port = Var_Port | 0x80 & ~0x40;

Autor: Gerd Harsen (Gast)
Datum:

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

Das geht nicht, kommt immer Fehler mit modifiable value.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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

Autor: Gerd Harsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerd Harsen (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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

Autor: Gerd Harsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, vielen Dank, das werde ich mir zulegen!

Autor: Gerd Harsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gerd Harsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

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

Was bedeutet das?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.