Dem problem ist nicht beizukommen. Der ISR schlckt einfach 50 takte und wenn alle 18 verschiedenen signale inerhalb eines bereiches mit einem maximalen abstand von 50 takten liegen, dann pflanzt sich da eine unschärfe fort, die beim letzten servo gute 5 grad beträgt, also unannehmbar.
mal sehen, vlt kann ich dem 16Bit timer ja beibringen zwei signale gleichzeitig zu generieren, eines mit dem compare match interrupt und das zweite mit dem überlauf, dann muss man die nur so sortieren, dass immer ein kleiner wert und ein größerer wert gleichzeitig generiert wird.
mfg WarChild
Code:SIGNAL (SIG_OVERFLOW2) // 1ms Interrrupt { TCNT2 = 256 - 250; //Timer2 mit 6 neu vorladen timer2++; timer3++; if(timer2 == 20) //alle Impulse starten { timer2 = 0; //timer2 endet bei 20ms und startet ALLE 18 Signale signal= 0; servo1on; servo2on; servo3on; servo4on; servo5on; servo6on; servo7on; servo8on; servo9on; servo10on; servo11on; servo12on; servo13on; servo14on; servo15on; servo16on; servo17on; servo18on; cli(); TCNT1 = 65536-dtime[signal]; //Timer1 neu vorladen sei(); TIFR |= (1 << TOV1); //alten Overflow löschen TIMSK |= (1 << TOIE1); //Timer1 Overflow Interrupt freigegeben } } //**************************************************// //Wird von Timer1 freigegeben und beendet die durch Timer2 gestarteten Pulse SIGNAL (SIG_OVERFLOW1) // { stoppulse(sortindex[signal]); //letzten Impuls beenden delay=ISRdelay; missing=0; signal++; //nächstes Signal while(dtime[signal]<delay && signal<18) //für kleine Zeitintervalle direkt den nächsten beenden { stoppulse(sortindex[signal]); delay+=88; //neue korrekturzeit bestimmen missing+=dtime[signal]; //ubersprungene Zeit merken signal++; } if(signal<18) //solange noch Impulse zu beenden sind { cli(); TCNT1 = 65536-dtime[signal]-missing+delay; //Timer1 neu vorladen sei(); } else //sonst Timer1 beenden TIMSK &= ~(1 << TOIE1); } //**************************************************//
Lesezeichen