Also so wie dein Code ist kann er nicht richtig funktionieren.
Hab ihn mal bisschen umgeändert, aber so wie du wolltest.
Hier:
Code:
#include <stdio.h> 
#include <inttypes.h> 
#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; 

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 ir_init_send(void) { 
   //36kHz Träger 
   TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11); 
   TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10); 
   OCR1A = 111; 
   ICR1 = 222; 
   //Timer-Interrupt alle 2,048ms zur Signalerzeugung --> 1/(8MHz/256/64) 
   TCCR0 = (1<<CS01) | (1<<CS00);    //Prescaler von 64 
   TIMSK |= (1<<TOIE0);               //Timer0 Overflow Interrupt aktivieren 
} 
  
void rc5_send(uint16_t code)   // Nur die ersten 14Bits zählen die obersten 2 werden ignoriert
{
   uint8_t i;
   for(i=0;i<=14;i++)
   {
     DDRD&= ~(1<<PD5);     // PWM 36kHz Signal auf low
	  us_889();             // halbe Bitzeit warten
	  if (code & (1<<i))       // aktuelles Bit in code prüfen ob high   
	     DDRD|= (1<<PD5);     //wenn ja, PWM 36kHz Signal auf high
	  us_889();             // zweite halbe Bitzeit
   }
   ms_89();                  // Pause

int main(void) 
{ 

   ir_init_send(); 
   rc5_send(0b0000110001001111);     // Nur untersten 14Bits sind wichtig   
}
Jetzt werden nur deine for() Schleifen benutzt. Ich weiß allerdings nicht genau ob man einer Funktion den Wert einer Variable als Binärzahl übergeben darf, ich denke aber schon.
Gruß Muraad