Autor Tema: ¿Por qué demonios esto no funciona?  (Leído 4171 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Carafa

  • PIC10
  • *
  • Mensajes: 12
¿Por qué demonios esto no funciona?
« 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



Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: ¿Por qué demonios esto no funciona?
« Respuesta #1 en: 01 de Diciembre de 2003, 16:03:00 »
Preguntonta:
Que salidas estas controlando que hagan PWM???
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: ¿Por qué demonios esto no funciona?
« Respuesta #2 en: 01 de Diciembre de 2003, 16:06:00 »
Perdon....
No es
Do...While??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Carafa

  • PIC10
  • *
  • Mensajes: 12
RE: ¿Por qué demonios esto no funciona?
« Respuesta #3 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.

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
RE: ¿Por qué demonios esto no funciona?
« Respuesta #4 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
saludos
PikMan

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: ¿Por qué demonios esto no funciona?
« Respuesta #5 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...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: ¿Por qué demonios esto no funciona?
« Respuesta #6 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

Desconectado Carafa

  • PIC10
  • *
  • Mensajes: 12
RE: ¿Por qué demonios esto no funciona?
« Respuesta #7 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í?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: ¿Por qué demonios esto no funciona?
« Respuesta #8 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

Desconectado Carafa

  • PIC10
  • *
  • Mensajes: 12
RE: ¿Por qué demonios esto no funciona?
« Respuesta #9 en: 04 de Diciembre de 2003, 15:52:00 »
Muchísimas gracias por todo, Pocher