s_bit wird bis 3 hochgezählt, d.h. die ersten 3 Bits waren 1, dann wird die
TimerISR ausgelöst.
Der erste Wert muss meiner Meinung anch 1.778ms/4 sein und nicht /2, wie ich vorhin schrieb. Somit ergibt sich ein erstes TCNT0 von 228.
Das (-1) soll bewirken, dass die Werte mit steigendem i vom MSB zum LSB in rc5.code geschrieben werden, stimmt aber nicht, dass muss ich mir noch anders überlegen...
Außerdem reagiere ich jetzt auf fallende Flanken am Anfang, ich hatte da die Invertierung des TSOP wohl doch nicht so ganz berücksichtigt.
Es scheint IMMER eine 1 anzuliegen, wenn rc5.code abgefragt wird, da ich jedesmal CODE-EINS per USART auf den Rechner kriege.

Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>



struct rc5_parts
 {
    volatile char s_bit;
	volatile int8_t addresse;
	volatile int8_t code;
	volatile char rdy;
 } volatile rc5;

char mid;
volatile uint8_t bitnummer = 0;

void init_rc5()
{
 MCUCR |= (1<<ISC11);
 GICR |= (1<<INT1);
 TCCR0 |= (1<<CS02);
}

//****************************************************USART******************************

void init_usart(void) 
{ 
 UBRRL |= 0b01100111; 
 UCSRB = (1<<TXEN) | (1<<RXEN); 
 UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); 
} 

void send_char(unsigned char s) 
{ 
 while (!(UCSRA & (1<<UDRE))); 
 UDR = s; 
} 

void send_string(char *s) 
{ 
 while(*s != '\0') 
  { 
   send_char(*s); 
   s++; 
  } 
} 

//**********************************************************USART-ENDE********************

SIGNAL(SIG_OVERFLOW0)
{
 bitnummer++;
 TCNT0 = 145;      //Timer soll nach 1.778ms Overflow haben
	
 if(bitnummer == 12)      
  {
   TIMSK &= ~(1<<TOIE0);    //Wenn die 11 Bits davor erfasst wurden, TimerIRQ deaktivieren
   rc5.rdy = 1;
   rc5.s_bit = 0;
   bitnummer = 13;
  }
 
 if(bitnummer<6)             //Wenn i<6, werden die ausgelesenen Bits zu Addresse hinzugefügr
	{
	  if((PORTD & (1<<3)) != 0)
	   {
	    rc5.addresse |= (1<<(-1)*(bitnummer-6));
	   }
	  else
	   {
	    rc5.addresse &= ~(1<<(-1)*(bitnummer-6));
	   }
    }
	
 if((bitnummer>=6 && bitnummer<=11))    //6 - 11 werden zu rc5.code hinzugefügt
	{
	  
	  if((PORTD & (1<<3)) != 1)
	   {
	    rc5.code |= (1<<5);
		char hello[15] = "CODE-EINS";
 send_string(hello);
	   }
	  else
	   {
	    rc5.code &= ~(1<<3);
		char hello[15] = "CODE-NULL";
 send_string(hello);
	   }
	}
}

SIGNAL(SIG_INTERRUPT1)
{

 
 if(rc5.s_bit<3)
  {
   rc5.s_bit++;
  }
 if(rc5.s_bit == 3)
  {    
   TIMSK |= (1<<TOIE0);  // Timer0 Interrupts enablen
   TCNT0 = 228;         //Timer so vorladen, dass er zur Mitte des 2. Halbbits den ersten Timeroverflow hat      
 
   GICR &= ~(1<<INT1);  //Int1 disablen
  }
}
   
int main(void)
{
 init_usart();
 init_rc5();
 char i = 1;
 sei();
 char result[10];
 char hello[15] = "Hallo Martin";
 send_string(hello);
 for(;;)
  {
   if(rc5.rdy == 1)
    {
     itoa(rc5.code,result,10);
	 char hello2[15] = "RC5-Code: ";
     send_string(hello2);
     send_string(result);
	 rc5.rdy = 0;
	 GICR |= (1<<INT1);          //    ext. Interrupt wieder aktivieren
	 bitnummer = 0;              // bitnummer zurücksetzten
	}
  }
}