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
Moin Tipper, so wird das auch nichts. Zunächst einmal: welcher Controller, welcher Compiler? Gruß, Olaf
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
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...
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
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.
@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
... 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.