TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Archangels en 04 de Marzo de 2013, 23:59:21

Título: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 04 de Marzo de 2013, 23:59:21
Tengo el siguiente codigo:

Código: [Seleccionar]
#include <16F876.h>

#fuses HS,NOWDT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT

#USE DELAY(clock=8000000)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#define LED1 PIN_B1
#define LED2 PIN_B2

#define Enciende(x) output_high(x)
#define Apaga(x) output_low(x)
#define Estado(x) input_state(x)

void main()
{
   /*
   set_tris_a(........GP4, GP3, GP2, GP1, GP0)
   and 1 = input
   0 = output
   */
   set_tris_a(0b11000000);
   set_tris_b(0b00000000);
   set_tris_c(0b00000000);
   setup_adc(ADC_OFF);
   setup_adc_ports(NO_ANALOGS);
   PORT_B_PULLUPS(FALSE);
   signed int8 UnoPorciento = 8;
   signed int8 Multiplicador = 1;
   signed int8 PWM2 = 200;
   delay_ms(1);
   // PWM por las 2 Salidas del PIC
   SETUP_TIMER_2(T2_DIV_BY_1,199,1);
   SETUP_CCP1(CCP_PWM);
   SETUP_CCP2(CCP_PWM);
   
   while(TRUE)
   {
      if (Estado(PIN_A4)==1)
      {
         Enciende(LED1);
         Multiplicador++;
         delay_ms(500);
         Apaga(LED1);
      }
     
      if (Estado(PIN_A5)==1)
      {
         Enciende(LED2);
         Multiplicador--;
         delay_ms(500);
         Apaga(LED2);
      }
     
      if (Multiplicador < 0)
      {
         Multiplicador = 0;
      }
     
      if (Multiplicador > 100)
      {
         Multiplicador = 100;
      }
 
      set_pwm1_duty(UnoPorciento*Multiplicador);       // 10Khz 1%
      set_pwm2_duty(PWM2);     // 10Khz 25%
   }
}

Y tengo el pic montado en una protoboard, supuestamente el pic lo que deberia hacer es sacar siempre por el CCP2 un duty del 25% y darle corriente o por A4 o A5 aumentar o disminuir el duty del CCP1 en un 1%. Tambien enciende un led para que se vea que eso pasa al pulsar el boton ( conectar a +5 ).

Pues resulta que para nada actua como tal. Nada mas conectarlo a la corriente, los led's se empiezan a volver locos y empiezan a parpadear ( solamente si tengo las manos cerca de A4, parece como si A5 no hiciera nada). Si no tengo las manos cerca, tengo el led A5 siempre encendido. No se si esto es importante pero al conectarlo a la corriente por primera vez y tener las manos lejos me pasa que parpadean como 2 o 3 veces cada uno.

En las salidas pwm tengo conectados otros 2 led's para ver si hace algo y solamente esta encendido el LED de CCP2 (Supongo q el CCP 1 no lo llega a encender por estar a un 1%)

Supongo que esto sera un problema sencillo para ustedes, pero yo me estoy iniciando en el mundo de los pic y no entiendo muy bien porque pasa esto. Un amigo me dijo que tengo mucho ruido en el circuito y por eso me pasa, pero no sabria como arreglarlo.

Si necesitan el circuito o cualquier cosa diganlo y lo publico ( todavia sigo descargando el proteus y no puedo ).

Tengo un cristal de cuarzo de 8Mhz conectado.

Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: rivale en 05 de Marzo de 2013, 13:18:06
tienes un error al declarar tus variables

Código: [Seleccionar]
signed int8 UnoPorciento = 8;
signed int8 Multiplicador = 1;
signed int8 PWM2 = 200;

el int8 signado toma valores de -128 hasta 127, y tu lo estas inicializando con un valor de 200. deberias utilizar una variable int16 (long), ya que la resolucion de tu pwm no cabe en 8 bits solamente
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 05 de Marzo de 2013, 13:53:04
tienes un error al declarar tus variables

Código: [Seleccionar]
signed int8 UnoPorciento = 8;
signed int8 Multiplicador = 1;
signed int8 PWM2 = 200;

el int8 signado toma valores de -128 hasta 127, y tu lo estas inicializando con un valor de 200. deberias utilizar una variable int16 (long), ya que la resolucion de tu pwm no cabe en 8 bits solamente

Tambien lo intente anteriormente con 16 eso era la segunda prueba que hice por si me equivoque.

Cuando llegue a mi casa pondre el 16 de vuelta, lo unico que ya te digo esa fue mi primera opcion y hacia lo mismo

