Hola Fulguitron, te paso parte del programa que estoy desarrollando para mi bipedo, en principio solo tengo escrito la parte del centrado veras que es facil de entender ya que se repite para cada servo.
;**************************************************************************************************
;**************************************************************************************************
;** ***
;** PROGRAMA: HUMANOIDE.ASM ***
;** AUTOR: MIQUEL SERVERA ***
;** FECHA: 25/05/09 ***
;** Programa para mover un bipedo el cual consta de 5 servos por pierna. ***
;** ***
;** ***
;** ***
;** Revision:0.0 (Solo movimiento de las piernas) Programa para PIC16F873 ***
;** Velocidad del reloj: 4MHz Tipo de reloj: XT ***
;** Proteccion de codigo: OFF ***
;** ***
;** SERVO_1 -------------> RA0 ***
;** SERVO_2 -------------> RA1 ***
;** SERVO_3 -------------> RA2 ***
;** SERVO_4 -------------> RA3 ***
;** SERVO_5 -------------> RA4 ***
;** SERVO_6 -------------> RB0 ***
;** SERVO_7 -------------> RB1 ***
;** SERVO_8 -------------> RB2 ***
;** SERVO_9 -------------> RB3 ***
;** SERVO_10 ------------> RB4 ***
;** PUL_CENTRA ----------> RC0 ***
;** PUL_ANDA ------------> RB5 ***
;** ***
;**************************************************************************************************
;**************************************************************************************************
LIST P=16F873 ; Pic que vamos a utilizar.
INCLUDE "P16F873.INC" ; Definicion de registros internos.
;******************************************* V A R I A B L E S ***********************************************
Delay_Cont equ 0x20
Bucle equ 0x21
;*************************************************************************************************************
#define FIN_CENTRADO PORTA,5
#define PUL_ANDA PORTB,5
#define PUL_CENTRA PORTC,0
#define SERVO_1 PORTA,0
#define SERVO_2 PORTA,1
#define SERVO_3 PORTA,2
#define SERVO_4 PORTA,3
#define SERVO_5 PORTA,4
#define SERVO_6 PORTB,0
#define SERVO_7 PORTB,1
#define SERVO_8 PORTB,2
#define SERVO_9 PORTB,3
#define SERVO_10 PORTB,4
;*************************************************************************************************************
;================================= AQUI EMPIEZA EL PROGRAMA ==================================================
ORG 0x00 ; Inicio en el Vector de Reset.
goto INICIO ; Vamos a la primera instruccion del programa.
INICIO
bsf STATUS,RP0
bcf STATUS,RP1 ; Cambiamos al banco 1.
movlw b'11100000'
movwf TRISB ; Configuramos Puerta B.
movlw b'00000110'
movwf ADCON1 ; Puerta A E/S digitales.
movlw b'000000'
movwf TRISA ; Configuramos Puerta A
movlw b'00000001'
movwf TRISC ; Configuramos Puerta C.
movlw b'11000001'
movwf OPTION_REG ; Preescaler de 4 asociado al TMR0.
bcf STATUS,RP0 ; Cambiamos al banco 0.
clrf PORTA ; Borramos bits Puerta A.
clrf PORTB ; Borramos bits Puerta B.
clrf PORTC ; Borramos bits Puerta C.
;+++++++++++++++++++++++++++++++++++++ CENTRAMOS LOS SERVOS ++++++++++++++++++++++++++++++++++++++++++++++++++
Wait_0 clrwdt ; Refresca WDT.
btfss PUL_CENTRA ; Pulsador para centrado ON??
goto Wait_0 ; Todavia no,espera.
goto Centra ; Si,inicia centrado
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Centra
movlw .25
movwf Bucle ; Repetimos 25 veces la secuencia.
Movi1 movlw 0x03
movwf Delay_Cont ; Cargamos 3 en Delay_Cont.
bsf SERVO_1 ; SERVO_1 high.
Delay1.0 movlw .131
movwf TMR0 ; Inicia TMR0.
Delay1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay1.0 ; Todavia no.
movlw 0x37
movwf Delay_Cont ; Carganos 37 en Delay_Cont
bcf SERVO_1 ; SERVO_1 low.
Delay1.0.0 movlw .175
movwf TMR0 ; Inicia TMR0.
Delay1.1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay1.1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer el flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay1.0.0 ; Todavia no.
decfsz Bucle,1 ; Se ha repetido tantas veces como indica Bucle??
goto Movi1 ; Todavia no.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
movlw .25
movwf Bucle ; Repetimos 25 veces la secuencia.
Movi2 movlw 0x03
movwf Delay_Cont ; Cargamos 3 en Delay_Cont.
bsf SERVO_2 ; SERVO_2 high.
Delay2.0 movlw .133
movwf TMR0 ; Inicia TMR0.
Delay2.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay2.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay2.0 ; Todavia no.
movlw 0x37
movwf Delay_Cont ; Carganos 37 en Delay_Cont
bcf SERVO_2 ; SERVO_2 low.
Delay2.0.0 movlw .175
movwf TMR0 ; Inicia TMR0.
Delay2.1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay2.1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer el flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay2.0.0 ; Todavia no.
decfsz Bucle,1 ; Se ha repetido tantas veces como indica Bucle??
goto Movi2 ; Todavia no.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
movlw .25
movwf Bucle ; Repetimos 25 veces la secuencia.
Movi3 movlw 0x03
movwf Delay_Cont ; Cargamos 3 en Delay_Cont.
bsf SERVO_3 ; SERVO_3 high.
Delay3.0 movlw .133
movwf TMR0 ; Inicia TMR0.
Delay3.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay3.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay3.0 ; Todavia no.
movlw 0x37
movwf Delay_Cont ; Carganos 37 en Delay_Cont
bcf SERVO_3 ; SERVO_3 low.
Delay3.0.0 movlw .175
movwf TMR0 ; Inicia TMR0.
Delay3.1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay3.1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer el flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay3.0.0 ; Todavia no.
decfsz Bucle,1 ; Se ha repetido tantas veces como indica Bucle??
goto Movi3 ; Todavia no.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
movlw .25
movwf Bucle ; Repetimos 25 veces la secuencia.
Movi4 movlw 0x03
movwf Delay_Cont ; Cargamos 3 en Delay_Cont.
bsf SERVO_4 ; SERVO_4 high.
Delay4.0 movlw .133
movwf TMR0 ; Inicia TMR0.
Delay4.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay4.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay4.0 ; Todavia no.
movlw 0x37
movwf Delay_Cont ; Carganos 37 en Delay_Cont
bcf SERVO_4 ; SERVO_4 low.
Delay4.0.0 movlw .175
movwf TMR0 ; Inicia TMR0.
Delay4.1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay4.1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer el flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay4.0.0 ; Todavia no.
decfsz Bucle,1 ; Se ha repetido tantas veces como indica Bucle??
goto Movi4 ; Todavia no.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
movlw .25
movwf Bucle ; Repetimos 25 veces la secuencia.
Movi5 movlw 0x03
movwf Delay_Cont ; Cargamos 3 en Delay_Cont.
bsf SERVO_5 ; SERVO_5 high.
Delay5.0 movlw .133
movwf TMR0 ; Inicia TMR0.
Delay5.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay5.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay5.0 ; Todavia no.
movlw 0x37
movwf Delay_Cont ; Carganos 37 en Delay_Cont
bcf SERVO_5 ; SERVO_5 low.
Delay5.0.0 movlw .175
movwf TMR0 ; Inicia TMR0.
Delay5.1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay5.1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer el flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay5.0.0 ; Todavia no.
decfsz Bucle,1 ; Se ha repetido tantas veces como indica Bucle??
goto Movi5 ; Todavia no.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
movlw .25
movwf Bucle ; Repetimos 25 veces la secuencia.
Movi6 movlw 0x03
movwf Delay_Cont ; Cargamos 3 en Delay_Cont.
bsf SERVO_6 ; SERVO_6 high.
Delay6.0 movlw .133
movwf TMR0 ; Inicia TMR0.
Delay6.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay6.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay6.0 ; Todavia no.
movlw 0x37
movwf Delay_Cont ; Carganos 37 en Delay_Cont
bcf SERVO_6 ; SERVO_6 low.
Delay6.0.0 movlw .175
movwf TMR0 ; Inicia TMR0.
Delay6.1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay6.1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer el flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay6.0.0 ; Todavia no.
decfsz Bucle,1 ; Se ha repetido tantas veces como indica Bucle??
goto Movi6 ; Todavia no.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
movlw .25
movwf Bucle ; Repetimos 25 veces la secuencia.
Movi7 movlw 0x03
movwf Delay_Cont ; Cargamos 3 en Delay_Cont.
bsf SERVO_7 ; SERVO_7 high.
Delay7.0 movlw .133
movwf TMR0 ; Inicia TMR0.
Delay7.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay7.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay7.0 ; Todavia no.
movlw 0x37
movwf Delay_Cont ; Carganos 37 en Delay_Cont
bcf SERVO_7 ; SERVO_7 low.
Delay7.0.0 movlw .175
movwf TMR0 ; Inicia TMR0.
Delay7.1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay7.1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer el flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay7.0.0 ; Todavia no.
decfsz Bucle,1 ; Se ha repetido tantas veces como indica Bucle??
goto Movi7 ; Todavia no.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
movlw .25
movwf Bucle ; Repetimos 25 veces la secuencia.
Movi8 movlw 0x03
movwf Delay_Cont ; Cargamos 3 en Delay_Cont.
bsf SERVO_8 ; SERVO_8 high.
Delay8.0 movlw .133
movwf TMR0 ; Inicia TMR0.
Delay8.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay8.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay8.0 ; Todavia no.
movlw 0x37
movwf Delay_Cont ; Carganos 37 en Delay_Cont
bcf SERVO_8 ; SERVO_8 low.
Delay8.0.0 movlw .175
movwf TMR0 ; Inicia TMR0.
Delay8.1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay8.1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer el flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay8.0.0 ; Todavia no.
decfsz Bucle,1 ; Se ha repetido tantas veces como indica Bucle??
goto Movi8 ; Todavia no.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
movlw .25
movwf Bucle ; Repetimos 25 veces la secuencia.
Movi9 movlw 0x03
movwf Delay_Cont ; Cargamos 3 en Delay_Cont.
bsf SERVO_9 ; SERVO_9 high.
Delay9.0 movlw .133
movwf TMR0 ; Inicia TMR0.
Delay9.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay9.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay9.0 ; Todavia no.
movlw 0x37
movwf Delay_Cont ; Carganos 37 en Delay_Cont
bcf SERVO_9 ; SERVO_9 low.
Delay9.0.0 movlw .175
movwf TMR0 ; Inicia TMR0.
Delay9.1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay9.1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer el flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay9.0.0 ; Todavia no.
decfsz Bucle,1 ; Se ha repetido tantas veces como indica Bucle??
goto Movi9 ; Todavia no.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
movlw .25
movwf Bucle ; Repetimos 25 veces la secuencia.
Movi10 movlw 0x03
movwf Delay_Cont ; Cargamos 3 en Delay_Cont.
bsf SERVO_10 ; SERVO_10 high.
Delay10.0 movlw .133
movwf TMR0 ; Inicia TMR0.
Delay10.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay10.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay10.0 ; Todavia no.
movlw 0x37
movwf Delay_Cont ; Carganos 37 en Delay_Cont
bcf SERVO_10 ; SERVO_10 low.
Delay10.0.0 movlw .175
movwf TMR0 ; Inicia TMR0.
Delay10.1.1 clrwdt ; Refresca WDT.
btfss INTCON,2 ; Han pasado ....ms.
goto Delay10.1.1 ; Todavia no.
bcf INTCON,2 ; Si, reponer el flag del TMR0.
decfsz Delay_Cont,1 ; Se ha repetido tantas veces como indica Delay_Cont??
goto Delay10.0.0 ; Todavia no.
decfsz Bucle,1 ; Se ha repetido tantas veces como indica Bucle??
goto Movi10 ; Todavia no.
END
;+++++++++++++++++++++++++++++++++++++++ FIN DEL CENTRADO DE LOS SERVOS ++++++++++++++++++++++++++++++++++++++
Espero que te sea de ayuda,si tienes dudas no dudes en preguntar.
Saludos.