Lutz schrieb:
> if(bit) DDRD&=~(1<<PD6); // wenn bit != 0 dann PD6 auf low
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> Bei read_bit ebenso. Was bringt denn das? Fehlt da jeweils ein
> else-Zweig? Ansonsten macht das if (bit) ja gar keinen Sinn und man kann
> gleich _delay_us(120) schreiben.
Der Kommentar mag ein bischen verwirrend sein. Falsch ist er auf jeden
Fall. Du magst auch übersehen haben, dass hier das DDRD Register
geschaltet wird und nicht das PORTD.
> Ja, ja , zu schnell geschossen: DDRD& ist natürlich was anderes
> als PORT& ..., also den Post einfach irgnorieren!
Nicht wirklich.
Er enthält nämlich ein Element, dessen Verständnis wichtig ist: Die
Leitung wird über das DDR Register umgeschaltet. Dies deshalb weil es ja
einen externen Pullup Wderstand gibt, der die Leitung auf 1 zieht.
Durch
DDRD&=~(1<<PD6);
wird daher, anders als es der Kommentar suggeriert, die Leitung durch
den externen Pullup auf 1 gezogen, indem der Pin auf Eingang geschaltet
wird.