Este código lo escribe hace algún tiempo para simplificarme la tarea de trabajar con el modulo CCP, está orientado a funciones y que yo sepa Proton no las permite, de todas formas lo mismo alguien te puede orientar ya que están todos o la mayoría de los registros necesarios para el Pic18F2550, seguramente tendrá similitud con el que usas.
'********************************************************
'Pic18F2550
'Resumen y conjunto de funciones para configurar el modulo CCP1
'By COS
'********************************************************
'Configura el modulo CCP1 en modo PWM y TIMER2
Symbol _pinccp1 = rc2 'Asigna el pin de trabajo del CCP1
ConfigPin _pinccp1 = Output 'Pin como salida
Call _set_pwm1_duty(0) 'Maximo 1020, minimo 0, potencia inicial
Call _setup_timer2(_tmr2_div4, 255, 1) '9765.63Hz a 10Mhz
Call _setup_ccp1(_ccp_pwm) 'PWM1 a On
main:
Dim _power As Word
_power = 0
While x = x
Call _set_pwm1_duty(_power) 'Selecciona el duy-cycle de trabajo
If _power < 1020 Then _power = _power + 1 'Incrementa potencia
WaitMs 100 'Pausa
Wend
Goto main
End
'**********************************************************
'**********************************************************
'Include "_FuncionesPic18F2550.bas" *****************************
'By COS, 19/06/2014, 12/2013, Pic Simulator IDE v7.19_03 ***********
'**********************************************************
'Funciones para configuración y control del modulo CCP1 (Pic18F2550)
'**********************************************************
'GESTIÓN MODULO CCP1:
'_setup_ccp1(), _set_pwm1_duty()
'**********************************************************
'Call _Setup_CCP1(modo)
'Modo:
'_CCP_OFF modulo CCP apagado
'_CCP_PWM modulo CCP trabajando como PWM
'Call _Set_Pwm1_Duty(Duty)
'Duty = duración del pulso alto con respecto al pulso bajo.
'**********************************************************
'**********************************************************
'TIMER2:
'**********************************************************
'_set_timer2(Byte), _clear_tiemr2(), _get_timer2(), _tmr2if
'_setup_timer2(), _timer2()
'**********************************************************
'_setup_timer2(_prediv As Byte, _periodo As Byte, _posdiv As Byte)
'_Prediv: 'Preescaler
'_tmr2_disable: Para el Tmr2
'_tmr2_div1: Divide por 1
'_tmr2_div4: Divide por 4
'_tmr2_div16: Divide por 16
'_Periodo: Carga el registro del TMR2
'_posdiv: Postscale, Valores comprendidos entre 0 y 16
'_set_timer2(Byte): Recarga el contador del TIMER2
'_get_timer2(): Lee el contador del TIMER2 (Byte)
'_clear_timer2(): Borra el contador del TIMER2
'_tmr2if: Etiquea el flag de desborde TIMER2
'_timer2(): (_on), (_off), activa o para el timer2
'**********************************************************
'**********************************************************
'MODULO CCP1
'**********************************************************
Const _on = 1
Const _off = 0
'Const _ccp_off = 0
'Const _ccp_pwm = 1
'Selecciona el modo de trabajo del modulo CCP1
Proc _setup_ccp1(_mode As Byte)
If _mode = 0 Then 'CCP1 a Off
ccp1con.ccp1m0 = 0
ccp1con.ccp1m1 = 0
ccp1con.ccp1m2 = 0
ccp1con.ccp1m3 = 0
Endif
If _mode = 1 Then 'CCP1 en modo Pwm
ccp1con.ccp1m0 = 0
ccp1con.ccp1m1 = 0
ccp1con.ccp1m2 = 1
ccp1con.ccp1m3 = 1
Endif
End Proc
'Carga el duty cycle
Proc _set_pwm1_duty(_duty As Word)
ccp1con.dc1b0 = _duty.0 'ccp1y = _duty.0
ccp1con.dc1b1 = _duty.1 'ccp1x = _duty.1
ccpr1l = ShiftRight(_duty, 2)
End Proc
'***************************************************
'***************************************************
'TIMER2
'***************************************************
'Etiquetas y constantes
Symbol _tmr2if = PIR1.tmr2if 'Etiquea el flag de desbordamiento Timer2
'ConFigura el TIMER2
'Prescale Select Bits (T2CON: T2CKPS1, T2CKPS0)
Const _tmr2_disable = 0x00 'Timer2 a Off
Const _tmr2_div1 = 0 'Prescale Select bits
Const _tmr2_div4 = 1 'Prescale Select bits
Const _tmr2_div16 = 2 'Prescale Select bits
'Postscale Select Bits (T2CON: TOUTPS3, TOUTPS2, TOUTPS1, TOUTPS0)
'Postscale de 0 a 16.
'prediv: (prescaler) _tmr2_disable, _tmr2_div1, _tmr2_div4, _tmr2_div16
'Period: Cuando se hace reset (8Bit), TMR2 = PR2.
'_posdiv: (postscaler) valores comprendidos entre 0 1 16.
Proc _setup_timer2(_mode As Byte, _periodo As Byte, _posdiv As Byte)
t2con = 0x00 'Timer2 a Off
t2con.t2ckps0 = _mode.0
t2con.t2ckps1 = _mode.1
pr2 = _periodo 'Desborde TMR2 (TMR2 = PR2)
t2con.toutps0 = _posdiv.0 'Asigna postscale
t2con.toutps1 = _posdiv.1 'Asigna postscale
t2con.toutps2 = _posdiv.2 'Asigna postscale
t2con.toutps3 = _posdiv.3 'Asigna postscale
End Proc
'Borra el registro del TMR2
Proc _clear_timer2()
tmr2 = 0 'Borra el byte
PIR1.tmr2if = 0 'Flash dosborde a cero
End Proc
'Recarga el registro del TMR
Proc _set_timer2(_reg As Byte)
tmr2 = _reg 'Recarga el byte
PIR1.tmr2if = 0 'Flash dosborde a cero
End Proc
'Devuelve el registro del Tmr2
Function _get_timer2() As Byte
_get_timer2 = tmr2 'Carga el byte
PIR1.tmr2if = 0 'Flash dosborde a cero
End Function
'Activa o para el contador del timer2
Proc _timer2(_on_off As Bit)
t2con.tmr2on = _on_off
End Proc
'***************************************************
Y en esta pagina hay un calculador que al suministrarle los valores cristal, frecuencia deseada y duty-cycle nos indica con que valores hay que cargar la mayoría de registros del modulo CCP1.
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html