TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Kamus23 en 15 de Diciembre de 2009, 12:20:07
-
ante que todo feliz dia y feliz fiestas de navidades.. tiempo hace que no paso por aqui.... les comento tengo una duda que me esta volviendo loco con los timer y PicC
estoy desarrollando un programilla para un 16f877a en el cual uso necesito obtener el tiempo de dos determinado evento, en el pin d1 tengo colocado un pulsador y el d0 el suiche de encendido y en el portb la LCD,
aja el funcionamiento seria algo asi... cuando el usuario pas el suiche de encendido... activo el timer para ver cuanto tarda el usuario en presionar el pulsador en d1, luego borro el timer y lo activo de nuevo y capturo el segundo tiempo que tarda en presionar nuevamente el boton, y estos datos seran arrojados en la lcd,
el problema es que cando activo el timer para el primer evento en el segundo no se como activarlo de nuevo... pues me da error o me coloca en cero mi variable (estoy usando float)
set_tris_d(0xff);
setup_timer_0 (RTCC_DIV_2|RTCC_INTERNAL); //activamos el timer0
for ( ; !input(sensor); ); // Espero el inicio del pulso del eco (flanco de subida)
set_timer0(0); // Cuando llegue pon a cero el Timer0
for ( ; input(sensor); ); // Espero al final del pulso del eco (flanco de bajada)
tiempo1 = get_timer0(); // capturo el primer intervalo de tiempo
setup_timer_0 (RTCC_DIV_2|RTCC_INTERNAL); //activamos el timer0
for ( ; !input(sensor);); // Espero el inicio del pulso del eco (flanco de subida)
set_timer0(0); // Cuando llegue pon a cero el Timer0
for ( ; input(sensor); ); // Espero al final del pulso del eco (flanco de bajada)
tiempo2 = get_timer0(); // capturo el primer intervalo de tiempo
luego muestro en la LCD. me podrian guiar en esto del timer...?? uso un xtal de 4Mhz y prescaler de 1:1 entonce cada incremento del timer duraria 1us
-
creo que seria mejor que implementes la interrupcion por desbordamiento del timer y ponerlo a desbordarse cada 50 o 100mS, cada que ocurra una interrupcion incrementas una variable.
ahora con esta directiva
setup_timer_0 (RTCC_DIV_2|RTCC_INTERNAL); //activamos el timer0
no activas el timer0, con esa directiva solo se configura el reloj y el prescaler
saludos
-
y con cual instruccion activo el timer0??
me gusta la idea del desbordamiento
-
el timer0 siempre estará incrementandose una vez lo configures, la forma de "iniciar" el timer es asignandole un valor set_timer0(n);; por otro lado habría que calcular si alcanza el tiempo suficiente para el segundo evento, ¿cuanto tiempo se espera que el usuario presione d1? ¿1 minuto? ¿1 hora?
-
Como bien dicen, el timer esta incrementando todo el tiempo desde q lo configuras. Pero podes activar o desactivar la interrupcion con las siguientes instrucciones:
enable_interrupts(int_rtcc);
enable_interrupts(global);
disable_interrupts(int_rtcc);
saludos!
-
ok ya voy comprendiendo mas...
el tiempo que duraria no pasaria de 1 o 2 segundo maximo.. pues a futuro pienso implementarlo para un sensor de proximidad con un ultrasonido (sesor ping) es por eso que estoy tratando de resolver mi duda con el timer0 jejeje
gracias... seguire indagando y cualquier duda la posteare...
-
listo ya solvente la duda... y aqui les dejo mi pequeña implementacion...
Un medidor de velocidad (velocidad media) usando un sensor parallax ultrasonido de 3 pines con un 16f877a y una LCD cualquier aporte para mejorarlo lo agradeceria mucho...
//_________________________________________________________________________________ //
// programa que permite medir la velocidad media de un objeto utilizando un sensor //
// por ultrasonido, el cual lo que hace es tomar dos mediciones de distancia y //
// tiempo para calcular la velocidad media a la cual el objeto se esta moviendo //
// y mostramos los datos en una LCD... //
// //
// se utilizo un PIC 16F877A ya que es el que se tenia disponible y una lcd de 16*2 //
// version 1.1 posiblemente se reestrucure el codigo fuente para un mejor desempeño //
// y funcionamiento //
// //
//________________________________kamus23 toDoPic.com.Ar ___________________________//
#include <16F877A.h>
#use delay(clock=4000000)
#fuses NOCPD,NOWDT,BROWNOUT,PUT,XT,NOWRT,NOLVP,NODEBUG,NOPROTECT //0x3F71
#define use_portb_lcd TRUE //selecciono puerto b para el LCD
#include <lcd.c>
#define sw1 PIN_D0 //definimos el PIN_D0 para el activador
#define sensor PIN_D1 //definicmos el PIN_D1 para el sensor ultrasonido
float tiempo1, tiempo2, distancia1, distancia2, velocidadmedia; // variables a utilizar
void main(){
lcd_init(); //inicializa la LCD
port_b_pullups(true); //activanmos pull ups
enable_interrupts(global); //activamos las interrupciones
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); //prescaler 1:1 cada incremento= 1ms
delay_ms(1000);
//__________________________Inicio del programa principal____________________//
inicio:
set_tris_d(0x1); //configuramos el trisd
output_low(sensor); //garantizamos un nivel bajo en el sensor
delay_ms(100);
if (input(sw1)){ //si pulsador activo entonces medimos velocidad
lcd_putc("\fencendido\n");
delay_ms(1000);
//_____________________________primera Medicion________________________________//
output_low(sensor); // nivel bajo en sensor
delay_ms(10); //retardo mietras se prepara
output_high(sensor); // activamos el sensor
delay_ms(10); // retardo mientras se envia el pulso de ultrasonido
set_tris_d(0xff); //cambiamos el trisd ahora como entrada
for ( ; !input(sensor); ); // Espero el inicio del pulso del eco (flanco de subida)
set_timer1(0); // Cuando llegue pon a cero el Timer1
for ( ; input(sensor); ); // Espero al final del pulso del eco (flanco de bajada)
tiempo1 = get_timer1(); // capturo el primer intervalo de tiempo
distancia1= tiempo1/58; //calculo la distancia1 del objeto
delay_ms(1000); // retardo opcional solo para ver la variacion de distancia
//_____________________________segunda medicion________________________________//
set_tris_d(0x1); // se reconfigura nuevamente el trisd
output_low(sensor); // se garantiza un nivel bajo
delay_ms(10); // retardo mientras se prepara
output_high(sensor); // se activa el sensor
delay_ms(10); // retardo mientras se envia el pulso
set_tris_d(0xff); // ahora configuramos en pin como entrada
for ( ; !input(sensor); ); // Espero el inicio del pulso del eco (flanco de subida)
set_timer1(0); // Cuando llegue pon a cero el Timer1
for ( ; input(sensor); ); // Espero al final del pulso del eco (flanco de bajada)
tiempo2 = get_timer1(); // capturo el primer intervalo de tiempo
distancia2= tiempo2/58; //calculo la distancia2 del objeto
delay_ms(50);
//______________________________________________________________________________//
// ahora con las variaciones de distancia y tiempo se calcula la velocidad media//
//________ velocidadmedia= (distancia2-distancia1)/(tiempo2-tiempo1) ___________//
//______________________________________________________________________________//
tiempo1=tiempo1/1000000; //llevamos tiempo1 a segundos
tiempo2=tiempo2/1000000 ;//llevamos tiempo2 a segundos
distancia1= distancia1/100 ;//llevamos distancia1 a metros
distancia2=distancia2/100 ;//llevamos distancia2 a metros
velocidadmedia=(distancia2-distancia1)/(tiempo2-tiempo1);//unidades metros/segundos
//__________________mostramos los datos en la LCD________________________________//
lcd_gotoxy(1,1);
printf(lcd_putc," %f m",distancia1);
lcd_gotoxy(1,2);
printf(lcd_putc," %f m",distancia2);
delay_ms(5000);
lcd_gotoxy(1,1);
printf(lcd_putc," %f seg",tiempo1);
lcd_gotoxy(1,2);
printf(lcd_putc," %f seg",tiempo2);
delay_ms(5000);
lcd_gotoxy(1,1);
lcd_putc("\fVelocidad Media\n");
lcd_gotoxy(1,2);
printf(lcd_putc," %f m/seg",velocidadmedia);
delay_ms(5000);
goto inicio; // nos devolvemos al inicio
//_____________________________________________________________________________//
}
else { // si el pulsador es cero
set_tris_d(0x1); // garantizamos que el pin este como salida del sensor
output_low(sensor); // dejamos un nivel bajo por seguridad
lcd_putc("\fapagado\n"); // mostramos mensaje en la LCD
delay_us(10); // delay
goto inicio;
}
}