www.mikrocontroller.net

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


Autor: Tipper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tipper,

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

Gruß,
Olaf

Autor: Tipper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes Raschke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tipper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.