TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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)
{
}
}
-
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 :
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 :
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.
-
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???
-
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:
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.
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.