Autor Tema: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?  (Leído 2942 veces)

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

Desconectado marcelomendoza

  • PIC10
  • *
  • Mensajes: 5
CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« en: 14 de Julio de 2005, 20:12:00 »
Hola Muchachos.
Estoy haciendo un programa para contar los pulsos que me llegan durante 5 segundos,
El problema que tengo, es que solamente me lee los pulsos cuando arranca el programa
con el generador de pulsos, y si quisiera empezar a enviar los pulsos, por ejemplo
a los 6 segundos, no me aparece nada en el display, lo raro es que tengo un while
infinito.
Y ademas cuando vario el preescaler me lee por ejemplo 6pulsos, no se queda fifo,
despues me aparece 5pulsos en el display.
Estuve probando usando interrupcion por RB pero no me anda bien, asi que segui con esta.
Lo simule con Proteus.

Si me pueden dar una manito en esto les estaria muy agradecido.

Aca va el codigo

#include <16f84a.h>
#use delay(clock=4000000)
#include <Lcd84sinRB0.c>  //16f84 con RB0 libre
int contador=0;
int timer1s=0;
///////////////////////INTERRUPCION////////////////////////
#int_TIMER0
TIMER0_isr()
{
static int timer=0;
timer++;                   //suma 1 en cada interrupcion
if(timer==250)             //a las 250 interrupciones comienza
   {                       //a sumar 1 timer 1s
      timer1s++;
   }
}
//////////////FIN INTERRUPCION////////////////////////////
void fin()
{
}

void main()
{
lcd_init();
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);

while(1)

