Check the new version here

Popular channels

Cronometro con PIC

Programa para cronometro con PIC, utiliza dos timers del pic, es para un compañero tambien de este sitio web, lo comparto en este post para ver si le puede servir a mas personas, y ademas, puedan ayudar a mejorar el programa


Esta en lenguaje C para PIC C compiler

#INCLUDE <18F4550.h>
#fuses INTRC_IO,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN
#use delay(clock=4000000)
#include

int st1=0,mt1=0,st2=0,mt2=0; //variables globales segundos y minutos
int clear1=0, clear2=0; //variables goblales clear

/*donde
st1=segundo tiempo 1
mt1=minuto tiempo 1
st2=segundo tiempo 2
mt2=minuto tiempo 2
*/

#int_TIMER1 //interrupcion timer1
void TIMER1(void) //funcion que se ejecutara al desbordar timer1
{
set_timer1(500); // se vuelve a cargar valor de timer1
st1++; //acumula 1 seg

if(st1>=60) //si son 60 se acumula un minuto
{
st1=0;//segundos son 0 otra vez
mt1++;//minuto
clear1=1;//para limpiar pantalla de lcd
}
}

#int_TIMER3 //interrupcion timer3
void TIMER3(void) //funcion que se ejecutara al desbordar timer3
{
set_timer3(500); // se vuelve a cargar valor de timer3
st2++; //acumula 1 seg

//lo siguiente es similar a timer1
if(st2>=60)
{
st2=0;
mt2++;
clear2=1;
}
}


void main()
{
int t1,t2; //variables de apoyo para activar y desactivar timers, se veran mas abajo

set_tris_a(0xff); //fijar puerto A como entradas


//para saber mas sobre esto ver tutorial anteriormente creado en Taringa
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); //configura timer1 interno con division de 8
setup_timer_3(T3_INTERNAL|T3_DIV_BY_8); //configura timer1 interno con division de 8

enable_interrupts(GLOBAL); //interrupciones globlales (en todo el programa y cualquier momento de ejecucion)

/*los valores de set_timerx(yyy) (1 y 3) son al azar, (en este caso)
se requiere realizar un calculo para que se desborde cada segundo.
Cada desbordamiento de timer acumulara un segundo en su respectiva funcion,
por lo tanto debemos hacer un calculo para que desborde obviamente
cada segundo, esto se ve en un tutorial que publique antes*/

set_timer1(500); //se le carga el valor al timer1
set_timer3(500); //se le carga el valor al timer3

lcd_init(); //inicializa LCD

printf(lcd_putc,"fCRONOMETROnPRUEBA 1"); //mensaje
delay_ms(1000);

printf(lcd_putc,"fTIEMPO 1 0:0nTIEMPO 2 0:0");
delay_ms(2000);

printf(lcd_putc,"f"); //limpia pantalla

while(true)
{

if(clear1==1||clear2==1) //para limpiar pantalla cada minuto de cronometro
{
printf(lcd_putc,"f");
clear1=0;
clear2=0;
}

lcd_gotoxy(1,1); //ir a posicion x,y
/*imprime el tiempo transcurrido
%i indica que se imprimira un numero entero en la lcd
para saber que numero se va a imprimir se pones al final de
las comillas " una coma y el nombre de la variable entera a imprimir
si se ponen mas se debe poner el orden de las variables a imprimir
ejemplo:

int x=1;

printf(lcd_putc,"el valor de x es:%i",x);

*/
printf(lcd_putc,"TIEMPO 1 %i:%inTIEMPO 2 %i:%i",mt1,st1,mt2,st2);


if(input(pin_a0)) //boton de control de cronometro 1
{
delay_ms(300); //retardo para esperar a que se suelte el boton
if(t1==1) //si t1 ya tenia el valor de 1 se vuelve 0
t1=0;
else //en caso contrario sera 1
t1=1;

if(t1==1) //si t1 ya valia 1 activa el timer1
enable_interrupts(INT_TIMER1);
else //si ya es 0 se detiene
disable_interrupts(INT_TIMER1);

//esto le da doble utilidad al boton (de inicio y paro) gracias a la variable auxiliar t1
}

//todo lo del pin A1 es similar al anterior pero para el timer3
if(input(pin_a1))
{
delay_ms(300);
if(t2==1)
t2=0;
else
t2=1;

if(t2==1)
enable_interrupts(INT_TIMER3);
else
disable_interrupts(INT_TIMER3);
}

} //aqui termina while(true)

} //aqui termina void main()


aqui el video



link: https://www.youtube.com/watch?v=_myiyegvRU8&feature=youtu.be


Espero que les sirva. Saludos
+1
0
0
1
0No comments yet