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
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.
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.
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
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 | ....
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.