mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik bit invertieren in C


Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie invertiert man ein bestimmtes Bit aus einem Register moeglichst
elegant (wenn man in C programmiert)?

Ich moechte zB PC2 vom PORTC-Register invertieren.

mg,
Johannes

Autor: mkmk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define ToggleBit(ADDRESS,BIT) ((ADDRESS) ^= (1<<BIT))

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit einem Exklusiv-ODER:

PORTC ^= (0x02);

Autor: Mischa W. (luchs2a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilfe zur Selbsthilfe

erst suchen dann Fragen !

http://www.mikrocontroller.net/articles/Bitmanipulation

Autor: cazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nicht ganz konform - aber mit CodeVision geht auch:
PORTC.2=~PORTC.2;
Ich finde es sehr praktisch.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

dies Forum hat echt eine hohe Baudrate ;)

mg,
Johannes

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich benutze immer:
Portc.1=!Portc.1

mfg

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey Leute.

ist
port = ~port
 compilerabhängig? Welchen Grund kann dahinter stecken, wenn es nicht 
funktioniert? Ebenso funktioniert
port = !port
 nicht.


Viele Grüße

Autor: ede (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
! ungleich ~

http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/...

var =~var; sollte jedoch gehen!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine weiter Variante ist
 PINC = 1<<PC2;
bei nicht zu alten AVRs. Ist die schnellste und atomar.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst vermutlich

PINC ^= 1<<PC2;

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das war kein Tippfehler. Schreibt man eine 1 ins Input Register, 
dann ändert sich der Zustand des Ausgangs, schreibt man ein 0, dann 
nicht. Es ist also nicht erforderlich, vorher den Inhalt zu lesen.

Das ist nicht nur kürzer, sondern insbesondere atomar, d.h. es kann kein 
Interrupt mitten reinrutschen. Was von besonderer Bedeutung ist, wenn 
eine ISR ebenfalls an den Port rumfummelt.

Diese Funktion gibt es noch nicht bei den älteren Typen wie Mega8/16/32, 
sondern erst ab z.B. Tiny2313, Mega88/644.

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.