Hallo

Wenn man zur Ansteuerung der Servos die Variante aus dem RN-Wissen verwendet, ist die Auswertung eines RC-Empfängers unglaublich einfach:

Code:
ISR(TIMER0_COMP_vect) 
{ 
   //static uint16_t count=0; 
   static uint16_t rc_temp_pwr=0; 
   static uint16_t rc_temp_dir=0; 
   //if(count>x) PORTA &= ~16; else PORTA |= 16;   // E_INT1 (Pin8) 
   //if(count>y) PORTC &= ~1;  else PORTC |= 1;   // SCL (Pin10) 
   //if(count>z) PORTC &= ~2;  else PORTC |= 2;   // SDA (Pin12) 
   //if(count<1000)count++; else count=0; 
   if (PINC & 1) rc_temp_dir++; else 
      if (rc_temp_dir) { rc_input_dir=rc_temp_dir-1; rc_temp_dir=0; } 
   if (PINC & 2) rc_temp_pwr++; else 
      if (rc_temp_pwr) { rc_input_pwr=rc_temp_pwr-1; rc_temp_pwr=0; } 
}
(Codeschnippsel aus meinem Dominoday-Thread)

Das ist die Timer-ISR die normalerweise die Impulslängen der Servosignale generiert. Mit ihr kann man auch sehr bequem die Impulslängen des Empfängers messen. Die lokalen Variablen rc_temp_pwr und rc_temp_dir sind die Hilfsvariablen für die Impulsmessung, rc_input_pwr und rc_input_dir die globalen Variablen für die Werte der Kanäle die man dann im Programm auswerten kann.

Das funktioniert dann so:

Code:
if (PINC & 1) rc_temp_dir++;  // solange der Impuls anliegt wird der Zähler erhöht
 else if (rc_temp_dir) // Es liegt kein Impuls an und der Zähler ist !=0
rc_input_dir=rc_temp_dir-1; // dann ist der gezählte Wert die Impulsdauer
 rc_temp_dir=0; // Zähler wieder rücksetzen, Ergebniss steht jetzt in rc_input_dir
Gruß

mic