Forum: Mikrocontroller und Digitale Elektronik Variable Portzuweisung PXOUT


von Klaus (Gast)


Lesenswert?

Hallo,

ich habe mal eine ganz banale Frage.

Ich möchte gerne den Wert einer Variable, an einem bestimmten PIN 
ausgeben

PXOUT = Variable;

Mit dem Befehle gebe ich ja den Wert der Variable am ganzen PortX,
aber wie weise ich den Wert PortX.0 und PortX.1 zu?

von Stefan (Gast)


Lesenswert?

Der Port wird ja über ein Register angesprochen. Das Register besteht 
aus einzelnen Bits. Die Nummer des Ports ist das entsprechende Bit.

Willst du Port POUT.0 auf 1 setzen, dann sieht das so aus: 00000001
Bei POUT.1: 00000010

Natürlich kannst du die Bitvektoren beliebig angeben. z.B dezimal als 1 
und 3. oder Hexadezimal als 0x01 0x03.

von Klaus (Gast)


Lesenswert?

Stefan schrieb:
> Der Port wird ja über ein Register angesprochen. Das Register
> besteht aus einzelnen Bits. Die Nummer des Ports ist das entsprechende
> Bit.
>
> Willst du Port POUT.0 auf 1 setzen, dann sieht das so aus: 00000001
> Bei POUT.1: 00000010
>
> Natürlich kannst du die Bitvektoren beliebig angeben. z.B dezimal als 1
> und 3. oder Hexadezimal als 0x01 0x03.

Ich möchte nicht das Bit auf High setzen,
Sonder den Inhalt der Varable, die Bsp Var heißt, mit dem Pxout.4 und 
Pxout.5 gleichsetzen. Da sich der Inhalt jedesmal ändert.

von Mein grosses V. (vorbild)


Lesenswert?

Klaus schrieb:
> Sonder den Inhalt der Varable, die Bsp Var heißt, mit dem Pxout.4 und
> Pxout.5 gleichsetzen.

Du kannst den Inhalt einer Variablen, die aus mindestens 8 Bit besteht, 
nicht an zwei Portpins ausgeben. Sondern nur bestimmte Bits dieser 
Variable.

Welche Bits sollen das sein?

von Klaus (Gast)


Lesenswert?

Mein grosses V. schrieb:
> Klaus schrieb:
>> Sonder den Inhalt der Varable, die Bsp Var heißt, mit dem Pxout.4 und
>> Pxout.5 gleichsetzen.
>
> Du kannst den Inhalt einer Variablen, die aus mindestens 8 Bit besteht,
> nicht an zwei Portpins ausgeben. Sondern nur bestimmte Bits dieser
> Variable.
>
> Welche Bits sollen das sein?

Ich habe eine Variable, die sich Var nennt und in einem Zwischenschritt 
vorher habe ich mit diesem Befehl

Var |= (1 << 3);
Var |= (1 << 2);

P7OUT = Var;

aber, P7OUT = VAR setze, habe ich das Problem, dass er doch alle Ports 
von P7 beschriebt, mit 0 oder 1, und dass soll nicht geschehen. weil ich 
Port P1.0, P1.1, P1.6 und P1.7 benötige, sonst manipuliert es deren 
WERT.

von Klaus (Gast)


Lesenswert?

P1.0, P1.1, P1.6 und P1.7

ist natürlich

P7.0, P7.1, P7.6 und P7.7 gemeint.

von Cyblord -. (cyblord)


Lesenswert?

> Ich möchte gerne den Wert einer Variable, an einem bestimmten PIN
> ausgeben


>  Ich möchte nicht das Bit auf High setzen,

> weil ich Port P1.0, P1.1, P1.6 und P1.7 benötige

> sonst manipuliert es deren WERT.

Ich finde es schon immer Krass was für Vollspasten sich mit der Materie 
hier beschäftigen.

Der kann ja noch nicht mal beschreiben WAS er eigentlich tun will. Nur 
Geschwurbel und Gestammel.

von Stefan (Gast)


Lesenswert?

Jau, bin auch raus. Verstehs nicht worauf du hinaus willst

von Klaus (Gast)


Lesenswert?

Cyblord -. schrieb:
> Ich finde es schon immer Krass was für Vollspasten sich mit der Materie
> hier beschäftigen.
>
> Der kann ja noch nicht mal beschreiben WAS er eigentlich tun will. Nur
> Geschwurbel und Gestammel.

Bleib mal freundlich. Statt doofe Kommentare hier abzulassen, kannst du 
Menschen helfen und wenn du keine Zeit oder Lust darauf hast, dann geh 
arbeiten oder mach was anderes sinnvolles, aber niemand beledigen. 
Dieses Forum dient personen, die Hilfe brauchen von Person, die es 
können.

Du bist wahrscheinlich einer von denen, die nur im Forum rumschauen und 
standing blöde Kommentare hinterlassen.

So nochmal.

