Forum: Mikrocontroller und Digitale Elektronik Bedeutung des Zeichens "|" in C


von A. R. (redegle)


Lesenswert?

Hallo,

wenn ich in C einen Pin als Ausgang einstelln möchte. Dann verwendet man 
folgenden Befehlt.
1
PORTB = PORTB | 0x04;

Ich hab gelesen, dass ein "|" ODER bedeutet.

Aber irgendwie macht das doch keinen Sinn oder?

von Maxx (Gast)


Lesenswert?

Es ist der (Bitweise) Oder Operator.

Beachte, es ist nicht das umgangsprachliche: PORTB oder 0x04 sondern im 
Ergebnis ist genau dann ein bit gesetzt (=1), wenn es in dem einen ODER 
dem anderen Argument gesetzt war.

Sprich in der Anweisung PORTB = PORTB | 0x04; ist am Ende jedes Bit, 
dass in PORTB schon gesetzt war gesetzt und darüber hinaus ist auch das 
Bit, dass in 0x04 gesetzt ist auf 1 gesetzt.

von Michael H. (michael_h45)


Lesenswert?

> Aber irgendwie macht das doch keinen Sinn oder?
http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/bitwise.html
Irgendwie schon, oder?

von Hc Z. (mizch)


Lesenswert?


von A. R. (redegle)


Lesenswert?

Super danke.

Dass hilft mächtig weiter.
Alles eine Sache der Definition.

Kann mir noch jemand sagen, was der Unterschied zwischen "|" und "|=" 
ist?

von Michael K. (aemkai)


Lesenswert?

> Ich hab gelesen, dass ein "|" ODER bedeutet.
>
> Aber irgendwie macht das doch keinen Sinn oder?

Es ist ein bitweise ODER-Verknüpfung, z.b. x = a | b bedeutet jede 1 aus 
a oder b wird übernommen.
Im vorliegenden Fall (PORTB = PORTB | 0x04;) heißt es, dass alle Bits, 
die von PORTB schon 1 sind, bleiben und zusätzlich das 4. Bit gesetzt 
wird, z.B. PORTB = 11000000, dann heißt es

11000000
oder
00001000
--------
11001000

d.h. die Operation ist nur zum Setzen, nicht zum Rücksetzen geeignet.

(schade, zu spät)

von Michael H. (michael_h45)


Lesenswert?

A. R. schrieb:
> Kann mir noch jemand sagen, was der Unterschied zwischen "|" und "|="
> ist?

a += b ist gleichbedeutend mit a = a+b.
Den Rest überlasse ich dir.

von Michael K. (aemkai)


Lesenswert?

A. R. schrieb:
> Super danke.
>
> Dass hilft mächtig weiter.
> Alles eine Sache der Definition.
>
> Kann mir noch jemand sagen, was der Unterschied zwischen "|" und "|="
> ist?

x |= 0x04 bedeutet x = x | 0x04, also das die erste Variable (x) auch 
die Ergebnisvariable (auch x) ist

von narf (Gast)


Lesenswert?

port  =  port | wert;

kurzschreibweise :

port |= wert;


funktioniert auch bei :

wert = wert + t ;

wert  += t ;

oder

wert -= t ;



bei port &= ~wert  ;

die Tilde bei ~wert ergibt das invertierte byte
aus 0x01 würde 0xFE  werden , das wird bitweise mit dem port verUNDet

von A. R. (redegle)


Lesenswert?

Vielen Dank.

Finde es echt klasse, wie schnell ich hier Hilfe bekomme.

von Michael B. (mb_)


Lesenswert?

Micha K. schrieb:
> Im vorliegenden Fall (PORTB = PORTB | 0x04;) heißt es, dass alle Bits,
> die von PORTB schon 1 sind, bleiben und zusätzlich das 4. Bit gesetzt
> wird

Nein. Es ist entweder das zweite oder dritte Bit. Je nachdem ob du von 0 
oder 1 anfängst zu zählen.

von berndl (Gast)


Lesenswert?

Michael Buesch schrieb:
> Nein. Es ist entweder das zweite oder dritte Bit. Je nachdem ob du von 0
> oder 1 anfängst zu zählen.

