Autor Tema: Contar pulsos  (Leído 1245 veces)

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

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Contar pulsos
« en: 09 de Octubre de 2013, 20:29:32 »
Hola que tal espero que esten bien y me puedan ayudar.
Estoy haciendo un contador de pulsos, tengo una interrupcion externa en RB0 cada flanco de subida pone en alto un pin (RB1)
Cada dos flancos de subida pone en alto RB1 con el timer1 y reinicia una variable Fb que se incrementa con cada flanco de bajada, cuando Fb = 24 flancos es el limite para dejar de contar 2 flancos y empiesa a contar de 3 flancos y pone en alto RB1 cuando Fb = 48 es limite para dejar de contar 3 flnacos, hasta aqui esta bien pero cuando quiero que cuente de 4 flancos no se que pasa que siempre empiesa a contar de 3 flancos, ya revise el programa pero no encontre error, espero que me ayuden a encontrar este error, pongo mi programa gracias.

#include <16F628A.h>
#fuses INTRC, MCLR, NOWDT, PROTECT
#use delay( clock = 4000000 )
#use standard_io( B )

int Cam = 0, Fs = 0, Fb = 0;

int16 Cont1 = 0;

#INT_TIMER1
void timer1( void )
   {
      Cont1++;
     
      if( Cont1 == 1 )
         {
            output_high( PIN_B1 );
         }
      else
         {
            output_low( PIN_B1 );
         }
     
      set_timer1( 15536 );
   }

#INT_EXT
void ext( void )
   {
      if( Cam == 0 )
         {
            ext_int_edge( H_TO_L );
            Cam = 1;
            Fs++;
         }
      else
         {
            ext_int_edge( L_TO_H );
            Cam = 0;
            disable_interrupts( INT_TIMER1 );
            output_low( PIN_B1 );
            Cont1 = 0;
            Fb++;
         }
   }

void main( void )
   {
      set_timer1( 15536 );
      setup_timer_1( T1_INTERNAL | T1_DIV_BY_2 );
      disable_interrupts( INT_TIMER1 );
     
      ext_int_edge( 0, L_TO_H );
      enable_interrupts( INT_EXT );
     
      enable_interrupts( GLOBAL );
     
      while( 1 )
         {           
            switch( Fs )
               {
                  case 2:
                         if( Fb <= 24 )
                           {
                              output_high( PIN_B2 );
                              enable_interrupts( INT_TIMER1 );
                              Fs = 0;
                           }
                  break;
                 
                  case 3:
                         if( 24 < Fb <= 48 )
                              {
                                 output_low( PIN_B2 );
                                 enable_interrupts( INT_TIMER1 );
                                 Fs = 0;
                              }
                 break;
                 
                 case 4:
                        if( 48 < Fb <= 72 )
                           {
                              output_high( PIN_B2 );
                              disable_interrupts( INT_TIMER1 );
                              output_low( PIN_B1 );
                              Fs = 0;
                           }
                break;
               
                case 5:
                        if( Fb > 72 )
                           {
                              disable_interrupts( INT_TIMER1 );
                              output_low( PIN_B1 );
                              Fs = 0;
                              Fb = 0;
                           }
                break;
               }
         }
   }

Desconectado xxopiumxx

  • PIC12
  • **
  • Mensajes: 82
Re: Contar pulsos
« Respuesta #1 en: 04 de Diciembre de 2013, 13:06:26 »
sabias que justamente para eso esta la opcion de ponerle una referencia externa al timer 1 o al 3? simplemente, adecuá el nivel de los flancos a los niveles logicos de la pic y mandalos derecho  a la pata externa.
no tenes que hacer absolutamente nada mas que revisar el registro del respectivo timer a ver cómo va.


 

anything