The accuracy you need to control a servo depends a lot on the servo in my experience. A $10 servo does not need that much accuracy, it will be overwhelmed by only 100 steps of input, each resolving to 1.8 degrees on the control yoke, and this is a happy case, because the potentiometer in the servo should be about 0.5% accurate to allow this to happen, and it isn't. If you can live with an accuracy of a few tens of usec out of the 1msec variable delay you will still have 50 or more steps and you will be able to write an ISR based on a timer (TMR0) that will implement a nice and constant and stable output PWM, and you can even write it in C if you use a faster crystal (10MHz or more). The code itself is very simple. In the ISR you would have something like: if(Pwmflag) { // while we do PWM if(!Pwmreg.Pwmbit) { // the O/P bit is 0, start Pwmcounter = Pwmset; // load the pwm counter from setpoint register Pwmreg.Pwmbit = 1; // turn on output } else { // the O/P is 1, we count period if(!--Pwmcounter) // decrement by 1 Pwmflag = Pwmreg.Pwmbit = 0; // turn off output and flag 'done' } } Now you arrange the ISR to be called at a constant say 20usec and in your main code you set Pwmflag and then wait for it to be reset. The ISR does everything else. A little more work is required to generate repeating pulses of PWM as required by the servo (hint: use another counter in the ISR that sets Pwmflag every X timer interrupts). There are other ways to generate PWM for servos, with resolution down to 1T cycle, but using assembly, and no interrupts. hope this helps, Peter -- http://www.piclist.com hint: The PICList is archived three different ways. See http://www.piclist.com/#archives for details.