TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Carafa en 01 de Diciembre de 2003, 15:52:00

Título: ¿Por qué demonios esto no funciona?
Publicado por: Carafa en 01 de Diciembre de 2003, 15:52:00
Veamos, en mi imparable caída libre hacía el inframundo de los PIC he llegado a construir un sencillo programa en CCS para comprobar mis conocimientos sobre estos agradables cacharritos. Os lo presento:

#include <16F876.h>
#fuses XT, NOWDT, NOPROTECT, PUT
#USE DELAY(clock = 4000000)


main()
{

unsigned int16 DCf, DCg;
float vf, vg;

setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
setup_timer_2(T2_DIV_BY_1, 0x3F, 1);

vf = 3.5;
vg = 4.0;

DCf = ((unsigned int16)((1023/5.0)*vf + 0.5))&0x03FF;
DCg = ((unsigned int16)((1023/5.0)*vg + 0.5))&0x03FF;

set_pwm1_duty(DCf);
set_pwm2_duty(DCg);

while(1);

}


Aquí el Señor programa, aquí los Señores Programadores.

Compilo. Bien. Genero el .HEX. Bien.

Me voy al MPLAB, selecciono dispositivo (16F876), configuro los configuration bits, selecciono Picstar Plus como programador, lo activo, abro mi .HEX haciendo un import y programo.

Lo pruebo (alimentaciones a +5v y masa, oscilador de 4Mhz y condensadores de 12pF): miro las salidas del PWM mediante osciloscopio. Nada. Muerto. Nien. Cero. Coloco un filtro de Butterworth en dichas salidas y miro (por mirar que no quede) si el valor de DC es, respectivamente, 3.5v y 4v (el que yo he puesto por programa). Imaginaos el resultado.

Y la pregunta es: ¿por qué demonios esto no funciona? ¿Qué es lo que hago mal de todo ese proceso?

Se agradecerá cualquier resquicio de luz en este enigma de la electrónica.

Salu2


Título: RE: ¿Por qué demonios esto no funciona?
Publicado por: MGLSOFT en 01 de Diciembre de 2003, 16:03:00
Preguntonta:
Que salidas estas controlando que hagan PWM???
Título: RE: ¿Por qué demonios esto no funciona?
Publicado por: MGLSOFT en 01 de Diciembre de 2003, 16:06:00
Perdon....
No es
Do...While??
Título: RE: ¿Por qué demonios esto no funciona?
Publicado por: Carafa en 01 de Diciembre de 2003, 16:34:00
¿Do/While? ¿Dónde? ¿Para qué? ¿Por qué me siento tan inútil?

PS: las salidas las miro en los pines 12 y 13 del 16F876.
Título: RE: ¿Por qué demonios esto no funciona?
Publicado por: pikman en 01 de Diciembre de 2003, 19:52:00
Hola, si puede ser do/while, tambien andaria con while(true) , pero no while a main..........

saludos

Ariel
Título: RE: ¿Por qué demonios esto no funciona?
Publicado por: MGLSOFT en 02 de Diciembre de 2003, 05:28:00
El uso de While (true) o (1) es lo mismo, potencialmente hablando.
El tema es que en el loop debe estar la instruccion del PWM...
Lee mas sobre el uso de esa instruccion...
Título: RE: ¿Por qué demonios esto no funciona?
Publicado por: pocher en 02 de Diciembre de 2003, 09:49:00
¿Podrías poner los cálculos que has hecho para PR2 y CCPR1L?

¿Cual es el Periodo y el Duty que quieres conseguir?

 Ten en cuenta que el Duty debe ser menor que el Periodo.

Un saludo
Título: RE: ¿Por qué demonios esto no funciona?
Publicado por: Carafa en 02 de Diciembre de 2003, 12:35:00
Gracias por las molestias

El duty que quiero conseguir, en este caso es 3.5/5 * 100 = 70% para uno y 4/5 *100 = 80% para otro.

La línea "DCf = ((unsigned int16)((1023/5.0)*vf + 0.5))&0x03FF;" la pongo para cuadrar ese porcentaje con un dato de 10bits. Creo que eso es correcto.

La frecuencia de PWM que deseo debería ser mmmm... un momento que mire el datasheet..., sí, ya, ya lo tengo:

PR2 = Ox3F; Preescaler = 1, frecuencia = 78.12kHz

¿sí?
Título: RE: ¿Por qué demonios esto no funciona?
Publicado por: pocher en 03 de Diciembre de 2003, 11:02:00
Ultimamente va de fórmulas.

Algunos comentarios:

- En el manual de CCS pone set_pwm1_duty(value) yo creo que value se refiere al valor de CCPR1L.

- Para calcular el valor a cargar en CCPR1L se usa la fórmula: CCPR1L=Duty/(4·Tosc·TMR2preescaler)

- Para calcular el valor de PR2 y ponerlo en el setup_timer_2 se usa la fórmula: PR2=(T/(4·Tosc·TMR2preescaler))-1

- Dices que la f=78,12 KHz --> T=12,8 us, si la fosc=4MHz y el TMR2preescaler=1 sale PR2=11,8 aproximadamente 12 que dista mucho del valor que tú tienes (0x3F).

El cálculo de CCPR1L no lo he hecho, la línea DCf = ((unsigned int16)((1023/5.0)*vf + 0.5))&0x03FF no la entiendo ya que DCf es el valor que tú pones como CCPR1L y no sé de donde sale.

Un saludo
Título: RE: ¿Por qué demonios esto no funciona?
Publicado por: Carafa en 04 de Diciembre de 2003, 15:52:00
Muchísimas gracias por todo, Pocher