Das ist mein geschriebenes Programm:

 {
  uint8_t VAR1;
  uint8_t VAR2;


  VAR1 = 0;
  VAR2 = 0;

  if (data & (1 << 0))
    VAR1 |= (1 << 3);
  if (data & (1 << 1))
    VAR1 |= (1 << 2);

  if (data & (1 << 2))
    VAR2 |= (1 << 3);

  if (data & (1 << 3))
    VAR2 |= (1 << 0);

  P7OUT = VAR1;
  P8OUT = VAR2;

Ich gebe ja  mit dem Befehl   P7OUT = VAR1 und P8OUT = VAR2, den Inhalt 
an meinen PORT7 und PORT8 oder habe ich das falsch verstanden?

Wie kann ich es realisieren, dass ich den Inhalt von meiner Variable 
VAR1 auf PORT 7.2 und Port7.3 und den Inhalt von VAR2 auf Port8.4 und 
Port8.5 ausgebe. Alle anderen Ports sollen, ungetastet bleiben. Das 
heist, ich möchte über Port7.1, 7.2, 7.6 und 7.7 eine LED leuchten 
lassen, und daher soll es keine Auswirkunf auf das Leuchten meiner LED 
haben.

von Georg G. (df2au)


Lesenswert?

PORT7 &= 0xf3; // löscht Bit 2 und 3
PORT7 |= VAR1; // setzt die Bits aus VAR1

Port 8 entsprechend.

Anmerkung: Als Port werden iA die gesamten 8 Bit bezeichnet. Du möchtest 
einzelne Portbits setzen.

von Thomas E. (picalic)


Lesenswert?

Servus,

über Exclusiv-Oder und ggf. eine Hilfsvariable kann man gezielt eine 
bestimmte Kombination von Portbits modifizieren:
1
{
2
  uint8_t VAR1;
3
  uint8_t VAR2;
4
  uint8_t temp; // Hilfsvariable
5
6
7
  VAR1 = 0;
8
  VAR2 = 0;
9
10
  if (data & (1 << 0))
11
    VAR1 |= (1 << 3);
12
  if (data & (1 << 1))
13
    VAR1 |= (1 << 2);
14
15
  if (data & (1 << 2))
16
    VAR2 |= (1 << 3);
17
18
  if (data & (1 << 3))
19
    VAR2 |= (1 << 0);
20
21
  temp = PORT7 ^ VAR1;    // Bits in temp: 1 für "ungleich" 
22
  temp &= (1<<2 | 1<<3)  // maskieren: nur diese Bits sollen sich ändern!
23
  PORT7 ^= temp;         // Port Modifizieren
24
25
  temp = PORT8 ^ VAR2;    // Bits in temp: 1 für "ungleich" 
26
  temp &= (1<<0 | 1<<3)  // maskieren: nur diese Bits sollen sich ändern!
27
  PORT8 ^= temp;         // Port Modifizieren
28
}

von Sascha (Gast)


Lesenswert?

Schlagt mich, aber steht das nicht auch alles im AVR-GCC Tutorial?

von Peter D. (peda)


Lesenswert?

1
  (data & (1 << 0) ? VAR1 |= (1 << 3) : VAR1 &= ~(1 << 3);
Oder:
1
  VAR1 = (VAR1 & ~(1 << 3)) | ((data & (1 << 0))<<3);

von Thomas E. (picalic)


Lesenswert?

Sascha schrieb:
> Schlagt mich, aber steht das nicht auch alles im AVR-GCC Tutorial?

Keine Ahnung, um das zu beurteilen, müsste man das AVR-GCC Manual 
kennen....

von Sascha (Gast)


Lesenswert?


von Thomas E. (picalic)


Lesenswert?

Sascha schrieb:
> Also ich meine
> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_Register
>
> und
>
> http://www.mikrocontroller.net/articles/Bitmanipulation

Also, Du musst doch geschlagen werden! ;)
Ich sehe da nur, wie man mit XOR bestimmte Bits toggled, aber keinen 
Tipp, wie man ausgewählte Bits aus einer Variablen ins Portregister 
kopiert, ohne die anderen Bits zu verändern. So hatte ich die 
Eingangsfrage verstanden...

von Stefan (Gast)


Lesenswert?

Indem ich das Portregister mit der Variable oder-verknüpfe?

von Thomas E. (picalic)


Lesenswert?

Stefan schrieb:
> Indem ich das Portregister mit der Variable oder-verknüpfe?

Damit kann man nur Bits auf 1 setzen, nicht aber deren Wert "kopieren".

Mit zwei XORs kann man Bits "kopieren", hier als Einzeiler und ohne 
Hilfsvariable:
PORT ^= (PORT ^ variable) & BITMASK;

von Peter D. (peda)


Lesenswert?

Thomas E. schrieb:
> Mit zwei XORs kann man Bits "kopieren", hier als Einzeiler und ohne
> Hilfsvariable:

Dabei muß man aber erst noch "variable" an die gleiche Bitposition 
verschieben.
Und viele Architekturen unterstützen kein XOR auf Ports, d.h. der 
Compiler legt eine weitere Zwischenvariable an.
Auch kann eine atomare Kapselung nötig werden, wenn Interrupts andere 
Pins des selben Ports ändern.

von StinkyWinky (Gast)


Lesenswert?

Ich würde eine Variable nehmen, die den OUT-Zustand des Ports abbildet. 
Dort nach belieben mit Bitmanipulation oder Masken wie oben hinreichend 
beschrieben die gewünschten Änderungen anbringen, danach die Variable 
auf den Port schreiben. Dies verhindert unnötiges Toggeln der Ausgänge.

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.