>1. Was heißt z.B. was Jörg X. geschrieben hat:
> SLAVE_ADRESSE << 1 bedeutet das, dass ab Bit 1 die Slave Adresse
>hinzugefügt wird??
Es Bedeutet, dass der Wert SLAVE_ADRESSE um 1 Bit nach links geschoben
wird.
Oder mathematisch: Eine Multiplikation mit 2 stattfindet. Bei der I2C
Adresse ist ja das unterste Bit das R/W Flag.
>Was ist der Unterschied zwischen:
> TWCR |= 1<<TWINT; und TWCR = 1<<TWINT; ??
>Ich meine er setzt doch bei beiden nur das TWINT-Bit? Oder werden beim
>rechten, wenn es nicht noch verodert wird, die anderen Bits auch
>geändert bzw, gelöscht??
Richtig. Beim rechten werden die restlichen Bits gelöscht.
Die 1 wird ja als "0000 0001" interpretiert. Und TWINT hat z.B. (ich
such jetzt nicht im datenblatt) den Wert 2. Also wird "0000 0001" um 2
Bits nach links geschoben => "0000 0100" und dann ins TWCR Register
geschrieben. Wie man sieht, sind die anderen Bits alle 0. Deshalb werden
für Bitmaipulationen
auch sog. Read-Modify-Write Routinen benötigt. (siehe AVR-C Tutorial).
>3. Warum müssen, wenn man mehrere Bits löschen bzw. setzen will die
>einzelnen Elemente verodert werden??:
> z.B. TWCR = (0<<TWSTA)
> |(0<<TWSTO)
> |(1<<TWEA) // auf adresse reagieren
> |(1<<TWEN) // TWI aktiv
> |(1<<TWIE); // Interrupt an
Das mit dem (0<<TWSTA) ist für einen Neuling vielleicht nicht ganz
nachvollziehbar. Es dient hier nur der Information des Programmieres.
Explizit löschen tut das das Bit an der Stelle nicht. Der
Programmierstil dient vor allem dazu, dass man weiss, welche Bits man
nicht setzen will (man könnte ja was vergessen haben) und für "faule"
Programmierer, dass man nur die 0 zuur 1 oder umgekehrt ändern muss,
wenn man mehrere Tests mit verschiedenen Bitkombinationen macht.