Autor Tema: nueva duda con timer0  (Leído 2500 veces)

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

Desconectado Kamus23

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 63
nueva duda con timer0
« 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)

Código: [Seleccionar]
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
Kamus de Acuario

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: nueva duda con timer0
« Respuesta #1 en: 15 de Diciembre de 2009, 14:32:35 »
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
Citar
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
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Kamus23

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 63
Re: nueva duda con timer0
« Respuesta #2 en: 17 de Diciembre de 2009, 10:37:59 »
y con cual instruccion activo el timer0??
me gusta la idea del desbordamiento
Kamus de Acuario

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: nueva duda con timer0
« Respuesta #3 en: 17 de Diciembre de 2009, 10:49:49 »
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?

 
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: nueva duda con timer0
« Respuesta #4 en: 17 de Diciembre de 2009, 11:37:43 »
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!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Kamus23

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 63
Re: nueva duda con timer0
« Respuesta #5 en: 20 de Diciembre de 2009, 16:25:16 »
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...
Kamus de Acuario

Desconectado Kamus23

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 63
Re: nueva duda con timer0
« Respuesta #6 en: 21 de Diciembre de 2009, 15:40:11 »
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...

Código: [Seleccionar]
//_________________________________________________________________________________ //
// 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;
}
}
Kamus de Acuario


 

anything