Bueno, como Diego habia implementado el control de 8 servos, tome ese proyecto como base para hacer este para 16 servos, basicamente la teoria de funcionamiento es la misma, solo que por ventana de tiempo se controlan 2 servos a la vez, para resolver el problema que mencionaba Diego que si 2 servos debian bajar al mismo tiempo el pin que los controlan, lo que hice fue tener un registro con la imagen del puerto, la cual se actualiza al terminar la rutina de interrupcion, con lo cual los pines de los servos bajan efectivamente al mismo tiempo.
El programa utiliza 3 interrupciones, la de recepcion serie, la del timer 1 y la de comparacion.
Interrupcion recepcion serie: basicamente por lo que estuve probando no necesitas el pin DTR en la comunicacion serie, esto es, puedes enviar los datos en cualquier momento, tambien observe que se tienen mejores resultados a bajas velocidades de transmision, ya que no se llena el buffer de recepcion si no puedes ir a leer el byte recibido.
Interrupcion por timer 1: Esta interrupcion inicia cada pulso a los servos, y carga el tiempo que debe durar en alto el pin de cada servo, no necesitas los datos ordenados de mayor a menor o viceversa.
Interrupcion por comparacion: Esta es la interrupcion que resetea los pines de los servos y carga el tiempo hasta la proxima interrupcion por timer1 (2.5ms), y asi se vuelve a iniciar el ciclo.
En el programa que les dejo la frecuencia no es de 50 hz, si no menor, ya que con los servos que estuve probando obtengo mas fuerza y mejor presicion entre pasos, pero se puede modificar tranquilamente para tener 50hz.
Uso un pic 18f2550 con cristal de 20mhz y corre internamente a 48mhz, ya que la proxima es tratar de hacerlo por usb al control.
El algoritmo funciona sin saltos ni sobresaltos, solo que por ahora esta hecho para enviar de 0 a 100 la posicion del servo, luego tengo pensado modificar eso para que se puedan tener mas puntos intermedios.
Los datos desde el puerto serie es muy simple de enviar, simplemente envian 8 bytes con las posiciones de los servos, ojo solo de 0 a 100.
Este solo es el comienzo de un proyecto, asi que las criticas, modificaciones, etc que puedan hacer, aportar, con el fin de que mejoremos esto seran bienvenidas, los algoritmos que trate de encontrar para mas de 8 servos, todos son secretos, y pretendo que este NO SEA ASI, asi que sientanse libres de utilizarlo y mejorarlo (compartan las mejoras).
Saludos.
Alejandro.
Disculpen si la explicacion no es tan buena, ando con poco tiempo.