{
        while(input(PIN_A0))   // Esperar flanco ascendente
               delay_ms(2);
              contador++;
        while(!input(PIN_A0));   // Esperar flanco descendente
               delay_ms(2);
               fin();

if(timer1s==5)
{
   disable_interrupts(int_timer0);
   lcd_putc("f");

switch (contador) {

                     case 1:  lcd_putc("1 PULSO
");
                              break;
                     case 2:  lcd_putc("2 PULSOS
");
                              break;
                     case 3:  lcd_putc("3 PULSOS
");
                              break;
                     case 4:  lcd_putc("4 PULSOS
");
                              break;
                     case 5:  lcd_putc("5 PULSOS
");
                              break;
                     case 6:  lcd_putc("6 PULSOS
");
                              break;
                     case 7:  lcd_putc("7 PULSOS
");
                              break;
                     case 8:  lcd_putc("8 PULSOS
");
                              break;
                     case 9:  lcd_putc("9 PULSOS
");
                              break;
                     case 10:  lcd_putc("10 PULSOS
");
                              break;
                     case 11:  lcd_putc("11 PULSOS
");
                              //fin();
                               break;
                     case 12:  lcd_putc("12 PULSOS
");
                               break;
                     default: lcd_putc("MAS DE 12 PULSOS
");
                              break;
                     }
   contador=0;
   enable_interrupts(int_timer0);
   //timer1s=0;
   //output_bit(PIN_A0,0);

}


}
}

Saludos y gracias.

Desconectado marcelomendoza

  • PIC10
  • *
  • Mensajes: 5
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #1 en: 16 de Julio de 2005, 19:20:00 »
[/size]VAMOS MUCHACHOS NO TIENE QUE SER MUY DIFICIL PARA USTEDES...

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #2 en: 17 de Julio de 2005, 04:05:00 »
Hola, no es que use Pic yo, pero te comentare alguna cosa del codigo:

- Cuando buscas un flanco ascendente pones:  while(input(PIN_A0));
 y supongo que sera  while(!input(PIN_A0));. Lo que esperas es que valga "1" (mientras valga "0" esperas). Y en el descendente que valga "0".

- Al final tienes comentada la linea:  //timer1s=0
De ese modo como en la interrupcion solo sumas uno mas cada vez, cuando pasa de 5, seguira con 6,7,8,.... y como no volvera a ser 5, pues no te vuelve a mostrar nada en el display (no se cumple el "if(timer1s==5)".

Un saludo.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #3 en: 17 de Julio de 2005, 06:45:00 »
Una respuesta rápida sin hacer números con el tiempo:

Cada vez que entras en la interrupción se encuentra con static int timer=0,  con lo cual se resetea y no se incrementa.

Un saludo

Desconectado marcelomendoza

  • PIC10
  • *
  • Mensajes: 5
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #4 en: 18 de Julio de 2005, 22:41:00 »
Hola amigos.
Ante todo gracias por tomarse la molestia para ayudarme con este programita.

Para ti Pocher he modificado como me dijiste la instruccion y puse

static int timer;

Y para ti Damago modifique esto:
while(input(PIN_A0))   // Esperar flanco ascendente
               delay_ms(2);
              contador++;
        while(!input(PIN_A0));   // Esperar flanco descendente
               delay_ms(2);

Con respecto a la linea que me quedo comentada, se me paso de sacarle el // pero ya la habia probado antes descomentada.

He realizado las modificaciones pero el problema de fondo sigue, me recomendaron simular con el MPLAB al que le estoy agarrando la mano, yo usaba el pic simulator ide pero iba muy lento (tenia que poner los delay en microsegundos para ver los semaforos) con eso digo todo.
Me parece que el poblema esta en los while y no megusta el switch ahi adentro ademas cuando le cambio el preesacler a 8 se empeora la cosa.

Si lo pudieran simular les paso los archivos de proteus para que lo vean.

Gracias amigos.


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #5 en: 20 de Julio de 2005, 10:46:00 »
Si no me equivoco el static tambien inicializa a 0.

Mandame los archivos por privado.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #6 en: 21 de Julio de 2005, 13:22:00 »
Te lo habia resuelto y limpiando carpetas del escritorio me he cargado la tuya (papelera también limpia).

En fin voy a intentar explicartelo.

El tiempo de 5s estaba mal, lo has calculado para la mitad.

Otro problema era que si inicialmente dejas pasar el tiempo la variable timer1s va incrementando su valor y cuando quieres preguntarte si vale 5, a saber cuanto vale ya.  Este era dificil de ver.

Yo lo habia solucionado metiendo una variable auxiliar en la interrupción que subiera a 1 cuando hayan pasado 5s. Además habilitaba inicialmente la interrupción solo cuando detectaba el primer flanco de bajada.

Haber si con estas ideas puedes montarlo.

Yo para capturar pulsos uso el modo captura, pero claro para esto necesitas un PIC que disponga de módulos CCP, el 84 no te vale.

Un saludo

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #7 en: 23 de Julio de 2005, 04:13:00 »
En fin, ahora tengo tiempo y te lo he solucionado, pero que no cunda el ejemplo eh!

Codigo:
#include <16f84a.h>
#use delay(clock=4000000)
#include <Lcd84sinRB0.c>  //16f84 con RB0 libre
int contador=0;
int timer1s=0;
int timer=0;
int tim=0;

#int_TIMER0
TIMER0_isr()
{
   timer++;                  
   if(timer==250)           // 2,048ms · 250=  512ms
        {                      
         timer=0;
                 timer1s++;
      }
      
   if(timer1s==10)         // 512ms · 10=  5,1s
   {
         lcd_putc("f");

      switch (contador)
       {
                case 0:  lcd_putc("0 PULSOS
");
                              break;
                case 1:  lcd_putc("1 PULSO
");
                              break;
                     case 2:  lcd_putc("2 PULSOS
");
                              break;
                     case 3:  lcd_putc("3 PULSOS
");
                              break;
                    case 4:  lcd_putc("4 PULSOS
");
                              break;
                    case 5:  lcd_putc("5 PULSOS
");
                              break;
                    case 6:  lcd_putc("6 PULSOS
");
                              break;
                    case 7:  lcd_putc("7 PULSOS
");
                              break;
                    case 8:  lcd_putc("8 PULSOS
");
                              break;
                    case 9:  lcd_putc("9 PULSOS
");
                              break;
                   case 10:  lcd_putc("10 PULSOS
");
                              break;
                   case 11:  lcd_putc("11 PULSOS
");
                              break;
                  case 12:  lcd_putc("12 PULSOS
");
                               break;
                  default: lcd_putc("MAS DE 12 PULSOS
");
                              break;
         }
         contador=0;
         timer1s=0;
   }      
}

void main()
{
   lcd_init();
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);
   enable_interrupts(GLOBAL);
   
   while(1)
   {
      while(!input(PIN_A0));   // Esperar flanco ascendente                                                             
      while(input(PIN_A0));   // Esperar flanco descendente
               enable_interrupts(INT_TIMER0);                                                  
      contador++;      
   }
}



Un saludo

Desconectado marcelomendoza

  • PIC10
  • *
  • Mensajes: 5
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #8 en: 24 de Julio de 2005, 23:23:00 »
Muchas gracias Pocher, anda muy bien, ahora tengo que leer 2 trenes de pulsos separados 10 segundos, con este codigo me has ayudado mucho, nunca me imagine poner el case dentro de la interrupcion.Muchas risas

Desconectado Dajosco

  • PIC10
  • *
  • Mensajes: 4
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #9 en: 26 de Julio de 2005, 13:58:00 »
Como a mi personalmente no me gusta que dentro de una interrupcion se hagan muchas cosas y sobre todo ejecuten funciones que demoran un buen tiempo menos aun en la interrupcion del timer, te sugiero que pruebes el codigo que dejo a continuacion, ademas de una forma mas elegante de detectar un flanco si obviamente tenes disponible alguna de las patas que pueden interrumpir.

#include <16f84a.h>
#fuses NOWDT,XT,
#use delay(clock=4000000)
#include <Lcd84sinRB0.c> //16f84 con RB0 libre

int contador=0;
int timer1s=0;

#byte PortB=0x06
#bit  PataRB2=PortB.2
#bit  PataRB0=PortB.0

///////////////////////INTERRUPCION////////////////////////

#int_EXT
Ext_isr()
{
  delay_ms(2);           //antirrebote  Rebotado
  if(PataRB0==1)   
     contador++;
 
  return;

}
 
#int_TIMER0
TIMER0_isr()
{
     static int timer=0;
     timer++; //suma 1 en cada interrupcion
     if(timer==250) //a las 250 interrupciones paso 1seg
     {
          timer1s++;
     }
     return;
}
//////////////FIN INTERRUPCION////////////////////////////

void main()
{
   lcd_init();
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16);   //para que interrumpa cada 4ms
   enable_interrupts(INT_TIMER0);
   ext_int_edge( L_TO_H );                 //para que detecte flancos Idea
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   set_tris_b(0x01);

 
   while(1)
   {
      if(timer1s==5)
      {
          disable_interrupts(int_timer0);
          lcd_putc("f"Giño;    //borrar la pantalla

          switch (contador)
          {
   case 1:
                       lcd_putc("1 PULSO
"Giño;
                       break;
                case 2:
                       lcd_putc("2 PULSOS
"Giño;
                       break;
   case 3:
    ..........................
                 ...................
                 .........................
                 ...................

                default:
          lcd_putc("MAS DE 12 PULSOS
"Giño;
                       break;
               }
               contador=0;
               enable_interrupts(int_timer0);
               timer1s=0;
               
          }
       }
}

Desconectado Dajosco

  • PIC10
  • *
  • Mensajes: 4
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #10 en: 26 de Julio de 2005, 14:03:00 »
#include <16f84a.h>
#fuses NOWDT,XT,
#use delay(clock=4000000)
#include <Lcd84sinRB0.c> //16f84 con RB0 libre

int contador=0;
int timer1s=0;

#byte PortB=0x06
#bit  PataRB2=PortB.2
#bit  PataRB0=PortB.0

///////////////////////INTERRUPCION////////////////////////

#int_EXT
Ext_isr()
{
   delay_ms(2);       //antirrebote
   if(PataRB0==1)   
      contador++;

   return;

}
 
#int_TIMER0
TIMER0_isr()
{
   static int timer=0;
   timer++; //suma 1 en cada interrupcion
   if(timer==250) //a las 250 interrupciones comienza
   { //a sumar 1 timer 1s
      timer1s++;
   }
   return;
}
//////////////FIN INTERRUPCION////////////////////////////

void main()
{
   lcd_init();
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16);
   enable_interrupts(INT_TIMER0);
   ext_int_edge( L_TO_H );
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   set_tris_b(0x01);

 
   while(1)
   {
      if(timer1s==5)
      {
         disable_interrupts(int_timer0);
         lcd_putc("f");    //borrar la pantalla

         switch (contador)
         {
            case 1:
               lcd_putc("1 PULSO
");
               break;
            case 2:
               lcd_putc("2 PULSOS
");
               break;
            case 3:
               lcd_putc("3 PULSOS
");
               break;
            case 4:
               lcd_putc("4 PULSOS
");
               break;
            case 5:
               lcd_putc("5 PULSOS
");
               break;
            case 6:
               lcd_putc("6 PULSOS
");
               break;
            case 7:
               lcd_putc("7 PULSOS
");
               break;
            case 8:
               lcd_putc("8 PULSOS
");
               break;
            case 9:
               lcd_putc("9 PULSOS
");
               break;
            case 10:
               lcd_putc("10 PULSOS
");
               break;
            case 11:
               lcd_putc("11 PULSOS
");
               break;
            case 12:
               lcd_putc("12 PULSOS
");
               break;
            default:
               lcd_putc("MAS DE 12 PULSOS
");
               break;
         }
         contador=0;
         enable_interrupts(int_timer0);
         timer1s=0;
         //output_bit(PIN_A0,0);
      }
   }
}

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #11 en: 27 de Julio de 2005, 02:00:00 »
De acuerdo con Dajosco, siempre y cuando puedas usar RB0 como entrada de pulsos por interrupción.

Dajosco, ¿crees que con static int timer=0; funcionaría bien?

Desconectado marcelomendoza

  • PIC10
  • *
  • Mensajes: 5
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #12 en: 14 de Agosto de 2005, 22:50:00 »
HOLA HE CORREGIDO EL PROGRAMA Y LE AGREGUE PARA QUE LEA 2 TRENES DE PULSOS SEPARADOS 5 SEGUNDOS, LO QUE NO SE ES COMO UNIR LOS  2 NUMEROS DE PULSOS QUE RECIBO PARA QUE ME COINCIDA CON UN CODIGO DE ERROR
POR EJEMPLO

PRIMER PULSO=8
SEGUNDO PULSO=9
QUIERO CONVERTIR ESTO EN 89 Y QUE ME APAREZCA LA FALLA CORRESPONDIENTE AL CODIGO 89

#include <16f84a.h>
#include <string.h>
#fuses NOWDT,XT
#use delay(clock=4000000)
#include "Lcd84sinRB0.c" //16f84 con RB0 libre
int contador=0;
int primpulso=0;
int segpulso=0;
int timer1s=0;
#byte PortB=0x06
#bit  PataRB2=PortB.2
#bit  PataRB0=PortB.0
#byte PortA=0x05
#bit  Led=PortA.0
///////////////////////INTERRUPCION    POR RB0////////////////////////
#int_EXT
Ext_isr()
{
   Led=1;
   delay_ms(50);       //antirrebote
   Led=0;
   if(PataRB0==1)   
   contador++;
   return;
}
///////////////////////INTERRUPCION    POR TOMER0/////////////////////
#int_TIMER0
TIMER0_isr()
{
   static int timer=0;
   timer++;          //suma 1 en cada interrupcion
   if(timer==250)     //a las 250 interrupciones comienza
   timer1s++;          //a sumar 1 timer 1s
   return;
}
/////////////////////////FIN INTERRUPCIONES////////////////////////
//////////////////////SUBRUTINA COMPARARPULSOS/////////////////////
void comparapulsos()
{

printf(lcd_putc,"
 %u",stricmp(primpulso,segpulso));

//ACA ESTA EL PROBLEMA
         


/*switch (primpulso,segpulso)
                     {
                     case (5,4):lcd_putc("
FALLA 1");
                     break;
                     case (5,5):lcd_putc("
FALLA 2");
                     break;
                     case (5,6):lcd_putc("
FALLA 3");
                     break;
                     case (5,7):lcd_putc("
FALLA 4");
                     break;
                     case (5,8):lcd_putc("
FALLA 5");
                     break;
//                     case (8,8):lcd_putc("
FALLA 6");
//                     break;
                            case (8,9):lcd_putc("
FALLA 7");
                     break;
                     default:lcd_putc("
CODIGO NO DEFINIDO");
*/                     }

///////////////////////SUBRUTINA SEGUNDOPULSO//////////////////////
void segundopulso()
               {
               set_tris_b(0x01);               
               delay_ms(5000);               
               enable_interrupts(INT_EXT);
               enable_interrupts(int_timer0);
                              
               while(1)
                  {
                     if(timer1s==3)
                     {
                        disable_interrupts(INT_EXT);
                        disable_interrupts(INT_TIMER0);
                        printf(lcd_putc,"  TREN2=%d" ,contador);
                        segpulso=contador;
                        contador=0;
                        timer1s=0;   
                        comparapulsos();                  
                     }
                  }            
               }
/////////////////////////PROGRAMA PRINCIPAL////////////////////////
void main()
{
   Led=0;   
   lcd_init();
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16);
   enable_interrupts(INT_TIMER0);
   ext_int_edge( L_TO_H );
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   //port_b_pullups(TRUE);
   set_tris_b(0x01);

   while(1)
   {
      if(timer1s==3)
      {
         disable_interrupts(INT_EXT);
         disable_interrupts(INT_TIMER0);
         lcd_putc("f");         
         printf(lcd_putc,"TREN1=%d" ,contador);
         primpulso=contador;         
         contador=0;
         timer1s=0;
         segundopulso();
         set_tris_a(0x00);
         set_tris_b(0x01);
      }
   }
}


CREO QUE DEBO TRABAJAR CON CADENAS PERO NO SE COMO HACERLO
SALUDOS

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: CONTAR PULSOS, ME PEDEN AYUDAR POR FAVOR?
« Respuesta #13 en: 07 de Septiembre de 2005, 12:18:00 »
Hola, no he mirado mucho el software que has implementado, pero si necesitas contar pulsos en un periodo determinado, solo tenes que conectar los pulsos a la entrada externa del TMR1 y usar la interrupcion del timer0 para generar el perido de medicion, despues solo resta mostrar los pulsos, espero que te sirva.

saludos
ARIEL / PIKMAN
saludos
PikMan