Forum: Mikrocontroller und Digitale Elektronik bit invertieren in C


von Johannes (Gast)


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

von mkmk (Gast)


Lesenswert?

#define ToggleBit(ADDRESS,BIT) ((ADDRESS) ^= (1<<BIT))

von Andreas W. (Gast)


Lesenswert?

mit einem Exklusiv-ODER:

PORTC ^= (0x02);

von Mischa W. (luchs2a)


Lesenswert?

Hilfe zur Selbsthilfe

erst suchen dann Fragen !

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

von cazy horse (Gast)


Lesenswert?

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

von Johannes (Gast)


Lesenswert?

Danke!

dies Forum hat echt eine hohe Baudrate ;)

mg,
Johannes

von Schoaschi (Gast)


Lesenswert?

ich benutze immer:
Portc.1=!Portc.1

mfg

von Jens (Gast)


Lesenswert?

hey Leute.

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


Viele Grüße

von ede (Gast)


Lesenswert?

! ungleich ~

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

var =~var; sollte jedoch gehen!

von (prx) A. K. (prx)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

Du meinst vermutlich

PINC ^= 1<<PC2;

von (prx) A. K. (prx)


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.

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.