Hi! Danke für eure Tipps! ich glaube 4 µs ist aber tatsächlich etwas knapp... Habe versucht die Zeit mit meiner mechanischen Eieruhr zu stoppen, und das hat nicht geklappt
Jetzt bin ich wieder bei der Methode die ich ursprünglich machen wollte und die auch Besserwessi vorschlägt. Auf einem Mega32 mit 16MHz und dem 8bit timer hat es jetzt auch endlich geklappt. Das Oszi zeigt ein sehr sauberes Signal mit genau der Länge und der Pause die ich einstelle.
Code:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 16000000
$baud = 38400
Config Pinb.1 = Output 'servo output
Config Pina.0 = Output 'statusLED
Config Timer0 = Timer , Prescale = 8
On Timer0 T0isr
Dim I As Byte
Dim Pulse As Single
Dim Pulsetemp As Single
Dim Fullrun As Single
Dim Lastrun As Single
Dim Fullrunfix As Byte
Dim Lastrunfix As Byte
Dim Currun As Byte
Dim Pause As Byte
Enable Timer0
Enable Interrupts
Do
Pulse = 1.5 'in ms
'_______________
'1 increment des timer0 dauert 16M / 8 = 0.0005 ms (=2000 milliHz)
'1 ms pulse benötigt daher 1*2000 increments
'2 ms pulse benötigt 2*2000 increments
Fullrun = Pulse * 2000
Shift Fullrun , Right , 8
Lastrun = Frac(fullrun)
Shift Lastrun , Left , 8
Lastrun = 256 - Lastrun
Lastrunfix = Round(lastrun)
Fullrunfix = Int(fullrun)
'________________
Waitms 333 'nichts tun
Loop
End
T0isr:
If Pause = 0 Then
If Currun < Fullrunfix Then
If Portb.1 = 0 Then
Portb.1 = 1
End If
Incr Currun
End If
If Currun = Fullrunfix Then 'wird direkt nach dem voherigen aufgerufen...
Timer0 = Lastrunfix
Incr Currun
Elseif Currun > Fullrunfix Then
Currun = 0
Pause = 1
Portb.1 = 0
End If
Else 'pause=1
'20ms pause sind ca 150 volle überläufe
If Pause < 150 Then ' 75~10ms 37~5ms
Incr Pause 'pause +1.5ms = frequenz
Else
Pause = 0
End If
End If
Return
Um diesen Code auf meinen tiny zu übertragen muss ich eigentlich nur den Wert 2000 durch eine 1000 ersetzen. Das werde ich heute abend mal ausprobieren.
Lesezeichen