Ich hab den Code jetzt nochmal grundlegend geändert.
Was mir nie aufgefallen ist. Bei rc5 dauert ein Bit zu senden 1778us, in der Mitte entscheidet sich ob 1 oder 0. Bei 1 muss in der Mitte der Zeit ein wechsel von high auf low sein, bei 0 ein wechsel von low auf high.
D.h. man muss auch mit einbeziehen was das letzte Bit war(0 oder 1) und damit der aktuelle Signalpegel.
Ich hab jetzt ne neue Funktion, mit deinen for() Schleifen, die das alles macht.
Code:
#include <avr/io.h> 
#include <avr/delay.h> 
#include <avr/interrupt.h> 
#include <avr/signal.h> 
#include <string.h> 
#include <stdint.h> 


uint16_t zaehler; 
uint32_t zaehler1; 
#define PWM_PORT        DDRD
#define PWM_BIT         PD5
void us_889(void) 
{ 
    
   for (zaehler=0; zaehler<1185; zaehler++) 
   asm volatile("nop"); 
    
}    
        
void ms_89(void) 
{ 
   for (zaehler1=0; zaehler1<117105; zaehler1++) 
   asm volatile("nop"); 
}    

void rc5_init(void) { 
   //36kHz Träger 
   TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11); 
   TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10); 
   OCR1A = 111; 
   ICR1 = 222; 
} 
  
void rc5_send(uint16_t code)   // Nur die ersten 14Bits zählen die obersten 2 werden ignoriert 
{ 
   uint8_t i,X;  
   
   // Prüfen ob das erste Bit low oder high ist um zu wissen wie man anfängt
   if(code&(1<<0));       // Ist erstes Bit high 
   {
       i=1;                  // letztes Bits war high
	   PWM_PORT|= (1<<PWM_BIT);     //wenn ja, PWM 36kHz Signal auf high 
	   us_889();             // halbe Bitzeit warten 
	   PWM_PORT&= ~(1<<PWM_BIT);     // PWM 36kHz Signal auf low  
	   us_889();             // zweite halbe Bitzeit 
   }
   else
   {
       i=0;
	   us_889();             // halbe Bitzeit warten
	   PWM_PORT|= (1<<PWM_BIT);
	   us_889();             // zweite halbe Bitzeit
   }
   
   // Sendet die letzten 13Bits und prüft wie das letzte Bit war
   for(X=1;X<=13;X++)       
   {
      if((i=1)&&(code&(1<<X))         // letztes Bit war high und nächstes ist high
	  {
	     PWM_PORT|= (1<<PWM_BIT);          // high
		 us_889();
		 PWM_PORT&= ~(1<<PWM_BIT);
		 us_889();
      }
	  else if((i=1)&&(!(code&(1<<X))))   // letztes high und nächstes low
	  {
	     i=0;
		 us_889();
		 PWM_PORT|= (1<<PWM_BIT);
		 us_889();
	  }
	  else if((i=0)&&(code&(1<<X)))        // letzes low, nächstes high
	  {
	     i=1;
		 us_889();
		 PWM_PORT&= ~(1<<PWM_BIT);
		 us_889();
	  }
	  else if((i=0)&&(code&(1<<X)))       // letzes low, nächstes low
      {
	     PWM_PORT&= ~(1<<PWM_BIT);
		 us_889();
		 PWM_PORT|= (1<<PWM_BIT);
		 us_889();
	  }
	  else
	     asm volatile ("nop");            // zu else sollte es nie kommen
   } 
   ms_89();                  // Pause falls gleich noch etwas gesendet wird
}
int main(void) 
{ 

   ir_init_send(); 
   rc5_send(0b0000110001001111);     // Sendet das was du in deinem Code senden wolltest   
}
Ach und was das beim Asuro mit dem USART Pins zu tun hat weis ich auch nicht. Auf jedenfall wird das nicht das rc5 Protokoll sein denk ich.

Viele grüße Muraad