Autor Tema: Ayuda con los pulsos  (Leído 7082 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado mikepvr

  • PIC10
  • *
  • Mensajes: 13
Ayuda con los pulsos
« en: 20 de Diciembre de 2009, 06:49:12 »
Hola amigos, necesito un aventoncito porque ya me hice bolas aqui :(, lo que quiero es contar los estados bajos que arroja un reed switch, pero lo hace extremadamente rapido es decir, aprox 20 bajas por segundo, y quiero saber cuantas bajas son en un miinuto... por lo que me lleva  a la idea de que cada baja que se detecte por RB0 por flanco descendente haga una interrupcion y la almacene en una variable global "X" y asi sucesivamente durante el minuto, y cuando llegue al minuto hacer otra interrupcion para leer la variable "x" y mostrarla en Hyperterminal los pulsos (estados bajos ) que dio el reed switch..

Aqui dejo algo de codigo :S


long int x=0;
#bit RB0=0x6.0
#int_EXT
#int_TIMER0
void EXT_isr(void){
x++;
set_timer0(60)
{
    if(set_timer0>61)
      {
         get_ext(x);
      }
}
void main(){
RB0=0;
set_tris_b=(0xFF);

set_timer0(60)

ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);
globalenable_interrupts(INT_EXT);
while(true);
}
}

Al parecer esta mal la estrcutura del codigo, pero no he encontrado ejemplos de almacenar el resultado de pulsos :S  alguien tiene otro metodo, porfavor una ayudita.

Desconectado JOJOJORGE5

  • PIC16
  • ***
  • Mensajes: 167
Re: Ayuda con los pulsos
« Respuesta #1 en: 20 de Diciembre de 2009, 10:10:18 »
hola

y porque no cuentas los pulsos con un timer que tenga entrada de reloj externa?

yo tuve que hacer algo parecido y lo solucione de esa manera

salu2:)

Desconectado mikepvr

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con los pulsos
« Respuesta #2 en: 20 de Diciembre de 2009, 16:47:08 »
a que te refieres, porque el PIc18f2550 que estoy utilizando lei al respecto y tienen la opcion de trabajar con reloj externo del timer, pero la cosa es ya me hice bolas con la programacion de esta. :s

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con los pulsos
« Respuesta #3 en: 20 de Diciembre de 2009, 18:16:29 »
Lo mejor es con un timers realizar una temporización de 1 minuto, entonces los pasos a seguir serían:

  • Resetear contador de pulsos.
  • Habilitar Temporización.
  • Con interrupcion por flanco descendente aumentarias el contador de pulsos
  • Al pasar el minuto leerias el contador de pulsos y lo enviarias por RS232.



En este sector estas mezclando las cosas:
Código: C
  1. #int_EXT
  2. #int_TIMER0
  3. void EXT_isr(void){
  4. x++;

Hay que dividir en 2 interrupciones distintas:

Código: C
  1. #int_EXT
  2. void EXT_isr(void){
  3.     x++;
  4. }
  5. #int_TIMER0
  6. void TIMER_isr(void){
  7.    // Rutina para lograr un minuto, contado overflow. Mas info buscar en el Foro.
  8.    // Al pasar minuto enviamos cuenta.
  9.    putc(x);
  10. }


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado mikepvr

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con los pulsos
« Respuesta #4 en: 20 de Diciembre de 2009, 20:31:04 »
Muchas gracias Suky por la ayudita, seguire investigandole, y vaya que me surgio otra duda, como los pulsos son arriba de 1000 aprox por minuto, estuve leyendo que necesitaria utilizar el TIMER1 en ves del TIMER0, ya que el primero es de 16 bits y puede almacenar mas pulsos ya que el de 8 solo 256, esta es mi duda, o no afecta en mi caso ya que lo va ir almacenando en la variabe x. Corrijanme :)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con los pulsos
« Respuesta #5 en: 20 de Diciembre de 2009, 20:36:08 »
Pero el timer lo vas a usar para temporización, no para contar los pulsos. La variable X deberá ser de 16 bits, la cual se incrementa por interrupción externa y lleva la cuenta. No te confundas.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado JOJOJORGE5

  • PIC16
  • ***
  • Mensajes: 167
Re: Ayuda con los pulsos
« Respuesta #6 en: 20 de Diciembre de 2009, 21:07:50 »
Lo que yo sugeri es que se use un timer como contador y otro como temporizador, esto simplifica mucho si tienes el cpu ocupado en algo que no sea contar. en fin cuando llegues al 1 minuto lo unico que tendras que hacer es leer el timer que usaste como contador y ya tienes el valor que nesecitas.

salu2:)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con los pulsos
« Respuesta #7 en: 20 de Diciembre de 2009, 22:03:12 »
Es muy buena idea, no lo había leído  :mrgreen: En ese caso debes usar el timer1 para contar pulsos externos (16 bits) y otro timer para determinar el minuto.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda con los pulsos
« Respuesta #8 en: 20 de Diciembre de 2009, 22:05:58 »
Hola a todos, el pic18f2550 tiene Timer0 configurable a 8 o 16 bits y el Timer1 configurable como contador de pulsos externos, con el metodo que propone JOJOJORGES se pueden utilizar.
Pic 18f2550 a 4Mhz + Timer0 a 16 bits + preescaler a 256 + precarga de 3036 = 1000 ms.
mikepvr este metodo esta facil de usar:

