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?
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.
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.
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?
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.
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.
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.
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....
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;
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.
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.