DDRB = Eingänge und ausgänge durch Bitschieberei

OP #2387211
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
OP #2387238
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?
Gast #2387265
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
#2387285
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) );

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren