Jetzt stehe ich schon wieder auf dem Schlauch.... Entweder, der timer0 eines tiny45 hat einen versteckten prescaler von dem ich nichts weiss, oder ich überfordere den controller total mit meinem timer0 interrupt...
Was ich versuche: Timer0 soll alle 4µs überlaufen. D.h. nach 250 overflows sind 1ms verstrichen, nach 500 overflows sind 2ms verstrichen. Das ist dann die Zeit in der mein Pin auf high geschaltet wird. Danach warte ich nochmal 5000 overflows ab (=20ms), das ist die typische Pause im Servo PWM Signal.
Ich dachte, ich probiere es mal auf diese einfache Art und Weise, aber anscheinend haut da was überhaupt nicht hin. Alle Zeiten scheinen 10mal so lange zu dauern wie geplant. Fuse divideby8 ist aus, interner Oszillator ist auf 8MHz eingestellt und auch so im Code angegeben. Was läuft hier falsch...? Ist 4µs viiiiiiiel zu kurz für den µC?
Code:
'Settings
$regfile = "attiny45.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 8000000

Dim Count As Word
Dim Setcount As Word
Dim Servopos As Word
Dim Longpause As Bit
Const Timervorgabe = 224

Config Portb.1 = Output
Portb.1 = 1
Config Timer0 = Timer , Prescale = 1
On Timer0 Timer0isr
Timer0 = Timervorgabe
Enable Interrupts
Enable Timer0

Do
Servopos = 126                                              'ca. Mittelstellung (werte können zw 0 und 250 sein)
Setcount = Servopos + 250                                   '==> setcount ist zwischen 250 und 500
Waitms 2000                                                 'einfach mal nichts tun
Loop
End


Timer0isr:
Timer0 = Timervorgabe                                       'Vorgabe=224 ==> frequenz von 250000Hz oder 1/f = 4µs
Incr Count                                                  'zähle wie oft 4µs verstrichen sind
If Longpause = 0 Then                                       'longpause ist die pause von ca. 20ms beim servosignal
  If Count >= Setcount Then                                 '==> 1 bis 2 ms verstrichen
    Count = 0                                               'wieder bei null anfangen
    Portb.1 = 0                                             'pin auf low setzen
    Longpause = 1                                           '20 ms warten
  End If
Else                                                        'longpause=1
  If Count >= 5000 Then                                     '==> 20 ms warten
    Count = 0                                               'nach 20 ms wieder bei null anfangen
    Longpause = 0                                           'das flag zurücksetzen
    Portb.1 = 1                                             'pin auf high setzen
  End If
End If
Return