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.
P1.0, P1.1, P1.6 und P1.7 ist natürlich P7.0, P7.1, P7.6 und P7.7 gemeint.
> 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.
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 | }
|
1 | (data & (1 << 0) ? VAR1 |= (1 << 3) : VAR1 &= ~(1 << 3); |
Oder:
1 | VAR1 = (VAR1 & ~(1 << 3)) | ((data & (1 << 0))<<3); |
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....
Also ich meine http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_Register und http://www.mikrocontroller.net/articles/Bitmanipulation
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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.