Wegen dem Auslesen von Servosignalen von einer Fernsteuerung kann ich möglicherweise helfen.
Der angehängte Code zeigt den Ausschlag auf 8 Leds am PortA an.
Als Eingang wurde PORTB 0 genommen.
Leider hatte ich die Fernsteuerung nur für 1 Nachmittag zur Verfügung, also ist diese noch weit von dem entfernt was man als perfekt und schön programmiert bezeichnen würde 
Es wird schon eine Selbstkalibrierung durchgeführt (herausfinden des maximums und minimums)
Der Code ist für Codevision geschrieben, dürfte aber ohne großes Ändern auch auf AVR-GCC funktionieren.
Es wurde ein ATMega163 mit 4Mhz verwendet.
Wenn ich wieder eine Fernsteuerung zur Verfügung habe werde ich diesen Code weiter programmieren - bei Bedarf stelle ich ihn dann hier rein.
Code:
#include <mega163.h>
unsigned int counter=0;
unsigned int dauer=0;
unsigned int min=65535;
unsigned int max=0;
unsigned float schritt=0;
unsigned int wert[8];
unsigned int i=0;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=250;
if(PINB.0 == 1)
{
counter++;
}
if((counter > 0) && (PINB.0 == 0))
{
dauer = counter;
counter = 0;
}
}
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
PORTB=0xFF;
DDRB=0x00;
TCCR0=0x01;
TCNT0=0x00;
TIMSK=0x01;
#asm("sei")
for(i=0;i<8;i++)
{
wert[i]=0;
}
while (1)
{
max = dauer;
}
if(dauer < min)
{
min = dauer;
}
schritt = ((float)max-(float)min)/8;
wert[0] = schritt;
wert[1] = wert[0] + schritt;
wert[2] = wert[1] + schritt;
wert[3] = wert[2] + schritt;
wert[4] = wert[3] + schritt;
wert[5] = wert[4] + schritt;
wert[6] = wert[5] + schritt;
wert[7] = wert[6] + schritt;
if(dauer > wert[0])
{
PORTA.7 = 1;
}
else
{
PORTA.7 = 0;
}
if(dauer > wert[1])
{
PORTA.6 = 1;
}
else
{
PORTA.6 = 0;
}
if(dauer > wert[2])
{
PORTA.5 = 1;
}
else
{
PORTA.5 = 0;
}
if(dauer > wert[3])
{
PORTA.4 = 1;
}
else
{
PORTA.4 = 0;
}
if(dauer > wert[4])
{
PORTA.3 = 1;
}
else
{
PORTA.3 = 0;
}
if(dauer > wert[5])
{
PORTA.2 = 1;
}
else
{
PORTA.2 = 0;
}
if(dauer > wert[6])
{
PORTA.1 = 1;
}
else
{
PORTA.1 = 0;
}
if(dauer > wert[7])
{
PORTA.0 = 1;
}
else
{
PORTA.0 = 0;
}
};
}
Lesezeichen