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







Zitieren

Lesezeichen