Das funktioniert so nicht:
//Lampe i ist aus -> anmachen
PORTB |= (0<<i);
Du steuerst Deine LED low-aktiv an, korrekt?
Dann musst Du so schreiben:
PORTB &= ~(1<<i);
Überleg mal, was der Befehl genau macht: (Bsp.: i = 2):
1<<i bedeutet: eine 1 um i (Bsp.: 2) Stellen nach links schieben,
also: 0000 0100 binär
1<<i bedeutet: eine Null (!) um i STellen nach links schieben,
und das ergibt immer wieder Null, egal was i für ein Wert ist.
Ok, Du hast jetzt aus 1<<i eine "Maske gemacht. Diese Maske wird zum
VerODERn (->Pin auf high schalten) oder invertiert zum verUNDen (Pin
auf GND schalten) benutzt:
PORTB |= 00000100b bedeutet: Bit 2 des PB wird gesetzt.
Das VerUNDen ist nur geringfügig komplizierter:
PORTB &= ~00000100b bedeutet:
PORTB UND invertierte Maske
00000100b invertiert -> 11111011b, also:
PORTB &= 11111011b
D.h. alle Bits des Ports bleiben unverändert bis auf Bit 2, das
wird immer Null.
Viel Spass, Stefan