Hallo
Wenn man zur Ansteuerung der Servos die Variante aus dem RN-Wissen verwendet, ist die Auswertung eines RC-Empfängers unglaublich einfach:
(Codeschnippsel aus meinem Dominoday-Thread)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; } }
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:
Gruß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
mic







Zitieren

Lesezeichen