Autor Tema: Flancos  (Leído 2364 veces)

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

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
Flancos
« en: 17 de Febrero de 2005, 12:23:00 »
Como se puede contar las veces que una señal conectada a un pin del pic se pone a  0 o 1

El caso esqe tengo una señal de +5v y kiero saber cuantas veeces baja a 0 en un segundo. Que rutinas son las que se usan para contar Flancos de subida o de bajada?

Un saludo y gracias

Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: Flancos
« Respuesta #1 en: 17 de Febrero de 2005, 13:01:00 »
Utiliza un temporizador contando pulsos externos

setup_timer_1(T1_EXTERNAL);

Salud2

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
RE: Flancos
« Respuesta #2 en: 18 de Febrero de 2005, 02:59:00 »
BAsicamente tengo un lcd  que muestra segun el movimiento de los leds de un programador que ponga leyendo o escribiendo. he pensado hacer  lque cuente cuantas oscilaciones hay en un pin conectado a los leds se gun cuantas veces se encienda un led u otro mostrara en la pantalla leyendo o escribiendo.

voy a mirara ahor aesa instruccion a ver si puedo sacar algo.

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
RE: Flancos
« Respuesta #3 en: 18 de Febrero de 2005, 04:20:00 »
setup_timer_t1 no funciona en el 16f84 joooooooo

Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: Flancos
« Respuesta #4 en: 18 de Febrero de 2005, 09:13:00 »
Claro porque el modesto 16f84 tiene solo el timer0 tienes que usar por ejemplo de la serie 16f87x o de 18fxxx. Mira este programa es para contar los pulsos de un sensor de luz TSL230 que entrega la cantida de luz en una frecuencia variable. Le faltan muchas mejoras pero igual te puede servir de guia para comenzar.

Salud2


#include <16F873A.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <lcd2.c>

void frecuencia(void);
void lcd_inicio();
void sensibilidad(void);
void retardo(int);

int16 pulsos=0;
int   sensib=0;
int   i=0;
int16 muestra[11];

#INT_TIMER0
captura_pulsos()
{
  frecuencia();
}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_EXTERNAL);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   disable_interrupts(INT_TIMER0);
   disable_interrupts(GLOBAL);
   lcd_init();
   set_tris_c(0b10000111); // RC0 entrada fo Rc1 encender sensor

   lcd_putc("f"Giño;
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Sist. de medicion"Giño;
   lcd_gotoxy(1,2);
   printf(lcd_putc,"de luz en bosque"Giño;
   retardo(20);
   set_timer1(0);

   lcd_putc("f"Giño;
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Parc:"Giño;
   lcd_gotoxy(12,1);
   printf(lcd_putc,"S:"Giño;
   sensibilidad();
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Med:"Giño;


   while(1)
   {

      if (input(PIN_C1))
      {
         if (sensib!=0)
         {
         lcd_gotoxy(5,2);
         printf(lcd_putc,"..........."Giño;
         for(i=0;i<=10;i++)
         {
         output_bit(PIN_A3,0);
         set_timer0(0);
         enable_interrupts(INT_TIMER0);
         enable_interrupts(GLOBAL);
         set_timer0(2);    // cuenta 4/4000000*256*(256-2) aprox 65ms
         set_timer1(0);
         delay_ms(70);
         }
         pulsos=(muestra[5]+muestra[6]+muestra[7]+muestra[8])/4;
         switch (sensib){
         case 1:
         pulsos=12.85714*pulsos;
         break;
         case 2:
         pulsos=1.28571*pulsos;
         break;
         case 3:
         pulsos=0.12857*pulsos;
         break;
        }

         lcd_gotoxy(5,2);
         printf(lcd_putc,"%lu LUX",pulsos);

         }
         else
         {
         lcd_gotoxy(5,2);
         printf(lcd_putc,"ajuste sensib."Giño;
         }
      }

      if (input(PIN_C2))   // apagar
      {
         if (sensib<3)
         sensib+=1;
         else
         sensib=0;

         lcd_gotoxy(5,2);
         printf(lcd_putc,"            "Giño;
      sensibilidad();
      }



   retardo(1);

         }
      }







void frecuencia (void)
{
  pulsos=get_timer1();
  disable_interrupts(INT_TIMER0);
  disable_interrupts(GLOBAL);
  set_timer1(0);
  output_bit(PIN_A3,1);
  muestra=pulsos;
  //while(input(pin_C1));
}


void sensibilidad(void)
{
         switch (sensib)
         {
         case 0:
         lcd_gotoxy(14,1);
         printf(lcd_putc,"off"Giño;
         output_bit(PIN_c3,0);
         output_bit(PIN_c4,0);
         break;

         case 1:
         lcd_gotoxy(14,1);
         printf(lcd_putc,"baj"Giño;
         output_bit(PIN_c4,0);
         output_bit(PIN_c3,1);
         break;

         case 2:
         lcd_gotoxy(14,1);
         printf(lcd_putc,"med"Giño;
         output_bit(PIN_c3,0);
         output_bit(PIN_c4,1);

         break;

         case 3:
         lcd_gotoxy(14,1);
         printf(lcd_putc,"alt"Giño;
         output_bit(PIN_c4,1);
         output_bit(PIN_c3,1);
         break;
         }

}

void retardo (int demora)
{
int i;
   for(i=0;i<=demora;i++)
   delay_ms(100);
}

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
RE: Flancos
« Respuesta #5 en: 18 de Febrero de 2005, 09:45:00 »
he cambiado al integrado 16f876  y como es en dos sitios dond etengo q contar voya  usar el  etup_timer_0(RTCC_EXT_L_TO_H)   y setup_timer_1(T1_EXTERNAL  ) par a contar ahro avere tu ejemplo y vere que peudo hacer. dentro de un rato os cuento