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
Gruß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
Chris






Zitieren


Lesezeichen