Es posible que sea por las interferencias del protoboard ?
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: rivale en 05 de Marzo de 2013, 13:54:23
alguna vez me pasó que el micro se volvia loco porque faltaba poner en los fuses nolvp, esto para que no programe en bajo voltaje. intenta eso a ver si te funciona
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 05 de Marzo de 2013, 13:56:06
alguna vez me pasó que el micro se volvia loco porque faltaba poner en los fuses nolvp, esto para que no programe en bajo voltaje. intenta eso a ver si te funciona

Lo llevo puesto, tambien lo lei por ahi, tambien tengo una resistencia a tierra en el puerto pgm por si las moscas.
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: rivale en 05 de Marzo de 2013, 14:02:05
pon tu diagrama para ver donde esta el fallo, y tambien podrian intentar debuggeralo en proteus
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 05 de Marzo de 2013, 14:20:47
pon tu diagrama para ver donde esta el fallo, y tambien podrian intentar debuggeralo en proteus

En proteus funciona a las mil maravillas, q anoche conseguir probarlo rapidamente, en cuanto llegue a mi casa lo subo.

Edito:

En proteus hacia una cosa que tambien pasa en normal que es q un led se quedaba encendido, lo he corregido ( en proteus, en normal sigue haciendo lo mismo ) apagando los 2 led's antes del while(1). En los led's de proteus es un poco dificil apreciar el cambio del pwm hasta cierto tiempo, yo al hacer las pruebas puse un osciloscopio.

Añado diseño en proteus:
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Chenao en 05 de Marzo de 2013, 22:41:46


Yo veo un problema con los pulsadores, cuando el pulsador esta abierto el respectivo terminal no queda con referencia alguna, yo recomiendo poner una pull - up o una pull down para conectar el respectivo terminal ya sea a VDD o VSS, por otro lado, si estas simulando el circuito en el proteus no hay necesidad de agregar el oscilador.
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 05 de Marzo de 2013, 22:58:40


Yo veo un problema con los pulsadores, cuando el pulsador esta abierto el respectivo terminal no queda con referencia alguna, yo recomiendo poner una pull - up o una pull down para conectar el respectivo terminal ya sea a VDD o VSS, por otro lado, si estas simulando el circuito en el proteus no hay necesidad de agregar el oscilador.

PullUP de cuanto seria ?
He puesto todo para que vean lo mas cerca posible de la realidad.
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: rivale en 05 de Marzo de 2013, 23:14:14
cuando no tienes presionado tu botón, el pin no esta fijo a ningún valor, tendrías que poner una resistencia a tierra, de valor de 10K te serviria
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Chenao en 05 de Marzo de 2013, 23:18:54

Examina el esquema que adjunto.
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 05 de Marzo de 2013, 23:28:40

Examina el esquema que adjunto.

El de la izquierda seria pulldown y el de la derecha seria pullup verdad ?
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: rivale en 05 de Marzo de 2013, 23:34:53
el de la izquierda es pull-up, porque normalmente esta en estado alto

y el de la derecha es pull-down, porque normalmente esta en estado bajo
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Chenao en 05 de Marzo de 2013, 23:35:39
Citar
El de la izquierda seria pulldown y el de la derecha seria pullup verdad ?

Al contrario Archangels, el termino pull - up hace referencia a la resistencia que esta conectada a VDD, mientra que, pull down hace referencia al caso contrario.
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 05 de Marzo de 2013, 23:56:29
Hmm entonces con mi codigo utilizare la pull down ya que quiero detectar cuando esta a 1, muchas gracias por vuestras respuestas, mañana lo pruebo que ahora mismo en España es muy tarde y hay que dormir. Un saludo y gracias nuevamente por sus respuestas. Mañana les cuento
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 06 de Marzo de 2013, 10:01:41
Ya he cambiado lo que dijimos antes, ahora por lo menos los led's no se vuelven locos cuando acerco la mano, voy avanzando jeje.

El problema ahora es que el led que hay en B2 esta siempre encendido. ( el que supuestamente se enciende cuando tiene que bajar el % del pwm )
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Chenao en 06 de Marzo de 2013, 11:08:52

Intenta poner en cero todos los bits del puerto b al inicio del programa, es decir.

Código: [Seleccionar]
#byte puerto_b = 06
void main()
  {
    puerto_b  = 0;
  }
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 06 de Marzo de 2013, 11:18:02
Anoche cambie el codigo un poco sigue siendo el de arriba pero cambiando el int8 por int16 y añadiendo antes del while (1) Apaga (LED1); y Apaga (LED2);

Eso seria lo mismo que tu me has puesto no ?
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Chenao en 06 de Marzo de 2013, 11:36:38

Citar
Anoche cambie el codigo un poco sigue siendo el de arriba pero cambiando el int8 por int16 y añadiendo antes del while (1) Apaga (LED1); y Apaga (LED2);

