Forum: Mikrocontroller und Digitale Elektronik Das Bit vom Byte in den PortPin


von Tipper (Gast)


Lesenswert?

Hallo C-Gemeinde,

ich habe da eine Variable

char togglePin;

Den Zustand der einzelnen Bits dieser Variablen möchte ich, in
beliebiger Reihenfolge, auf einen PortPin ausgeben.

#define PortPin P9_P0 // Port 9, Pin 0

Ahnungslos wie ich bin hab' ich mal so angefangen:

PortPin = togglePin^7 // Sollte den Zustand von Bit 7 der Variablen
                      // auf den PortPin ausgeben.

Der Compiler gibt keinen Fehler aus. Funktionieren tut's trotzdem
nicht.

Muß ich da noch was Initialisieren bzw. Definieren?

Tipper

von Olaf (Gast)


Lesenswert?

Moin Tipper,

so wird das auch nichts. Zunächst einmal: welcher Controller, welcher
Compiler?

Gruß,
Olaf

von Tipper (Gast)


Lesenswert?

Hallo Olaf,

ich hatte angenommen die Befehle von 'C' sind portierbar. Deshalb
hatte ich die MCU( 16-Bit,XC161 ) und Compiler( Keil C166 )
unterschlagen.

Sorry, Tipper

von Johannes Raschke (Gast)


Lesenswert?

Hi!

In C gibt's doch auch bitweises AND, oder? Die Schreibweise
Variable^Bitnummer kannte ich noch nicht...
Kannst es ja mal mit dem AND probieren...

von Olaf (Gast)


Lesenswert?

Hi Tipper,

ich weiß leider nicht, welche Macros oder Funktionen der Keil für den
Zugriff auf die Ports des C166 bietet. Grundsätzlich ist es so, dass du
den Port-Zustand liest (1 Byte), dann eine Bit-Operation mit einer
Maske durchführst und dann den manipulierten Wert zurück an den Port
schreibst. Zum Löschen eines Bits machst du eine UND-Verknüpfung mit
einer "0", zum Setzten eine ODER-Verknüpfung mit einer "1".

In deinem Fall hättest du also den Wert des Ports, die Variable und die
Angabe über die zu ändernde Bitnummer. Da du ein beliebiges Bit (und
nicht alle auf einmal)ändern möchtest, wäre folgede Lösung angebracht
(kannst dir ja ein Macro schreiben):

"PortA" = ("PortA" & ~"BitNum") | ("Var" & "BitNum")


Hilft dir das weiter?

Gruß,
Olaf

von Joerg Wunsch (Gast)


Lesenswert?

Es gibt Compiler, die sowas auch mit xor (also dem ^ Operator)
erledigen können, namentlich bei AVR ist das üblich.  Aber ^ 7
ist dennoch falsch, es würde nämlich die Bits 0 bis 2 toggeln.
^ (1 << 7) wäre die korrekte Schreibweise, um das Bit 7 zu
ändern.

Ob das bei Keil geht, hab' ich keine Ahnung.

von Tipper (Gast)


Lesenswert?

@Olaf:

Dein Beispiel ist für mich verständlich. Werd's am Abend
ausprobieren.



@Joerg Wunsch:

>....es würde nämlich die Bits 0 bis 2 toggeln.

Dies ist mir im disassemblierten Code aufgefallen. Konnte mir aber die
Ursache nicht erklären.
Werde auch Deine Variante weiter verfolgen.

Besten Dank!   Tipper

von Olaf (Gast)


Lesenswert?

... geht es denn hier ums Toggeln oder um das gezielte Setzen bzw.
Löschen eines Bits? Die Operation "^" ist ein XOR (nach ANSI) und
sollte damit bei sämtlichen C-Compilern funktionieren. Für das
beschriebene Problem aber wohl eher ungeeignet, gell?

Gruß,
Olaf

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.