He realizado unas pruebas contando 60 ciclos empleando las interrupciones del Timer2 y, por muy rápido que pare el modulo CCP, siempre tengo un pulso positivo de más, con un ancho de 41uSeg. trabajando a 8Mhz de reloj. La frecuencia del PWM es de 500Hz. Dejo el codigo por si les sirve.
'Define CONFIG = 0x2f42
'Define CONFIG2 = 0x3ffc
'Define CLOCK_FREQUENCY = 20 'Oscilador a 20Mhz
'**********************************************************************************
'Generando pulso con el modulo CCP1 configurado en modo PWM
'Placa PicEBasic, By COS, 04/12/2013
'Basic Pic Simulator IDE (PSI), v6.95_10, Pic16F88
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8 'Oscilador a 8Mhz
'Define SIMULATION_WAITMS_VALUE = 1 'Activar para simulación
'-----------------------------------------
Call _setupebasic() 'Inicializa la placa entrenadora PicEBasic.
Hseropen 38400 'Inicializa puerto RS232 por hardware a 38400Baudios
Lcdinit 'Inicializa el LCD sin cursor
WaitMs 100 'Pausa de 100 mSeg.
Lcdout "CCP1 en modo PWM" 'Imprime el texto en el LCD
WaitMs 2000 'Pausa de 2 Seg.
'-----------------------------------------
Dim contador As Word
contador = 0
voidmain:
Dim main As Byte
Symbol _pinccp1 = RB3
ConfigPin _pinccp1 = Output 'Pin como salida
_pinccp1 = 0
Call _setup_timer2(_tmr2_div16, 250, 1) '500Hz a 8Mhz
Call _setup_ccp1(_ccp_pwm)
Call _set_pwm1_duty(498) 'Maximo 996, minimo 0
Call _enable_interrupts(_global)
Call _enable_interrupts(_int_timer2)
Dim pwm1 As Word
pwm1 = 498 '50%
While main = main
Call _set_pwm1_duty(pwm1)
Hserout #contador, CrLf
Wend
End
'Bibliotecas usadas:
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesGeneralLibrary.bas"
'********************************************************************
'Gestión interrupciones
On Interrupt
Save System
If _tmr2if = True Then
contador = contador + 1
If contador > 60 Then
Call _setup_ccp1(_ccp_off)
Call _disable_interrupts(_int_timer2)
Endif
_tmr2if = False
Endif
Resume