Eso seria lo mismo que tu me has puesto no ?

No Archangels si no que es una costumbre de programación de microcontroladores apagar todos los terminales de salida antes de empezar a ejecutar el cuerpo del programa. A eso es a lo que me refiero en el mensaje anterior, es recomendable apagar (poner en 0 lógico) todos los terminales de salida antes de ejecutar el while(true).
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 06 de Marzo de 2013, 11:55:54

Citar
Anoche cambie el codigo un poco sigue siendo el de arriba pero cambiando el int8 por int16 y añadiendo antes del while (1) Apaga (LED1); y Apaga (LED2);

Eso seria lo mismo que tu me has puesto no ?

No Archangels si no que es una costumbre de programación de microcontroladores apagar todos los terminales de salida antes de empezar a ejecutar el cuerpo del programa. A eso es a lo que me refiero en el mensaje anterior, es recomendable apagar (poner en 0 lógico) todos los terminales de salida antes de ejecutar el while(true).

Ah, vale, nose x q pero pense que el tris hacia eso, luego lo lei mejor y vi q slo te lo ponia como ebtrado o salida.
Ahora mismo no estoy en casa asi que no podre probarlo, hay q trabajar jeje, en cuanto llegue, lo pruebo y te cuento, lo de puerto_b = 06 lo sacaste del datasheet o es para todos igual ?

Si no me equivoco es donde pone PORTB 06h
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Chenao en 06 de Marzo de 2013, 12:22:49
Citar
Ah, vale, nose x q pero pense que el tris hacia eso, luego lo lei mejor y vi q slo te lo ponia como ebtrado o salida.
Ahora mismo no estoy en casa asi que no podre probarlo, hay q trabajar jeje, en cuanto llegue, lo pruebo y te cuento, lo de puerto_b = 06 lo sacaste del datasheet o es para todos igual ?

Si no me equivoco es donde pone PORTB 06h

La serie 16f8xx tiene el puerto b el la dirección 06 y en efecto la información esta disponible en las respectiva hoja de datos.
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 06 de Marzo de 2013, 12:26:47
Citar
Ah, vale, nose x q pero pense que el tris hacia eso, luego lo lei mejor y vi q slo te lo ponia como ebtrado o salida.
Ahora mismo no estoy en casa asi que no podre probarlo, hay q trabajar jeje, en cuanto llegue, lo pruebo y te cuento, lo de puerto_b = 06 lo sacaste del datasheet o es para todos igual ?

Si no me equivoco es donde pone PORTB 06h

La serie 16f8xx tiene el puerto b el la dirección 06 y en efecto la información esta disponible en las respectiva hoja de datos.

Con respecto a la hoja de datos me queda un pequeña duda, por ejemplo el puertob viene en el bank 0 y en el bank 1 los cambio q haga en el 0 tambien se hacen en el 1 ? Siempre vuelvo loco con las hojas de datos
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Chenao en 06 de Marzo de 2013, 13:32:16
Citar
Con respecto a la hoja de datos me queda un pequeña duda, por ejemplo el puertob viene en el bank 0 y en el bank 1 los cambio q haga en el 0 tambien se hacen en el 1 ? Siempre vuelvo loco con las hojas de datos

Claro que si ya que es el mismo registro, creo que lo ingenieros de microchip diseñan los microcontroladores con registros repetidos en los bancos para darle mayor flexibilidad y eficiencia a la programación, cuando uno programa en lenguaje de máquina ve útil esta propiedad.
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 06 de Marzo de 2013, 21:39:43
Ya he probado poniendo el puerto B a 0, sigue pasando lo mismo, el led sigue encendido todo el rato.
Título: Re: PIC 16F876 + CCS Problema con PWM
Publicado por: Archangels en 06 de Marzo de 2013, 21:54:32
Ya he probado poniendo el puerto B a 0, sigue pasando lo mismo, el led sigue encendido todo el rato.

Vale conseguido, era porque el puesto ese estaba nada mas empezar a 1 logico, asi que he puesto tambien el puerto A a 0 y se ha arreglado todo, por ahora, me quedan 2 o 3 pruebas por hacer y os cuento. Un saludo

Edito:

Vale ya esta todo probado ( me quedaba ver si hacia bien lo de no bajar mas de 0 o que no suba mas de 100 ) y funciona perfectamente. Ahora a hacer un circuito para hacer funcionar un motor y a probar con un motor jeje.

Te iba a preguntar ya por ultimo si si hay una lista de "buenas practicas" al programar, por ejemplo lo que tu me dijiste de poner el puerto a 0, o si eso se va aprendiendo con el tiempo jeje ( no llevo en esto ni un mes )