Variable Portzuweisung PXOUT

Gast #4455425
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.
Gast #4455430
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.
Gast #4455494
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.
#4455507
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.
Gast #4455556
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.
#4455602
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
}
#4455735
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...
#4455861
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.
Gast #4455972
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.

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