Saludotes navideños  :).
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado mikepvr

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con los pulsos
« Respuesta #9 en: 20 de Diciembre de 2009, 22:10:07 »
Osea que no me recomiendas utilizar la interrupcion externa, como lo estaba haciendo?

//INTERRUPCION EXTERNA

#int_EXT
void EXT_isr(void){
   x++;

 mejor utilizo esta no?

#int TIMER1
void TIMER1_isr(void){

}

la variable x en donde queda, no la voi a ocupar o si?

Desconectado mikepvr

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con los pulsos
« Respuesta #10 en: 20 de Diciembre de 2009, 22:15:41 »
ok Kallitos, digamos que utilizo el Timer0 configurado a 16 bits para el tiempo (1 minuto) y utilizar el Timer1 tmbn a 16 bits? porque mencionas que este timer es para pulsos externos y lo que quiero es contar pulsos externos de un reed swich.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con los pulsos
« Respuesta #11 en: 20 de Diciembre de 2009, 22:18:09 »
Fíjate en el siguiente ejemplo es mas o menos lo mismo, lo único varían los tiempos y que el timer0 en el 2550 se puede usar de 16bits.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado adak

  • PIC10
  • *
  • Mensajes: 6
Re: Ayuda con los pulsos
« Respuesta #12 en: 21 de Diciembre de 2009, 00:21:38 »
Código: [Seleccionar]
#include <htc.h>
         #include <pic16f84a.h>
         __CONFIG(0x3FFB&0x3FFD&0x3F7F);
         int a,i;    /*variables int para contador ya que seran valores grandes(como dijiste aproximadamente 20 por segundo)*/
         char q,m;    /*variable 'q' para el minuto y 'm' para sensar el minuto*/
       
/*****Interrupcion del TMR0*****/
/*****                     *****/
 interrupt isr_tmr0(void)
          {
           i++;                               /*variable 'i'para milisegundos*/
             if(i>=957)
               {     
                 q++;
                 i=0;
                }
           if(m==2&&a>0)
                  {                            /*si 'm' es igual a 2 y 'a' es mayor que cero*/
                     a--;                     /*decrementar 'a'*/
                     RB7=1;                /*enviar 1 a la salida RB7*/ 
                   }
            if(a==0)
                    {
                      m=0;
                        }
         T0IF = 0;
         TMR0 = 130;
          }
         

/*****Programa principal*****/
/*****                  *****/
       main()
         {
           a=0;                        /*poner todas las variables a cero para empezar*/
           i=0;                         /*                                               */
           q=0;                        /*                                               */             
           m=0;                       /*                                               */
           for;;
           if(RB0==0)
                   {                     /*cada vez que RB0 este en nivel bajo*/           
                      a++;            /*aumentará la variable 'a'*/
                   }
           if(q==60)
                 {
                   m=2;              /*la variable 'm' avisa que ya se cumplio un minuto*/
                  q=0;                /*se reinicia el minutero*/
                 }
           RB0=0;                   /*enviar un cero a la salida RB0*/
         }
 /*********/
 /*   FIN */
 /*********/         

Probá este programita, lo termié hace unos minutos..
Sensa el pin RB0 cada un minuto y cuando detecta un nivel bajo aumenta el valor de la variable 'a', luego envia la cantidad de pulsos equivalentes al valor de la variable 'a' a la pata RB7, con una frecuencia de 1Khz :-/
« Última modificación: 21 de Diciembre de 2009, 00:35:36 por adak »

Desconectado mikepvr

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con los pulsos
« Respuesta #13 en: 21 de Diciembre de 2009, 00:52:23 »
He aqui con base al ejemplo que menciono Suky, ya se me quemo la cabeza jeje dado que soy nuevo programando PIC me enfoco mas en Programacion web, VB y Java.

Pero bueno si alguien me ayuda a pulir esto super agradecido:

#bit RB0=0x6.0
#use standard_io(B)

//CONTADOR EXTERNO POR TIMER0

#int_TIMER0  ----------------- AQUI DEBE CONTAR LOS PULSOS
void TIMER0_isr(void)
{
   Overflow++;
}

//TEMPO POR TIMER1 -----------AQUI PASA EL MINUTO Y LEE LOS PULSOS DE TIMER0.

#int_TIMER1
void TIMER01_isr(void)
{
  if (RB0==1)
  {
   set_timer1(3036);
  }
  RB0=0;
  set_timer1(0);
  }

pulsos=get_timer0();

Time=1;
}

//PROGRAMA PRINCIPAL

void main(void)
{

int16 x;
Overflow=0;
Time=0;
clear_interrupt(INT_TIMER0);
clear_interrupt(INT_TIMER1);
  set_timer0(0);                   
  set_timer1(3036);   
  setup_timer_1(RTCC_INTERNAL|RTCC_DIV_256);               
  enable_interrupts(INT_TIMER0);
  enable_interrupts(INT_TIMER1);
  while(Time==0){}               
  x=((int16)Overflow*256+pulsos);
  return(x);
}

//CONFIGURACION DE PUERTOS

set_tris_b=(0xFF);

//HABILITAR LAS INTERRUPCIONES EXTERNAS Y EL TEMPO

ext_int_edge(H_TO_L);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
while(true);
}
}

Desconectado mikepvr

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con los pulsos
« Respuesta #14 en: 21 de Diciembre de 2009, 00:55:51 »
gracias Adak, adaptare tu codigo en el pic18f2550 a ver como me funciona :)



 

anything