C-Programmierer druecken im Aufzug auf den Knopf mit der '3' wenn sie in 
den vierten Stock wollen...

von A. R. (redegle)


Lesenswert?

>Micha K. schrieb:
>> Im vorliegenden Fall (PORTB = PORTB | 0x04;) heißt es, dass alle Bits,
>> die von PORTB schon 1 sind, bleiben und zusätzlich das 4. Bit gesetzt
>> wird

>Nein. Es ist entweder das zweite oder dritte Bit. Je nachdem ob du von 0
>oder 1 anfängst zu zählen.

PORTB = 00000000
0x04  = 00000100

Durch eine "ODER-Verknüfung" ergibt sich.

00000100

Richtig?

Also das 3te BIT bzw. das BIT mit der Nummer 2 wird zu 1

von narf (Gast)


Lesenswert?

bit
0     0x01
1     0x02
2     0x04
3     0x08
4     0x10
5     0x20
6     0x40
7     0x80

besser ist es eh bei PORTs/Registern   (1<<Pxx) zu schreiben ...

von Michael H. (michael_h45)


Lesenswert?

Als hätte jemand meinen Link nicht gelesen....

von A. R. (redegle)


Lesenswert?

>Als hätte jemand meinen Link nicht gelesen....

Genau das habe ich getan.
Zitat:
"OR | kopiert ein Bit zum Ergebnis, wenn es in mindestens einem 
Operanden gleich 1 ist.. "

PORTB =    00000000
0x04  =    00000100
PORTB -->  00000100

von mano (Gast)


Lesenswert?

C-Compiler anwerfen und selber überprüfen.
1
#include <stdio.h>
2
3
int main (int argc, const char * argv[]) {
4
    
5
  int A = 0x00;
6
  int B = 0x04;
7
    
8
  printf("A    : 0x%02X\n", A);
9
  printf("B    : 0x%02X\n", B);
10
  printf("A | B: 0x%02X\n", A | B);
11
  
12
  return 0;
13
}

von A. R. (redegle)


Lesenswert?

Würde ich gerne machen.

Nur kann ich mit dem Skript nichts anfangen.

Das ist bereits 5 Schritte über meinen Know How level

von A. R. (redegle)


Lesenswert?

Habe nun folgendes Skript geschrieben.
1
#include <avr/io.h>
2
3
  
4
   
5
  main()
6
  {
7
    unsigned int a = 0;  
8
    unsigned int b = 4;  
9
    unsigned int c = 0;           
10
11
    c = a | b;       
12
  DDRB = 0b11111111; 
13
  PORTB = c;
14
  }

Laut der Simulation stimmt mein Ergebniss.

von Michael F. (startrekmichi)


Lesenswert?

Als schnelle Referenz auch ganz praktisch:
http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

von Vlad T. (vlad_tepesch)


Lesenswert?

A. R. schrieb:
> wenn ich in C einen Pin als Ausgang einstelln möchte. Dann verwendet man
> folgenden Befehlt.
> PORTB = PORTB | 0x04;

nein macht man nicht, man verwendet folgendes:

1
PORTB = PORTB | (1<<PIN4);
oder noch lesbarer:
1
PORTB |= (1<<PIN4);

viele schreiben auch
1
PORTB |= (1<<PB4);

Das hat den Vorteil, dass es nur compiliert, wenn der µC wirklich einen 
pin PB4 hat


am Allerbesten ist es aber, man schreibt folgendes:

1
#define LED_PORT PORTB
2
#define LED_DDR  DDRB
3
#define LED_BIT  PB4
4
5
static inline void LED_INIT(void) {  LED_DDR  |= (1 << LED_BIT); }
6
static inline void LED_ON  (void) {  LED_PORT |= (1 << LED_BIT); } // je nach dem ob high oder low aktiv, die namen tauschen 
7
static inline void LED_OFF (void) {  LED_PORT &=~(1 << LED_BIT); } //
Mit dem Schema, ist die Änderung des Ports an einer Stelle im Code nötig 
und die Zugriffe sind auch sehr gut lesbar.


