Autor Tema: Problemas con modulo ccp  (Leído 1524 veces)

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

Desconectado zira

  • PIC10
  • *
  • Mensajes: 6
Problemas con modulo ccp
« en: 26 de Mayo de 2008, 05:02:31 »
Hola amigos de todopic, he aprendido mucho en este foro y en este momento me encuentro realizando una practica con modulos ccp y timer, pero no he logrado mi objetivo por lo cual me dirigo a uds para ver si es posible que me puedan ayudar.
Trabajo con una 16f873a, con un oscilador de 4Mhz y la programacion la realizo en lenguaje c.
Por un pin debe entrar un tren de pulsos, el mismo periodo de este tren de pulsos debe salir por otro pin pero con un ancho de pulso diferente, dependiendo de lo q se lea a la entrada del pin ra0, donde tengo conectado un switch. Si ra0 = 0 el duty es 50 y 50 y si es 1 entonces el duty es 10(alto) y 90 (bajo). Bueno lo que hago es capturar por el ccp2(pin rc1) la señal q entra en ese pin cuando esta en alto y cuando esta en bajo, y los valores los guardo en el timer1. Luego esos valores los sumo y tendria el periodo de la señal. Ese periodo lo calculo en us y calculo el pr2, para luego cargarlo en el timer2 y usar el ccp1(pin de salida rc2) en modo pwm, y luego pregunto por el estado del switch y dependiendo calculo el duty o ancho del pulso.
El problema que al implementarlo me da cualquier cosa, estoy usando un generador de señales que lo conecto al pin del ccp2 para q lea la señal, pero aunque este no lo tenga conectado igual al salida tengo "algo". No se si tendre algun error de conceptos, pq la verdad he sido autodidacta en esto de los modulos ccp y todo lo q he hecho lo he aprendido aca.
Este es mi codigo:



#include <16f873a.h>
#use delay (clock=4000000)
#use standard_io(b)
#byte puerto_a=0x05


int   flanco=0;
int   t,t1,t2,d1;
int   periodo,flag;


#int_ccp2
void ccp2_int()
{
  if(flanco==0)
  {                                             // Ha recibido Flanco de Subida?
    t1=get_timer1();                            // Guardo en t1 el valor de TMR1 al Flanco de Subida
    setup_ccp2(CCP_CAPTURE_FE);                 // Configuro para capturar siguiente flanco de Bajada
    flanco=1;                                   // Indico que el siguiente flanco será de Bajada
  }
  else
  {                                             // He recibido Flanco de Bajada
    t2=get_timer1();                            // Guardo en t2 el valor de TMR1 al Flanco de Bajada
    setup_ccp2(CCP_CAPTURE_RE);                 // Configuro para capturar siguiente flanco de subida
    flanco=0;                                   // Indico que el siguiente flanco será de Subida
    set_timer1(0);                              // Reinicio TMR1

    if(flag==0){                                // Si los datos anteriores han sido procesados ...
      flag=1;                                   // Indico que ya hay nuevos datos de flancos para calcular
    }
  }
}


///PROGRAMA PRINCIPAL  ///

 void main()
 {

      set_tris_a(0xff);
      setup_timer_1(t1_internal|t1_div_by_4);
      setup_ccp2(CCP_CAPTURE_RE);               // Configuro captura de 1er flanco de subida
      flanco = 0;                               // inicializo el Flag para cambiar de flanco
      enable_interrupts(int_ccp2);
      enable_interrupts(global);


    if(flag=1)

      {
         t=t1+t2;                            // Obtengo el periodo de la señal
         t=t*4;                              // lo transformo a us           
         periodo=(((t*4000000)/16)-1);       // calculo el periodo(pr2) con un oscilador de 4Mhz, preescaler de 4
                                             // y postcaler de 4

         setup_timer_2(T2_DIV_BY_4, periodo, 4);
         setup_ccp1(CCP_PWM);

         

         if(!input(pin_a0))             ////50 y 50

         {
            d1=periodo*0.5;
            set_pwm1_duty(d1);
         }

         else                         
         {
            d1=periodo*0.1;            //// 10 y 90
            set_pwm1_duty(d1);
         }

         flag=0;
      }

 }



de antemano muchas gracias

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con modulo ccp
« Respuesta #1 en: 26 de Mayo de 2008, 16:10:47 »
Saludos zira!
Bueno te felicito por esforzarte en hacer las cosas tú mismo y aprender leyendo...eso es excelente.
Tu mensaje creo que deberíamos colocarlo en alguna parte como ejemplo de lo que debe ser un mensaje pidiendo ayuda.
   1- Describes muy bién qué es lo que necesitas hacer (Hay otros foreros que casi no explican y uno tiene que meterse a adivino  :D ).
   2- Incluyes código que ya has hecho tu solito, o sea, primero te esforzaste, luego pediste ayuda (otros quieren que les resuelvan todo el problema  :? )
Bueno ahora si, yendonos a lo que nos ocupa, percibo varios errores en tu código, te diré los que noté a simple vista, ya alguien te dirá otros:

- El más grave creo, es que no tienes ningún while(TRUE) o sea que no se va a ejecutar el código indefinidamente como debe ser.
- Tienes todas las variables declaradas como int, cuando a veces necesitas int16 (por ejemplo período, que no más por ahí vi un 4000) o float (como d1, pues estás guardando el resultado de multiplicar por 0.5 y 0.1; yo te recomendaria que guardaras el resultado en una variable float, por ejemplo d1_float, y luego hicieras casting y convirtieras d1_float nuevamente en entero, guardándolo en d1, para hacer el set_pwm1_duty(d1), si no sabes como hacer el casting busca en el foro, hay bastante información de eso).

Ahora bien, la pregunta obligada es: has tratado de simularlo en proteus? Trata simulándolo y ves qué tal... corrígele esos errores y algún otro que te des cuenta o que otro te haya dicho....
Veo tu código bastante lógico y limpio, aunque no lo he detallado completamente... te felicito!  :-/

Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado zira

  • PIC10
  • *
  • Mensajes: 6
Re: Problemas con modulo ccp
« Respuesta #2 en: 27 de Mayo de 2008, 03:31:16 »
Gracias por responder, corregire esos detalles q me dices.......
Y si lo probe en proteus y da cualquier cosa...
Vale, muchas gracias  :lol: