Hallo m.a.r.v.i.n,

das funktioniert nicht:
Code:
                PORTB |= (1 << PB3);      /* setzt Port B.3 auf HIGH */ 
                PORTB &= (1 << PB3);     /* setzt Port B.3 auf LOW */
Das ist das Assemblerlisting dazu:
Code:
	PORTB |= (1 << PB3);      /* setzt Port B.3 auf HIGH */ 
  9a:	c3 9a       	sbi	0x18, 3	; 24

  	PORTB &= (1 << PB3);     /* setzt Port B.3 auf LOW */ 
  9c:	88 b3       	in	r24, 0x18	; 24
  9e:	88 70       	andi	r24, 0x08	; 8
  a0:	88 bb       	out	0x18, r24	; 24
So ist es richtig:
Code:
             PORTB |= (1 << PB3);      /* setzt Port B.3 auf HIGH */ 
             PORTB =  (PINB & (~(1 << PB3)));    /* setzt Port B.3 auf LOW */
Das Assemblerlisting dazu:
Code:
	PORTB |= (1 << PB3);      /* setzt Port B.3 auf HIGH */ 
  9a:	c3 9a       	sbi	0x18, 3	; 24

  	PORTB =  (PINB & (~(1 << PB3)));    /* setzt Port B.3 auf LOW */ 
  9c:	86 b3       	in	r24, 0x16	; 22
  9e:	87 7f       	andi	r24, 0xF7	; 247
  a0:	88 bb       	out	0x18, r24	; 24
Du musst das Pinregister lesen und den geänderten Wert zum Portregister schreiben!

Oder du benutzt zum Setzen und Rücksetzen der Bits gleich die alten GCC-Macros:

Code:
#define sbi(p,b) p|=(1<<(b))
#define cbi(p,b) p&=(~(1<<(b)))

      sbi( PORTB, PB3 );  // setze bit3 portb
      cbi( PORTB, PB3 );   // rücksetze bit3 portb
Ronny10