Forum: Compiler & IDEs DDRB = Eingänge und ausgänge durch Bitschieberei


von Rocco L. (kaufparkangucker)


Lesenswert?

Hallo,

kann man das so machen, also vorallem "0 << DDBx" um einen Pin als 
Eingang zu definieren:
1
//B0 un B1 als Ausgänge, B2 und B3 als Eingänge:
2
MOTOR_DDR = DDRB = (1 << DDB0) | (1 << DDB1) | (0 << DDB2) | (0 << DDB3);

und fürt es zu dem selben Ergebniss wie:
1
MOTOR_DDR = DDRB = 0b00000011

Gruß Rocco

von Mark .. (mork)


Lesenswert?

Ja das kannst Du so machen, solange das Gleichheitszeichen auch wirklich 
eins ist und nicht z.B. "|=". Solche Konstrukte werden oft verwendet, um 
schnelle Modifikationen zu ermöglichen.

MfG Mark

von Ballermann (Gast)


Lesenswert?

Rocco L. schrieb:
> kann man das so machen, also vorallem "0 << DDBx" um einen Pin als
> Eingang zu definieren:

Nein, geht nicht. Du kannst eine evtl. vorhandene 1 nicht mit einer 0 
"wegODERN".
Löschen immer über
1
DDRB&= ~(1 << DDB2);

Grüße

von Ballermann (Gast)


Lesenswert?

Ha...hatte übersehen, dass da kein Oder dazwischen ist:
1
DDRB = (
2
    ^

von Rocco L. (kaufparkangucker)


Lesenswert?

Also am besten so?:
1
MOTOR_DDR = DDRB;
2
MOTOR_DDR = (1 << DDB0) | (1 << DDB1); //Eingänge
3
MOTOR_DDR &= ~(1 << DDB2) | (1 << DDB3);

gibts da nichts einfacheres, kürzeres, was in eine Zeile passt?

Ich bin mir halt nicht sicher ob alle Pins die nicht 1 sind automatisch 
als Eingang erkannt werden, oder ob man das dem Atmega klar machen muss 
was Eingänge und was Ausgänge sind?

von Rocco L. (kaufparkangucker)


Lesenswert?

Habe es jetzt so gelöst, aber so richtig gefallen tut es mir nicht, da 
es zu lang ist:
1
    //B0 un B1 als Ausgänge, B2 und B3 als Eingänge:
2
    MOTOR_DDR = 0xFF   //erst mal alles Ausgänge 
3
    MOTOR_DDR &= ~((1 << DDB2) | (1 << DDB3));

von Stone (Gast)


Lesenswert?

Was ist den MOTOR_DDR? Variable?

Wenn du nur das DDRB Register initialisieren willst, reicht die Zeile
1
DDRB = (1 << DDB0) | (1 << DDB1);

Wenn du nicht Explizit eine "1" rein schiebst steht ne "0" drinnen.
Mit der oberen Zeile wird PB1 und PB0 zum Ausgang, alle anderen sind 
Eingänge.


Gruß Matthias

von Joachim (Gast)


Lesenswert?

Etwas unschön, aber auch möglich ware es den hex-Wert direkt in das 
Register zu schreibe.

Einfach
DDRB = 0x03;

Gruß

von Volkmar D. (volkmar)


Lesenswert?

Rocco L. schrieb:
> Habe es jetzt so gelöst, aber so richtig gefallen tut es mir nicht, da
> es zu lang ist:
>     //B0 un B1 als Ausgänge, B2 und B3 als Eingänge:
>     MOTOR_DDR = 0xFF   //erst mal alles Ausgänge
>     MOTOR_DDR &= ~((1 << DDB2) | (1 << DDB3));

Wenn MOTOR_DDR direkt dem entsprechenden Port entspricht, hast Du ein 
Problem. Du schaltest alle Pins auf Ausgang und treibst damit auf den 
Pins, die Du als Eingang haben willst, gegen die externe Beschaltung 
(wenn auch für kurze Zeit).

Wenn es Dir 'nur' darum geht, zu dokumentieren das Du spezielle Pins als 
Eingang beschaltest, dann würde ich Deine erste Variante vorziehen. Du 
darfst an dieser Stelle halt nur eine echte Zuweisung haben (so wie Du 
es auch geschrieben hast). Wenn Du nachträglich einzelne Bits setzen 
oder löschen willst, dann mußt Du die Zuweisung mit "|=" zum Setzen von 
Bits und mit "&=" zum Löschen von Bits verwenden.

In eine Zeile geht es natürlich auch, ist aber sehr unleserlich:
1
 MOTOR_DDR = (MOTOR_DDR | (1 << DDB0) | (1 << DDB1)) & ~( (1 << DDB2) | (1 << DDB3) );

von Rocco L. (kaufparkangucker)


Lesenswert?

Danke, habs kapiert und umgesetzt.

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.