Autor Tema: Interacción módulos CCP.  (Leído 1207 veces)

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

Desconectado Sesag

  • PIC10
  • *
  • Mensajes: 5
Interacción módulos CCP.
« en: 21 de Mayo de 2013, 16:39:26 »
Buenas,
me ha surgido la siguiente duda.
Quiero controlar 2 servos con PWM a la vez con un solo PIC, utilizando los 2 módulos CCP del 18F4550 en modo comparador (necesario para los 50 Hz).

He leído en todas partes que la interacción de ambos módulos en modo comparación debe ser:

-Los comparadores deben ser configurados en el modo de disparo especial que pone a 0 el TMR1.

http://ww1.microchip.com/downloads/en/appnotes/00594b.pdf
Después leí detenidamente este PDF de la web de microchip, donde hay un ejemplo en asm(que apenas entiendo), pero me parece entender según lo que hay puesto, que de los 2 modulos CCP, que el que tenga el periodo mas pequeño, va a reiniciar el TMR1, y el del periodo mas grande, nunca va a llegar a dispararse.

Al no entender la situación, no ver ningun ejemplo por la red, y haciendo caso omiso a la configuracion de las interacciones, he programado esto, que en Proteus funciona.
No hace falta ser un genio para imaginarse que cuando lo implemente en el PIC no funcionara, si me he informado bien de como funcionan las interacciones, pero os lo dejo por si acaso:
Código: [Seleccionar]
// Interrupció de senyal PWM per comparació del Timer 1
#int_ccp1
void ccp1_int(){          //Función de interrupción

  if(++canvi==1)
  {
   setup_ccp1(CCP_COMPARE_CLR_ON_MATCH); //Modo Comparación, cambio a 0
   set_timer1(0);                          //Borrado de TMR1
   CCP_1 = PWM_altura;
  }
  else
  {
    setup_ccp1(CCP_COMPARE_SET_ON_MATCH); //Modo Comparación, cambio a 1
    CCP_1 = 19999;
  }

}

#int_ccp2
void ccp2_int(){          //Función de interrupción
  if(++canvi2==1)
  {
   setup_ccp2(CCP_COMPARE_CLR_ON_MATCH); //Modo Comparación, cambio a 0
   //set_timer1(0);                          //Borrado de TMR1
   CCP_2 = PWM_azimut;
  }
  else
  {
    setup_ccp2(CCP_COMPARE_SET_ON_MATCH); //Modo Comparación, cambio a 1
    CCP_2 = 19999;
  }

}

Esto es: tengo 2 variables que me dicen el DC de cada señal PWM, y puesta a cero del TMR1 cuando se llegue a 19999 (20 ms tal y como lo tengo configurado). En la simulacion va bien.

hay alguien que haya tratado con el mismo problema?
deberé ingeniarmelas de algun modo con el modo de disparo especial?

Cualquier ejemplo, corrección o comentario me ayudaria muchísimo.
Gracias.