edit:
siehst du da haben wir schon einen Fehler, der von deiner Schreibweise 
herrührt.  0x04 ist natürlich PB2

von A. R. (redegle)


Lesenswert?

@Michael Frangenberg

Danke für den Link


@Vlad Tepesch
könntest du noch erleutern, was du genau gemacht hast?
1
PORTB |= (1<<PIN4);

Was machen diese "<<" ?

Wo ist der unterschied zwischen

PIN4
PB4
DDB4

?
1
#define LED_PORT PORTB
Ich vermute dass es sich hierbei einfach nur um eine delaration handelt.
ALso das wenn ich LED_PORT Schreibe wird PORTB angesprochen.

1
static inline void LED_INIT(void)

Hiermit kann ich nichts anfangen.

von Wichtel (Gast)


Lesenswert?

A. R. schrieb:
> wenn ich in C einen Pin als Ausgang einstelln möchte. Dann verwendet man
> folgenden Befehlt.
> PORTB = PORTB | 0x04;

Das kann nicht funktionieren.
Um einzustellen ob ein oder mehrere Pin(s) Ausgänge sein sollen wird das 
zugehörige DDR (Data Direction Register) verwendet.

Der Zugriff auf den Port an sich setzt dann entweder die Ausgänge oder 
(wenn DDR nicht beschrieben) dann nur Pullup-Widerstände an den 
Eingängen.

von Karl H. (kbuchegg)


Lesenswert?

A. R. schrieb:

> Hiermit kann ich nichts anfangen.

Es bedeutet eigentlich hauptsächlich, dass du ganz dringend Literatur 
über C benötigst. Eine Sprache wie C kann man nicht erlernen, indem man 
nach dem Muster Try&Error vorgeht bzw. sich die fehlenden Grundlagen in 
einem Forum zusammenfrägt. Dafür gibt es in C viel zu viele 
Kleinigkeiten, die allesamt gleichzeitig beachtet werden wollen.

Als Einstieg
http://openbook.galileocomputing.de/c_von_a_bis_z/
obwohl die meisten ein gedrucktes Buch (so richtig mit Buchstaben auf 
Papier) bevorzugen.

von Thilo M. (Gast)


Lesenswert?

ISBN 3-8272-5669-0 C/C++ Kompendium.
Von Dirk Louis, erschienen beim Mart & Technik Verlag, sehr zu 
empfehlen. Alles schön anhand Beispielen erklärt, nicht so trocken wie 
eine C/C++ - Referenz.

von Vlad T. (vlad_tepesch)


Lesenswert?

A. R. schrieb:
> @Vlad Tepesch
> könntest du noch erleutern, was du genau gemacht hast?
> Was machen diese "<<" ?

Schritt 1: c lernen

A. R. schrieb:
> Wo ist der unterschied zwischen
>
> PIN4
> PB4
> DDB4

Schritt 2: Datenblatt des Controllers lesen

A. R. schrieb:
> ?
> #define LED_PORT PORTBIch vermute dass es sich hierbei einfach nur um eine 
delaration handelt.
> ALso das wenn ich LED_PORT Schreibe wird PORTB angesprochen.
>
> static inline void LED_INIT(void)
> Hiermit kann ich nichts anfangen.

Wo wir wieder bei Schritt 1 wären

von A. R. (redegle)


Lesenswert?

>Es bedeutet eigentlich hauptsächlich, dass du ganz dringend Literatur
>über C benötigst. Eine Sprache wie C kann man nicht erlernen, indem man
>nach dem Muster Try&Error vorgeht bzw. sich die fehlenden Grundlagen in
>einem Forum zusammenfrägt. Dafür gibt es in C viel zu viele
>Kleinigkeiten, die allesamt gleichzeitig beachtet werden wollen.

Richtig.
Deswegen habe ich versucht mir anhand der wiki auf diesem Forum ein 
bisschen Wissen anzueignen.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Ein paar Kleinigkeiten waren jedoch nicht 100%ig ersichtlich.
Deswegen fragte ich hier nach.

