TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: DoNPNPoN 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
-
Utiliza un temporizador contando pulsos externos
setup_timer_1(T1_EXTERNAL);
Salud2
-
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.
-
setup_timer_t1 no funciona en el 16f84 joooooooo
-
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"
;
lcd_gotoxy(1,1);
printf(lcd_putc,"Sist. de medicion"
;
lcd_gotoxy(1,2);
printf(lcd_putc,"de luz en bosque"
;
retardo(20);
set_timer1(0);
lcd_putc("f"
;
lcd_gotoxy(1,1);
printf(lcd_putc,"Parc:"
;
lcd_gotoxy(12,1);
printf(lcd_putc,"S:"
;
sensibilidad();
lcd_gotoxy(1,2);
printf(lcd_putc,"Med:"
;
while(1)
{
if (input(PIN_C1))
{
if (sensib!=0)
{
lcd_gotoxy(5,2);
printf(lcd_putc,"..........."
;
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."
;
}
}
if (input(PIN_C2)) // apagar
{
if (sensib<3)
sensib+=1;
else
sensib=0;
lcd_gotoxy(5,2);
printf(lcd_putc," "
;
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"
;
output_bit(PIN_c3,0);
output_bit(PIN_c4,0);
break;
case 1:
lcd_gotoxy(14,1);
printf(lcd_putc,"baj"
;
output_bit(PIN_c4,0);
output_bit(PIN_c3,1);
break;
case 2:
lcd_gotoxy(14,1);
printf(lcd_putc,"med"
;
output_bit(PIN_c3,0);
output_bit(PIN_c4,1);
break;
case 3:
lcd_gotoxy(14,1);
printf(lcd_putc,"alt"
;
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);
}
-
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