Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation & setzten von registern


von Marco (Gast)


Lesenswert?

Hallo liebes Forum,

bin neu hier und lese mir gerade das AVR-Tutorial durch, erstmal danke 
an die person/leute die sich die arbeit gemacht hat/haben es ist sehr 
umfang und aufschlussreich.

jetzt hab ich eine frage zu
PORTB |= ((1 << MEINBIT0) | (1 << MEINBIT2));

der befehl ist mir klar, was gemacht wird, im PORTB werden die bits 0 
und 2 auf 1 gesetzt alle anderen werden so gelassen wie sie sind/waren.

jetzt die frage(n):
kann nicht auch der befehl
PORTB |= 0b00000101 verwendet werden? sollte ja das selbe raus kommen, 
es ist wie ich finde etwas übersichtlicher(ansichtssache...) und 
"weniger" schreibarbeit.

hat der 1. befehl vorteile gegenüber dem 2. ? wenn ja welche
und warum ist es sinnvoll MEINBIT0 zu verwenden und nicht einfach 0?

danke schonmal für die antworten

von Felix P. (fixxl)


Lesenswert?

Marco schrieb:
> jetzt die frage(n):
> kann nicht auch der befehl
> PORTB |= 0b00000101 verwendet werden? sollte ja das selbe raus kommen,
> es ist wie ich finde etwas übersichtlicher(ansichtssache...) und
> "weniger" schreibarbeit.
Ja, die beiden Befehle sind gleichbedeutend, sofern MEINBIT2 als 2 
definiert ist und MEINBIT0 als 0.

> hat der 1. befehl vorteile gegenüber dem 2. ? wenn ja welche
> und warum ist es sinnvoll MEINBIT0 zu verwenden und nicht einfach 0?
Der Compiler wird aus beiden Befehlen dasselbe machen, es geht einzig 
und alleine um die Lesbarkeit des Codes. Wenn man einen Controller mit 
viel Peripherie ausgestattet hat (Funkmodul, Schieberegister, Display, 
Status-LEDs, Sensoren...) und das Programm umfangreicher wird, findet 
man sich deutlich besser zurecht, wenn man die einzelnen Bits sauber 
benannt hat. Das ist natürlich mehr Schreibarbeit, aber die Chancen, 
sich auch nach längerer Zeit noch im Code zurechtzufinden, sind 
wesentlich höher.

von Karl H. (kbuchegg)


Lesenswert?

Marco schrieb:

> hat der 1. befehl vorteile gegenüber dem 2. ? wenn ja welche
> und warum ist es sinnvoll MEINBIT0 zu verwenden und nicht einfach 0?

Wenn du die Makros nicht MEINBIT0 und MEINBIT1 nennst, sondern 
beispielsweise
1
#define WARN_LAMPE   0
2
#define SIRENE       2

was  ist dann leichter verständlich?
1
  PORTB |= 0b00000101

oder
1
  PORTB |= ( 1 << WARN_LAMPE ) | ( 1 << SIRENE );

Wenn du dann die Verschiebeaktion auch noch ins Makro verlagerst
1
#define WARN_LAMPE   ( 1 << PB0 )
2
#define SIRENE       ( 1 << PB2 )
3
4
...
5
6
  PORTB |= WARN_LAMPE | SIRENE;

dann hast du das Beste aus 2 Welten:
Auf der einen Seite kannst du an den Makros leicht und problemlos 
ablesen, welche Bits das sind. Und auf der anderen Seite siehst du im 
Code auf einen Blick, was an dieser Stelle die Absicht im Programm ist. 
Die eigentliche Absicht ist es ja nicht, da irgendwelche Pins auf 0 oder 
1 zu setzen. An den Pins hängt ja etwas. Zum Beispiel eine Warn Lampe. 
Zum Beispiel eine Sirene. Zum Beispiel das Relais, welches den Motor 
schaltet. Zum Beispiel ... Die eigentliche Absicht ist es ja, genau 
dieses etwas ein oder aus zu schalten. Und genau diese Absicht soll sich 
im Code wiederfinden. Die Bits auf 0 oder 1 zu setzen ist nur Mittel zum 
Zweck. Es ist dieser Zweck, der ersichtlich sein soll. Anwendungsbezogen 
programmieren! Direkt mit den Worten der ganz konkreten Anwendung. Denn 
das Beste daran ist dann auch: man braucht keinen Kommentar mehr, der 
einen darüber aufklärt, dass hier die Sirene eingeschaltet wird. Und das 
ist gut so. Denn auf der einen Seite tendieren Kommentare nach einiger 
Zeit sowieso dazu falsch zu sein und auf der anderen Seite sind wir 
Programmierer faule Hunde. Wir leben nach dem Motto: Ein Kommentar, der 
nicht geschrieben werden braucht, weil eh schon alles im Code steht, ist 
ein guter Kommentar :-)

Bei
1
  PORTB |= 0b00000101
siehst du erst mal nichts. Sondern du musst erst mal mit deinem 
Schaltplan ergründen, was denn da eigentlich an den beiden Portbits 
hängt. Das mag dir jetzt noch geläufig sein, aber in 2 Monaten, wenn du 
in der Zwischenzeit 5 andere Programme geschrieben hast, sieht die Sache 
gleich ganz anders aus.

Ganz abgesehen davon, dass du mit dieser Schreibweise dann auch nicht 
Gefahr läufst, dich bei den vielen 0-en und 1-en zu verzählen. Nicht 
lachen. Alles schon vorgekommen.

von Marco (Gast)


Lesenswert?

so schnell 2 hilfreiche antworten.
danke!!

eine frage noch.

Karl Heinz schrieb:
> #define WARN_LAMPE   ( 1 << PB0 )
> #define SIRENE       ( 1 << PB1 )

muss ich da dann noch
#define PB0 0
machen oder ist das schon definiert ?

mfg

von Karl H. (kbuchegg)


Lesenswert?

Marco schrieb:
> so schnell 2 hilfreiche antworten.
> danke!!
>
> eine frage noch.
>
> Karl Heinz schrieb:
>> #define WARN_LAMPE   ( 1 << PB0 )
>> #define SIRENE       ( 1 << PB1 )
>
> muss ich da dann noch
> #define PB0 0
> machen oder ist das schon definiert ?

PB0, PB1, ... gibt es bereits.
Die kriegst du duch den
#include <avr/io.h>

Aber Achtung: Auch wenn es erst mal so aussieht. PB0 hat im Grunde 
nichts mit dem Port B zu tun. Auch wenn es ein PA0 ein PC0 oder PD0 gibt 
(für das Bit 0 am Port A, C oder D). Diese Makros sind einfach nur
1
#define PB0   0
2
#define PB1   1
3
#define PB2   2
4
#define PB3   3
5
...
6
7
#define PA0   0
8
#define PA1   1
9
#define PA2   2
10
....

von Marco (Gast)


Lesenswert?

super, danke für die hilfe

mfg

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.