Variable Portzuweisung PXOUT

Gast
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
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
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.
> 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
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.
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
}
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...
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.