>Als Einstieg
>http://openbook.galileocomputing.de/c_von_a_bis_z/
>obwohl die meisten ein gedrucktes Buch (so richtig mit Buchstaben auf
>Papier) bevorzugen.

Ok Danke sieht ganz gut aus.
Desto mehr Informationsquellen desto besser.

>ISBN 3-8272-5669-0 C/C++ Kompendium.
>Von Dirk Louis, erschienen beim Mart & Technik Verlag, sehr zu
>empfehlen. Alles schön anhand Beispielen erklärt, nicht so trocken wie
>eine C/C++ - Referenz.

Danke für den Vorschlag.
Werde aber erstmal versuchen mir anhand des Internets Informationen 
anzueignen.
Wobei ein Buch meistens geordneter ist und halt seine Vorteile hat.
15Euro ist eigendlich nicht die Menge währe also eine Investition wert.


>Schritt 1: c lernen

Das erinnert mich an ein Echo.
Ich frage in einem Forum nach etwas Hilfe zu C-Programmierung.
Die Antwort ist dann, dass ich C lernen soll.

von mano (Gast)


Lesenswert?

A. R. schrieb:
>>Schritt 1: c lernen
>
> Das erinnert mich an ein Echo.
> Ich frage in einem Forum nach etwas Hilfe zu C-Programmierung.
> Die Antwort ist dann, dass ich C lernen soll

Japp, aber Du fragst nach Grundlagen und diese soll jedes C-Buch dir 
beibringen können.

Ich kann auch Karl heinz's Buch als Einstieg empfehlen (C von A bis Z).

von Karl H. (kbuchegg)


Lesenswert?

A. R. schrieb:

> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
> Ein paar Kleinigkeiten waren jedoch nicht 100%ig ersichtlich.
> Deswegen fragte ich hier nach.

Die 'Kleinigkeiten' um die es aber in der Antwort ging, hängen mit dem 
Präprozessor und seiner Arbeitsweise zusammen. Und das sind keine 
µC-spezifischen Dinge mehr, sondern massive C-Grundlagen.

> Wobei ein Buch meistens geordneter ist und halt seine Vorteile hat.
> 15Euro ist eigendlich nicht die Menge währe also eine Investition wert.

Auf jeden Fall.
Die meisten Online-C-Tutorien kannst du getrost vergessen. Die meisten 
laufen nach dem Schema ab: Ich fang mal enthusiastisch an! Nach 15 Tagen 
dann: Mist, das ist doch mehr Arbeit als ich gedacht habe. Nach 3 
Wochen: Ich mag nicht mehr; vieles ist zwar unvollständig beschrieben 
und die Hälfte dessen was es zu sagen gäbe ist überhaupt noch nicht 
angefangen, aber ich will jetzt nicht mehr.

Ein vernünftiges C Buch hat nicht umsonst über 150 Seiten. Ich hab aber 
noch selten ein C-Tutorium gesehen, welches es auf mehr als 30 Seiten 
gebracht hat.

> Ich frage in einem Forum nach etwas Hilfe zu C-Programmierung.
> Die Antwort ist dann, dass ich C lernen soll.

Das mag daran liegen, das es mit 'etwas Hilfe' nicht getan ist. Wenn du 
in einem Matheforum nach 'etwas Hilfe zur Integralrechnung' fragst und 
aus der Fragestellung geht hervor, dass du vom Konzept der Klammerung 
von Teilausdrücken noch nie etwas gehört hast, dann wird dich jeder 
verantwortungsvolle Teilnehmer in diesem Matheforum erst mal in einen 
Grundkurs Mathe schicken. Weil es nun mal keinen Sinn macht über zb. 
Partialbruchzerlegung zu debattieren, wenn du keine Formeln umformen 
kannst.

von Michael K. (aemkai)


Lesenswert?

