hallo muraad, hallo dino dieter, könnt ihr eure erfahrungen einmal zusammenlegen. es funktioniert bis jetzt noch nicht, auch wenn die timerabstimmung stimmt. ich finde den fehler nicht. dino dieter, du hast doch einmal einen pic als sender genommen und das in c geschrieben.
dieses hier hat dino dieter vorgeschlagen, aus einem pic-rc5-sender:
Code:
//Eine 0 senden
void SendBit0()
{
 unsigned char i;

 //890us Impuls mit 36kHz senden
 //Bei 28us Periodendauer ergibt das 32 Impulse
 //Die Befehle unten ergeben nur 20us*32 = 640us
 //Der Rest wird mit dem Schleifenoverhead verbraten
 //Deshalb sieht die Nullphase auch kürzer aus als sie
 //tatsächlich ist !
 //Beim 12C508 ist der Overhead kleiner !!
 //Liegt am Compiler
 //Deshalb sind hier mehr NOPs als im Programm für 16F84
 for(i=0; i<32; i++)
  {
   LED_ON();
   NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
   NOP; NOP;
   LED_OFF();
   NOP; NOP; NOP; NOP; NOP; NOP;
  }

//890us Pause
 for(i=0; i<32; i++)
  {
   NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
   NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
  }

}

//Eine 1 senden
void SendBit1()
{
 unsigned char i;

//890us Pause
 for(i=0; i<32; i++)
  {
   NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
   NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
  }

 //890us Impuls mit 36kHz senden
 for(i=0; i<32; i++)
  {
   LED_ON();
   NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
   NOP; NOP;
   LED_OFF();
   NOP; NOP; NOP; NOP; NOP; NOP;
  }
}

void PhaseMod()
{
 unsigned char mask;     
 unsigned char i;
 
 SendBit1(); //Erstes Startbit=1
 SendBit1(); //Zweites Startbit=1

//Togglebit
   if(toggle==0)
    {
     SendBit0();
    }
   else
    {
     SendBit1();
    }  
//Ende Togglebit

//5 Bit Gerätecode
   mask=0x10; //Beginn bei MSB
   
   for(i=0; i<5; i++)
    {
     if(SUBCODE&mask) //Send 1
      {
       SendBit1();
      }
     else //Send 0
      {
       SendBit0();
      }
      
     mask>>=1;   //Nächstes Bit
    }
//Ende Gerätecode

//6 Bit Kommandocode
   mask=0x20; //Beginn bei MSB
   
   for(i=0; i<6; i++)
    {
     if(comcode&mask) //Send 1
      {
       SendBit1();
      }
     else //Send 0
      {
       SendBit0();
      }
     mask>>=1;  //Nächstes Bit
    }
//Ende Kommandocode

//Übertragung komplett
   LED_OFF(); //IR-LED abschalten
}
könnte man beim AVR nicht auch ein 36khz-signal erzeugen an einem beliebigen port. der dann erst erzeugt wird, wenn die 14bit gesendet werden (36khz brauchen ja erst beim senden einer "1" oder "0" erzeugt werden, oder sehe ich das verkehrt). diese massnahme hält den roboter nicht zeitlich gross auf und ist im steuerungsprogramm nicht spürbar.

mfg pebisoft