Y una vez mas, volvemos al ataque (y una vez mas, tras infinidad de intentos infructuosos, y me empiezo a plantear ya tirar la toalla porque debe de ser que soy tonto y no llego). A ver, mi problema esta claro que no es tanto con el codigo como lo es con la configuracion del pwm del pic.
Veamos, poco a poco y buena letra. Por partes (es el paso a paso que pone el datasheet que hay que seguir para generar una pwm normal; no el "enhanced"):
1. Disable the PWM pin (CCP1) output driver by
setting the associated TRIS bit.
Entiendo que lo que debo hacer aqui es desactivar (poner a 0) RC5, puesto que es el pin asociado a CCP1. Si es asi, deduzco que seria hacer un BCF de dicho pin en el portc, me equivoco? o debo de cambiar algun valor desde el TRISC?.
2. Set the PWM period by loading the PR2 register.
Nada que aclarar, tan solo hay que cargar el periodo deseado en el registro PR2.
bsf STATUS,RP0 ; Banco 1
movlw 0x1E ; Senal de 2kHz
movwf PR2
bcf STATUS,RP0 ; Banco 0
3. Configure the CCP module for the PWM mode
by loading the CCP1CON register with the
appropriate values.
Aqui empieza lo bueno. Esta claro que tengo que modificar los bits en CCP1CON, pero no se a que se refieren!. CCP1RL son los MSB's del duty, DCB1 y DCB0 los LSB's, y el resto de bits no tengo muy claro si debo o no activarlos (seguramente la mayoria de mis errores se hallan aqui)
4. Set the PWM duty cycle by loading the CCPR1L
register and DC1B<1:0> bits of the CCP1CON
register.
Aqui no hay duda, tal y como he comentado antes. Los MSB's a CPR1L y los LSB's a DCB <1:0>. Todo y que no lo tengo implementado aun, entiendo que no es mas que un par de mov a la manera tradicional para poner los valores deseados en los registros pertinentes.
5. Configure and start Timer2:
• Clear the TMR2IF interrupt flag bit of the
PIR1 register.
• Set the Timer2 prescale value by loading the
T2CKPS bits of the T2CON register.
• Enable Timer2 by setting the TMR2ON bit of
the T2CON register.
Todo esto no entiendo bien de que va, ya que usa bits que en ningun lado del apartado PWM se comentan, e incluso en el codigo de Suky juraria que no hay nada parecido.
6. Enable PWM output after a new PWM cycle has
started:
• Wait until Timer2 overflows (TMR2IF bit of
the PIR1 register is set).
• Enable the CCP1 pin output driver by clearing
the associated TRIS bit.
Mas de lo mismo. Es un proceso un tanto ilogico que no consigo entender por mas que me lo mire. Me he estudiado el datasheet decenas de veces y sigo sin entender que tengo y que no tengo que hacer para generar un misero pwm!.
Por otra parte he estado haciendo pruebas con el 16F84A para hacer un pwm artesanal y funciona bien, pero el codigo es tan sumamente inmenso que lo veo ridiculo. Ademas, el efecto no es el mismo ni remotamente, asi que hasta que ya tire la toalla oficialmente, me gustaria seguir intentandolo con el 16F690. Por favor, lo pido desde la mas absoluta desesperacion, AYUDA