Buenas.. otra vez yo

la cosa es que se "SUPONE" que i programa debe encender un led rgb con diferentes colores....
asi que hice lo siguiente: el periodo que use fue de 10ms y lo dividi en 255 partes eso me dio 39.21us
que deje en 40 us
declare una interrupcion del Timer0 cada 40 us y a su vez incremente una variable Var_I
ahora cada vez que Var_I = 255 esta variable regresa a 0
asi hice 1 periodo de 10ms
ahora el PWM
si Var_I >= pwm1 ?
si es asi apago el led rojo
si no es asi prendo el led rojo
ahora repeti esto mismo 2 veces mas
.... como tambien debo modificar si el periodo es 10, 20, 0 30 ms.. hice o mismo del principio.. dividi 20ms/255 y asi con todos los tiempos que necesito, y calcule el valor del timer para que cada vez que Var_I llegara a 255 se cumplieran todos estos periodos.....
la cosa es que no se porque las ondas que deberian ser cuadradas, con los diferentes periodos segun yo escoja..... me salen horribles

o sea, no salen como deberia

alguna ayuda se les agradeceria :S
PD: gracias a los que me han ayudado
este es el codigo...
list p=16f887
#include <p16f887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
;------------------------------------------------------------------
;configuro inicio del programa con el vector reset/interrupcion
;*****************************************************************
org 00H
goto inicio
org 04h
goto Interrupcion
;-----------------------------------------------------------------------
; Inicia Programa
; CONFIGURO I/O
;**********************************************************************
inicio
;---------------------------------------------------------------------
; configuro Pre-escaler
;*********************************************************************
clrwdt
BANKSEL OPTION_REG
Movlw b'00000100'
Movwf OPTION_REG
Movlw b'10100000'
Movwf INTCON
BANKSEL TRISD
clrf TRISC
BANKSEL PORTA
clrf PORTC
;-------------------------------------------------------------------------
; Configuro Variables
;*************************************************************************
CBLOCK 20H
pwm_r, pwm_v, pwm_a, W2, Status2, Var_I, Var_C, Var_T
endc
;-------------------------------------------------------------------------
; Defino pin de puertos
;*************************************************************************
#Define Led_r PORTC,0
#Define Led_v PORTC,1
#Define Led_a PORTC,2
;-----------------------------------------------------------------
;Tabla para cargar los valores de Timer que variaran los tiempo
;*****************************************************************
goto inicio1
Tiempo
movf Var_T,W
addwf PCL,F
retlw .255 ;10ms
retlw .254 ;20ms
retlw .252 ;30ms
retlw .251 ;40ms
retlw .250 ;50ms
retlw .249 ;60ms
retlw .247 ;70ms
retlw .246 ;80ms
retlw .245 ;90ms
retlw .244 ;100ms = 1s
retlw .243 ;110ms
retlw .241 ;120ms
retlw .240 ;130ms
retlw .239 ;140ms
retlw .238 ;150ms
retlw .236 ;160ms
retlw .235 ;170ms
retlw .234 ;180ms
retlw .233 ;190ms
retlw .231 ;200ms = 2s
inicio1
movlw .19
movwf Var_T
;--------------------------------------------------------------------------
; Pregunto la variable "Var_C" para ver en que color me encuentro
;**************************************************************************
Carga_duty
movf Var_C,W
addwf PCL, F
goto rojo
goto Azul
goto verde
goto amarillo
goto agua
goto magenta
goto orange
goto bonito
goto morado
goto marron
goto violeta
goto oscuro
goto verde1
goto rosado
goto verde2
goto blanco
;-------------------------------------------------------------------------
; Cargo las variables con los distintos dutys para generar
;los colores correspondientes
;*************************************************************************
rojo
movlw .255
movwf pwm_r
movlw .0
movwf pwm_v
movlw .0
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
verde
movlw .0
movwf pwm_r
movlw .255
movwf pwm_v
movlw .0
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
Azul
movlw .0
movwf pwm_r
movlw .0
movwf pwm_v
movlw .255
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
amarillo
movlw .255
movwf pwm_r
movlw .255
movwf pwm_v
movlw .0
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
agua
movlw .0
movwf pwm_r
movlw .255
movwf pwm_v
movlw .255
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
magenta
movlw .255
movwf pwm_r
movlw .0
movwf pwm_v
movlw .255
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
orange
movlw .255
movwf pwm_r
movlw .140
movwf pwm_v
movlw .0
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
bonito
movlw .0
movwf pwm_r
movlw .250
movwf pwm_v
movlw .154
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
morado
movlw .147
movwf pwm_r
movlw .112
movwf pwm_v
movlw .219
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
marron
movlw .139
movwf pwm_r
movlw .69
movwf pwm_v
movlw .19
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
violeta
movlw .238
movwf pwm_r
movlw .130
movwf pwm_v
movlw .238
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
oscuro
movlw .25
movwf pwm_r
movlw .25
movwf pwm_v
movlw .112
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
verde1
movlw .46
movwf pwm_r
movlw .139
movwf pwm_v
movlw .87
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
rosado
movlw .220
movwf pwm_r
movlw .20
movwf pwm_v
movlw .60
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
verde2
movlw .144
movwf pwm_r
movlw .238
movwf pwm_v
movlw .144
movwf pwm_a
incf Var_C
goto Pregunto_Pwm
blanco
movlw .255
movwf pwm_r
movlw .255
movwf pwm_v
movlw .255
movwf pwm_a
clrf Var_C
goto Pregunto_Pwm
;--------------------------------------------------------------------------
; Pregunto que valor tiene la variable "Var_T" para saber cuando durara mi
; Periodo y con eso modificar el valor del Timer0
;*************************************************************************
Pregunto_Pwm
call Tiempo
BANKSEL TMR0
Movwf TMR0
Pregunto_Pwm1
movf pwm_r,0
subwf Var_I,0
btfss STATUS,C
goto on_r
goto off_r
off_r
bsf Led_r
goto Pregunto_v
on_r
bcf Led_r
goto Pregunto_v
Pregunto_v
movf pwm_v,0
subwf Var_I,0
btfss STATUS,C
goto on_v
goto off_v
off_v
bsf Led_v
goto Pregunto_a
on_v
bcf Led_v
goto Pregunto_a
Pregunto_a
movf pwm_a,0
subwf Var_I,0
btfss STATUS,C
goto on_a
goto off_a
off_a
bsf Led_a
goto Pregunto_Pwm1
on_a
bcf Led_a
goto Pregunto_Pwm1
;-------------------------------------------------------------------------
;Pregunto si ya cumplieron los ciclos de trabajo
;**************************************************************************
Pregunto_duty
movwf W2
movf STATUS,w
movwf Status2
;---------------------------------------------------------------------
; Pregunto si Var_I llego a 255
;**********************************************************************
movlw .255
subwf Var_I,0
btfss STATUS,Z
goto otro
clrf Var_I
;-------------------------------------------------------------------
; devuelvo valor a w y status, tambien pongo en bajo Toif
;****************************************************************
movf Status2,w
movwf STATUS
movf W2,W
bcf INTCON,T0IF
bsf INTCON,GIE
;---------------------------------------------------------------------
; configuro Interrupcion
;*********************************************************************
goto Carga_duty
otro
bcf INTCON,T0IF
call Tiempo
Movwf TMR0
movf Status2,w
movwf STATUS
movf W2,W
retfie
;--------------------------------------------------------------------
;rutina de interrupcion
;********************************************************************
Interrupcion
incf Var_I,f
goto Pregunto_duty
end