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
Lesezeichen