Hallo Minimax,

im Prinzip ist es ganz einfach
Du configuriest einen externen interrupt auf steigende flanke (rising) und in der isr startest du dann einen timer (z.b. timer0). Außerdem configurierst du den interrupt um, auf fallende flanke (falling). Wenn der interrupt nun das nächste mal ausgelöst wird, stopst du den timer, configurierst wieder auf falling.
In der timer isr (welche auf z.b. 10µs eingestellt wird) erhöhst du jedesmal einen wert, welchen du dann beim fallenden signalpegel in eine andere variable einliest. diese variable ist dann dein PWM-Wert. Diese solltest du jedoch noch durch 100 teilen, um auf einen wertebereich zwischen 0 und 255 zu kommen.
Hier mal schnell ein beispiel, habs gerade schnell geschrieben, müsste aber funktionieren
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80


Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcdbus = 4
Initlcd
Cls

Config Pind.2 = Input
Portd.2 = 1

Config Int0 = Rising
On Int0 Servo_input
Enable Int0

Config Timer2 = Timer , Prescale = 1
Timer2 = 96
On Timer2 Servo_zaehler
Stop Timer2
Enable Timer2

Dim Servo_pin As Bit
Dim Servo_wert As Word
Dim Servo_wert_read As Word

Servo_pin = 0


Enable Interrupts


Do

If Servo_wert_read <> 0 Then
Servo_wert_read = Servo_wert_read / 100
Locate 1 , 1
Lcd "Servo_wert: " ; Servo_wert_read ; "  "
Servo_wert_read = 0
End If

Loop

End


Servo_zaehler:
Timer2 = 96
Incr Servo_wert
Return

Servo_input:
If Servo_pin = 0 Then
Servo_pin = 1
Timer2 = 96
Start Timer2
Config Int0 = Falling
Elseif Servo_pin = 1 Then
Servo_pin = 0
Stop Timer2
Config Int0 = Rising
Timer2 = 96
Servo_wert_read = Servo_wert
End If
Return
Gruß
Chris