Ich persönlich hab bezüglich µC mit dem AVR-GCC-Tut angefangen und 
Schrittweise durchgearbeitet, was ich dort nicht verstanden habe ich 
gleich gegoogelt oder im "Kernighan / Ritchie" nachgeschlagen (auch wenn 
der meiner Meinung nach manchmal etwas durcheinander ist - aber wenn 
man's gefunden hat ist es verständlich). Zusammen mit dem Datenblatt vom 
Atmega8 war ich dann in 2 Wochen recht fit.
Vorkenntnisse in C++ am Computer hab ich mit dem Skript "Einführung in 
die Programmierung mit C++" von Thomas Letschert (gibts online) erlangt, 
sind zwei Teile und doch recht umfangreich.


Ob's dir beste Methode ist, ist aber evtl. zu bezweifeln:

>> zusätzlich das 4. Bit gesetzt wird
>
> Nein. Es ist entweder das zweite oder dritte Bit. Je nachdem ob du von 0
> oder 1 anfängst zu zählen.

Sorry, stimmt natürlich - absoluter Aussetzer meinerseits - hab halt das 
0-Bit mitgezählt (0 - 1 - 2 - 4) :-) (liegt an der Prüfungszeit, bin 
halt grad nicht ganz klar im Kopf)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Habe nun folgendes Skript geschrieben.
Du solltest die selbe Terminologie wie der Rest der Welt verwenden. Ein 
Textfile mit Zeilen nach dem C-Syntax ist kein Skript (und auch kein 
Script) sondern es handelt sich um ein Programm oder einen Quelltext 
aka. Sourcecode.

von A. R. (redegle)


Lesenswert?

Könnt ihr für den Anfang die Software "Microsoft Visual Studio 2010 
Ultimate" empfehlen?

von Karl H. (kbuchegg)


Lesenswert?

A. R. schrieb:
> Könnt ihr für den Anfang die Software "Microsoft Visual Studio 2010
> Ultimate" empfehlen?

Ich kann mir nicht vorstellen, dass du die Version kaufen willst. Oder 
hat du mal auf die SChnelle rund 13000€ zur Verfügung? :-)

Von Microsoft gibt es auch kostenlose Entwicklungswerkzeuge. Das wären 
die Express Versionen. Mit den paar Einschränkungen, die diese Version 
gegenüber der Profi-Version hat, kannst du lange Zeit gut leben. Das was 
die Profi Versionen ausmachen und was die mehr können, wirst du die 
nächsten Jahre allesamt nicht brauchen.

von D. I. (Gast)


Lesenswert?

A. R. schrieb:
> Könnt ihr für den Anfang die Software "Microsoft Visual Studio 2010
> Ultimate" empfehlen?

Na das ist wie als Führerscheinneuling erstmal in einen Ferrari 
einzusteigen und direkt gegen die Wand zu fahren.
Ich würde zum Einstieg einen Texteditor mit Syntax-Highlighting + gcc 
empfehlen

von A. R. (redegle)


Lesenswert?

Die Software gibts scheinbar auch billiger.

http://www.chip.de/preisvergleich/141983/Microsoft-Visual-Studio-2010-Ultimate.html

Geht aber nicht um die Preisfrage sondern um die Frage ob es sich mit 
der Software gut arbeiten lässt.

Ein Ferrari hat aber auch viele Vorteile für einen Fahranfänger.
Man denke an das Einparken am Berg.

von Karl H. (kbuchegg)


Lesenswert?

A. R. schrieb:
> Die Software gibts scheinbar auch billiger.
>
> 
http://www.chip.de/preisvergleich/141983/Microsoft-Visual-Studio-2010-Ultimate.html

Von mir aus - kauf sie dir, wenn du meinst.
Diese Version kann Dinge, von denen du in 10 Jahren noch nicht weißt, 
wofür man die überhaupt braucht, bzw. bei welchem Problemkreis man sie 
einsetzt. Und nein, diese Dinge haben nichts mit C++ zu tun sondern mehr 
mit dem Problemkreis: Wie kriegt man einen Haufen Softwerker unter einen 
Hut, so dass alle am gleichen Strang ziehen und keiner in seiner Arbeit 
behindert wird und man trotzdem Projekte unter Kontrolle halten kann. 
Nur damit wir uns richtig verstehen: ab 50 Entwickler aufwärts.


> Geht aber nicht um die Preisfrage sondern um die Frage ob es sich mit
> der Software gut arbeiten lässt.

