Autor Tema: Isis interrumpe PWM cuando uso SET_PWMX_DUTY  (Leído 7610 veces)

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

Desconectado Braulio

  • PIC12
  • **
  • Mensajes: 52
Isis interrumpe PWM cuando uso SET_PWMX_DUTY
« en: 22 de Noviembre de 2009, 20:28:05 »
Hola amigos de Todopic:

Esta vez les traigo un problema que creo yo que se trata del simulador Isis de Proteus, pues al implementarlo físicamente no se da.
Se trata de un circuito de prueba del modulo PWM del PIC16F877A. Lo único que hace es controlar cada salida PWM de 4KHz agrandando o achicando el ciclo de trabajo (duty cycle) al presionar uno de los 2 pulsadores respectivo; esto para cada uno de los módulos (por lo que hay en total 4 pulsadores). Ambos módulos varían en el rango de 0 a 1000 cuartos de microsegundo (0.25 us).
El programa en C para CCS es bastante simple: con el Temporizador 1 hago que el PIC lea el estado de los pulsadores 3 veces por segundo y según esto incrementa o decrementa en 10 el tamaño del ciclo de trabajo.
El problema es que el PWM se desactiva cuando utilizo la instrucción SET_PWMX_DUTY para actualizar el nuevo ancho de pulso; pude darme cuenta de que ese era el momento en que el PWM dejaba de trabajar poniendo una señal (invirtiendo el pin PC0) luego de dicha instrucción, como podrán ver en la captura de la simulación:



Luego probando, no importaba en que lugar del programa ponía la instrucción SET_PWMX_DUTY, siempre al ser ejecutada se desactivaba el PWM.
He observado el código des-ensamblado que genera el CCS para dicha instrucción y no le encuentro nada extraño.
Luego, recuerdo que esto me pasaba con la versión 7.5 SP3 y al actualizar a 7.6 el problema desapareció... pero luego de unos días que volví a abrir el archivo el problema estaba ahi de nuevo y asi sigue hasta ahora.
Al implementar el circuito físicamente y aplicando e PWM a motores atravez de un puente H, tengo otro tipos de problemas pero no este.
Ojala alguien pueda ayudarme. Adjunto aquí todo mi archivo con la simulación y el programa en C. también les dejo aquí el código para que puedan leerlo directamente

Código: [Seleccionar]
#include <16F877A.h>
#fuses XT,NOWDT
#use delay(clock=4000000)

#byte intcon=0x0b
#byte pir1=0x0c
#byte pir2=0x0d
#byte pie1=0x8c
#byte pie2=0x8d
#byte trisc=0x87
#byte tmr2=0x11
#byte pr2=0x092
#byte t2con=0x12
#byte ccpr1l=0x15
#byte ccpr1h=0x16
#byte ccp1con=0x17
#byte ccpr2l=0x1b
#byte ccpr2h=0x1c
#byte ccp2con=0x1d
#bit  PC_0=0x07.0

#byte t1con=0x10
#byte PB=0x06
#byte trisb=0x86

signed int16 val_pwm1=500;
signed int16 val_pwm2=750;
int mando=0;  


#int_timer1
void temp1s(void)
   {
   mando=PB;
   if(bit_test(mando,0)==0)
      val_pwm1=val_pwm1+10;
   if(bit_test(mando,2)==0)
      val_pwm1=val_pwm1-10;
   if(bit_test(mando,4)==0)
      val_pwm2=val_pwm2+10;
   if(bit_test(mando,6)==0)
      val_pwm2=val_pwm2-10;
  
   if(val_pwm1>1000) val_pwm1=1000;
   else
      {
      if(val_pwm1<0) val_pwm1=0;
      }
      
   if(val_pwm2>1000) val_pwm2=1000;
   else
      {
      if(val_pwm2<0) val_pwm2=0;
      }
   set_pwm1_duty(val_pwm1);
   set_pwm2_duty(val_pwm2);
   PC_0=~PC_0;
   }

void main(void)
   {
   trisb=0b11111111;
   t1con=0b00100001;
   intcon=0b11000000;
   pie1=0b00000001;     //habilita interrupcion timer1
   pie2=0b00000000;
   trisc=0b11111000;
   ccp2con=0b00001100;    //CCP2 en modo PWM
   ccp1con=0b00001100;    //CCP1 en modo PWM
   pr2=249;             //con pre-escala 1:1, 250us => 4KHz
   t2con=0b00000100;    //pre-escala 1:1 ; post-escala no se usa (1:1)

   while(1)
      {
      }
   }

PD: Estube leyendo en el foro y encontré ejemplos similares a lo que yo hice... como este de Nocturno. Lo descargué y el funcionó sin problemas.


« Última modificación: 22 de Noviembre de 2009, 20:47:10 por Braulio »

Desconectado Braulio

  • PIC12
  • **
  • Mensajes: 52
Re: Isis interrumpe PWM cuando uso SET_PWMX_DUTY
« Respuesta #1 en: 29 de Noviembre de 2009, 15:36:44 »
He des-instalado y re-instalado Proteus 7.6 SP0 y el problema nuevamente ha desaparecido... espero que no vuelva a aparecer... pero la razón francamente la desconozco.

Desconectado Braulio

  • PIC12
  • **
  • Mensajes: 52
Re: Isis interrumpe PWM cuando uso SET_PWMX_DUTY
« Respuesta #2 en: 23 de Noviembre de 2011, 03:08:17 »
No se que pasó con la imagen. Este era el Ckto:

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Isis interrumpe PWM cuando uso SET_PWMX_DUTY
« Respuesta #3 en: 23 de Noviembre de 2011, 10:38:07 »
hola, para versiones ateriores de proteus habia que hacer 0 el timer2 despues de cambiar el ciclo de trabajo incluso en asm, ya que si no proteus no lo simulaba. intenta poner set_timer2(0) despues del duty
"Nada es imposible, no si puedes imaginarlo"

Desconectado Braulio

  • PIC12
  • **
  • Mensajes: 52
Re: Isis interrumpe PWM cuando uso SET_PWMX_DUTY
« Respuesta #4 en: 16 de Enero de 2012, 14:42:25 »
Mucha gracias RIVALE... rebuscaré mi circuito para probar lo que me dices. Luego aviso como me fue. Salu2

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Isis interrumpe PWM cuando uso SET_PWMX_DUTY
« Respuesta #5 en: 16 de Enero de 2012, 14:48:07 »
Se me olvido comentar que eso era solo para la simulacion, si tienes el circuito armado en fisico no necesitas borrar el timer0
"Nada es imposible, no si puedes imaginarlo"


 

anything