Das Bit vom Byte in den PortPin

Gast #49162
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
Gast #49164
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
Gast #49165
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...
Gast #49166
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
Gast #49167
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.
Gast #49168
@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
Gast #49169
... 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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 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.