Visual Studio ist keine schlechte IDE.
Einzig und alleine von diesem 'Managed C++' würd ich die Finger lassen. 
Lerne erst mal richtiges C++ und wenn du dann mit .Net weitermachen 
willst, wechsel zu C# (oder was dann zu diesem Zeitpunkt Hipp ist)

von eklige Tunke (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Einzig und alleine von diesem 'Managed C++'
Es sind ja einige hier gegen "Managed C++", bei eurer Kritik (ich kenne 
es gar nicht) schließt ihr da C++/CLI mit ein? Das ist ja der Nachfolger 
von C++/CLI.
Ich vermute ja, denn C# ist ja eine eigenständige Programmiersprache und 
das hast du ihm ja nahegelegt.

von Karl H. (kbuchegg)


Lesenswert?

eklige Tunke schrieb:
> Karl heinz Buchegger schrieb:
>> Einzig und alleine von diesem 'Managed C++'
> Es sind ja einige hier gegen "Managed C++", bei eurer Kritik (ich kenne
> es gar nicht) schließt ihr da C++/CLI mit ein? Das ist ja der Nachfolger
> von C++/CLI.

Es ist eine Perversion, die gegen alle Grundsätze dessen, wofür C++ 
eigentlich steht, verstößt.

Managed C++ hat mit C++ ungefähr soviel gemein, wie C# mit C gemein hat: 
so gut wie gar nichts.

Die managed Extensions existieren in diesem C++ Konglomerat nur aus 
einem einzigen Grund: Um den Spaghat zu CLI zu schaffen. Nur: Wenn du 
eine Sprache brauchst, mit der man auf dem CLI aufsetzen kann (vulgo: 
.Net), dann ist C# (oder Visual Basic) die deutlich bessere Wahl. Die 
Sprache wurde von vorneherein so designed, dass sie nahtlos ans CLI 
drannpasst. Bei C++ musste man Krücken einbauen, damit das möglich wird. 
Krücken, die nichts mehr mit C++ zu tun haben.

von A. R. (redegle)


Lesenswert?

>Von mir aus - kauf sie dir, wenn du meinst.

Ich bin im Moment in der Lage die Version kostenlos zu bekommen. Also 
legal.
Es schadet also nicht etwas "herrum zu spielen".

Jedoch ist es scheibar fürs Programmieren von Programmen für Windows 
etc. ausgelegt. Es hat also nicht viel mit der Anwendung mit 
Mikrocontrollern zu tun. Desweiteren sind auch ein paar Befehle 
andersder. Denn es erfolgt u.a. keine "direkte" Textausgabe.

Vielleicht könnte ich versuchen einen Taschenrechner oder soetwas zu 
programmieren. Also das Anwenden verschiedener Formate wie integer, 
Fließkomme etc. üben.

Soetwas sollte doch mit diesem Programm möglich sein oder?

von Karl H. (kbuchegg)


Lesenswert?

A. R. schrieb:

> Soetwas sollte doch mit diesem Programm möglich sein oder?

Natürlich.
Mit Visual Studio werden Projekte realisiert, die viele Millionen Code 
umfassen und an denen >50 Entwickler beteiligt sind.

von eklige Tunke (Gast)


Lesenswert?

Danke für die Antwort...

Karl heinz Buchegger schrieb:
> eklige Tunke schrieb:
>> Karl heinz Buchegger schrieb:
>>> Einzig und alleine von diesem 'Managed C++'
>> Es sind ja einige hier gegen "Managed C++", bei eurer Kritik (ich kenne
>> es gar nicht) schließt ihr da C++/CLI mit ein? Das ist ja der Nachfolger
>> von C++/CLI.
> Managed C++ hat mit C++ ungefähr soviel gemein, wie C# mit C gemein hat:
> so gut wie gar nichts.
Ok, ein Ja hätte genügt. Aber diese Art von Ja ist eindrucksvoll. ;-)

Im übrigen war "Das ist ja der Nachfolger von C++/CLI" natürlich 
Quatsch. "Das (C++/CLI) ist ja der Nachfolger von 'managed C++'" wäre 
richtig.

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.