TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: pumasmorelos en 11 de Diciembre de 2014, 19:23:47

Título: FUNCIONES DENTRO DEL TIMER1 DEL PIC
Publicado por: pumasmorelos en 11 de Diciembre de 2014, 19:23:47
Hola! estoy tratando de hacer un programa con un microcontrolador pic 18f4550 el consta del uso del timer1.
Mi programa deberia hacer lo siguiente : El timer cada 10ms debe realizar lo que contiene la funcion ""int ope(void)"" que en este caso si detecta un pulso por el pin a1 el pulso va a ser igual a 1 entonces este valor es el que regresa la funcion para despues llmar la funcion dentro del timer y asi mismo se accione un pwm. la idea es utilizar funciones dentro del timer o mandarlas llamar dentro den timer y que hagan su tarea determinada como en el caso de mi programa. El problema esque no hace nada mi programa.

Espero me puedan ayudar! gracias

#include <18f4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay (clock = 20000000)


#INT_TIMER1

int ope(void)
{
    int pulso=0;
    if(input(pin_a1)==1)
    {
     pulso=pulso+1;
     return(pulso);
    }
 
}

void timer1(void)
{   
   int recibir;
   recibir=ope();
   if(recibir>0)
   {
    set_pwm1_duty(100);
   }
   set_timer1(53036);
 
}


void main()
{
  //*****CONFIGURACION DE PUERTOS*****
  set_tris_a(0b111111);
  set_tris_c(0);
 
 setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
 set_timer1(53036);
 enable_interrupts(INT_TIMER1);
 enable_interrupts(global);
 
  //MODULO PWM
  output_LOW(PIN_C1);
  setup_ccp1(CCP_PWM);
  setup_timer_2(t2_div_by_16,255,1);
 
 while(true)
 {

 }

}
Título: Re: FUNCIONES DENTRO DEL TIMER1 DEL PIC
Publicado por: KILLERJC en 11 de Diciembre de 2014, 20:23:29
int ope(void)
{
    int pulso=0;
    if(input(pin_a1)==1)
    {
     pulso=pulso+1;
     return(pulso);
    }
  
}

Cada ves que entre a esa funcion pulso va a ser igual a 0, asi que tu funcion seria equivalente a algo asi, suponiendo que termine la funcion y no exista valor de retorno este devuelva un 0 (por que no tenes un return si falla la condicion del if ) aunque lo mas seguro es que devuelva el valor que tiene el registro W en ese momento, en fin si se cumple lo ideal o que pienso que quisiste hacer quedaria algo asi :

Código: [Seleccionar]
int ope() {
if(input(pin_a1)==1)
{
return(1);
}
return(0);
}

Ahora tampoco tendria sentido hacer esto. Por que basicamente te va a dar 1 si pin_a1 es igual a 1, o 0 si el pin esta a 0, y directamente estarias leyendo el valor del pin. Donde quedaria tu funcion ( recibir=pin_a1; ) y para que usar otra variable, quedando :

Código: [Seleccionar]
void timer1(void)
{  
   if(input(pin_a1))
   {
    set_pwm1_duty(100);
   }
   set_timer1(53036);
}

Ahora suponiendo que el duty comienza en 0 ( supongo nuevamente por que no lo definiste en tu configuracion inicial) al momento de tocar el boton el registro del duty se cargaria con 100 y quedaria ahi para siempre ( ya que en ningun momento lo pones a 0 u otro valor de nuevo. Es esto lo que querias hacer ?

Pregunto por que no logre entender como querias que funcionara, pero si deberias poder llamar a una funcion dentro del timer, incluso podrias prender un led para que veas que entra a esa funcion, y luego si meterse a programar con PWM.
Si tu idea es detectar el boton, podrias haber utilizado una interrupcion por cambio del portB, o una interrupcion externa donde podes definir los flancos y no solo por nivel. Y no usabas el timer para eso (me refiero a lo de utilizar el timer cada 10ms donde alguien que presione el boton generalmente lo tiene mucho mas tiempo y entraria varias veces). Si quisieras contar pulsos podrias usar el timer para el eso.

Son correctos los valores del PWM? no los comprobe.
Título: Re: FUNCIONES DENTRO DEL TIMER1 DEL PIC
Publicado por: pumasmorelos en 11 de Diciembre de 2014, 21:23:40
Que tal ! GRACIAS POR RESPONDER!

La idea es llamar una funcion dentro del timer1  de esta manera:

recibir=ope();

para que deacuerdo al valor q reciba de la funcion realice las operaciones que yo le indique.
pero lo que nose si es la forma correcta de llamarla???
Título: Re: FUNCIONES DENTRO DEL TIMER1 DEL PIC
Publicado por: KILLERJC en 11 de Diciembre de 2014, 21:44:44
Es correcta, pero no creo que veas mucha diferencia, solo la primera ves que presionas el boton, luego por mas que presiones no vas a poder ver un cambio.

Ademas debes definir un valor para cuando la condicion del if no se cumple. Por ejemplo como el cambio que hago aca:
Código: [Seleccionar]
int ope(void)
{
    int pulso=0;
    if(input(pin_a1)==1)
    {
     pulso=pulso+1;
    }
  return(pulso);  // Esto en caso que no se presione el boton, algo tiene que devolver por como definiste la funcion, para no repetirla lo saque afuera
}

De esta forma siempre retorna un valor (sino fijate en un tu codigo cuando no entra en el if), si no esta presionado pulso va a valer 0 y si se presiona pulso va a valer 1.

Yo decia que podrias cambiar el estado de una salida en ves de manejar un PWM. Y visualizarlo en un led, si presionas el boton deberia prenderse el led y cuando lo soltes apagarse.

Código: [Seleccionar]
void timer1(void)
{  
   int recibir;
   recibir=ope();
   if(recibir>0)
   {
    output_high(pin_c1);
   }
   else
  {
    output_low(pin_c1);
   }
   set_timer1(53036);
}

Si ya con un LED funciona significa que tu programa se ejecuta correctamente, y ahi podes agregarle el PWM.
Quiero decir con esto, hace funcionar primero eso y luego te metes con lo otro, asi sabes al menos que esa parte esta bien, y que no sea algo del PWM o el timer2 que este ocasionando que tu codigo no funcione como quieras.