Autor Tema: Como leer el tiempo q dura un pulso q entra a la pata RA4/TOCKI pic16f84a  (Leído 4679 veces)

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

Desconectado ronny22

  • PIC10
  • *
  • Mensajes: 13
hola que tal amigos,ando realizando un proyecto el cual consiste en un secuencial de luces con el pic16f84a.

las secuencias ya las tengo,el problema q tengo es q quisiera leer el tiempo que dura un pulso positivo (Ton) el cual entrega la salida de un circuito 555 y que va conectado a la pata RA4/TOCKI del pic16f84a.

a la salida del 555 la puedo variar ya que lleva un potenciometro de 100k,y por lo tanto los pulsos (Ton) se pueden disminuir o aumentar.

entonces me gustaria poder leer el tiempo que dura ese (Ton) y poder utilizarlo como retardo para encender y apagar los leds,es decir algo como esto:

en asembler

portb=0xff;
call retardo
portb=0x00;

en lenguaje c

portb=0b11111111;
delay_ms(X);
portb=0b00000000;

en donde "X" es el tiempo que dura el pulso (Ton), de esta manera se podra variar el tiempo con el cual se prenden y apagan los leds.

el programa q tengo es algo como esto:

#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#byte porta=5
#byte portb=6

void main()
{
int x=100;
set_tris_b(0b00000000);
portb=0b00000000;

while(true)
{

if(porta==0b00000010)
{
portb=0b00000001;
delay_ms(x);
portb=0b00000010;
delay_ms(x);
portb=0b00000100;
delay_ms(x);
portb=0b00001000;
delay_ms(x);
portb=0b00010000;
delay_ms(x);
portb=0b00100000;
delay_ms(x);
portb=0b01000000;
delay_ms(x);
portb=0b10000000;
delay_ms(x);
portb=0b00000000;
}
}
}

aca utilizo dentro del delay_ms(x); a la "X" la cual esta declarada al principio como constante,pero me gustaria q variara,tal es el caso de la entrada del 555 a la pata RA4/TOCKI.

gracias de antemano por sus respuestas


PD:les dejo incluido el verdadero programa y el circuito.

Desconectado CONFORMOTICA

  • PIC10
  • *
  • Mensajes: 16
Re: Como leer el tiempo q dura un pulso q entra a la pata RA4/TOCKI pic16f84a
« Respuesta #1 en: 15 de Mayo de 2009, 19:34:42 »
Lo que podes hacer en ccs es:

int x=0;

while ( input (PIN_A4) )
   x++;

Mientras RA4 sea '1' se va a incrementar en 1 la variable x (podes poner que se incremente en un valor mas grande o mas chico), en este caso cuando llegue a 255 y se vuelva a incrementar va a volver a 0.

Podes resolver esto ultimo si la definis como "long x;" y se sobrepasara despues de 65535. O que se incremente en menos de 1 vez cada vez que recorre el ciclo while, De esta forma:

int x=0;
int cont=0;

while ( input (PIN_A4) )
{
   cont++;
   if(cont==10)
   {
      cont=0;
      x++;
   }
}

espero que te ayude...

Desconectado ronny22

  • PIC10
  • *
  • Mensajes: 13
Re: Como leer el tiempo q dura un pulso q entra a la pata RA4/TOCKI pic16f84a
« Respuesta #2 en: 19 de Mayo de 2009, 23:11:38 »
Hola que tal CONFORMATICA,gracias por la ayuda prestada,resolvi el problema usando una funcion en lenguaje c y luegop metiendo un codigo dentro de ella en lenguaje asembler.

hice esto gracias a otros compañeros que tambien me ayudaron,entre ellos Leon Pic

void funcion(void)
{
#asm
espero:  btfss  porta,4 ;¿ra4=0?
                goto   espero  ;no, espero
espero2: btfsc  porta,4 ;si, ¿ra4=1?
                goto  espero2 ;no, espero
                retlw 0          ;si retorno.
#endasm
}

y de esa manera puedo leer los pulsos q entran a la pata RA4 del pic16f84a.

aunq gracias por tu respuesta tambien colega.

Desconectado CONFORMOTICA

  • PIC10
  • *
  • Mensajes: 16
Re: Como leer el tiempo q dura un pulso q entra a la pata RA4/TOCKI pic16f84a
« Respuesta #3 en: 20 de Mayo de 2009, 19:02:43 »
Esta bien para detectar los pulsos.. pero como los contabilizas?? Porque tendrias que ir incrementando una variable a medida que vas detectando el pulso para despues hacer un timing en funcion de eso.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como leer el tiempo q dura un pulso q entra a la pata RA4/TOCKI pic16f84a
« Respuesta #4 en: 20 de Mayo de 2009, 19:12:35 »
Es cierto?

Yo en su momento había pensado en esto:
Código: C
  1. #include <16F84A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  5. #FUSES PUT                      //Power Up Timer
  6. #FUSES NOPROTECT                //Code not protected from reading
  7.  
  8. #use delay(clock=4000000)
  9.  
  10. #bit Ton=0x05.4
  11. #bit T0IF=0x0B.2
  12.  
  13. #use fast_io(A)
  14. #use fast_io(B)
  15.  
  16. int16 Contador, X;
  17. int32 Ciclos;
  18.  
  19. #int_RTCC
  20. void  RTCC_isr(void)
  21. {
  22.    // Flanco ascendente.-
  23.    // Al generarse la interrupción...
  24.    // el timer0 esta en 0.
  25.    Contador=0;
  26.    T0IF=0;
  27.    while(Ton==1){
  28.       if(T0IF==1){ // Hay overflow?
  29.          ++Contador; // Sumo al Contador.
  30.          T0IF=0;
  31.       }
  32.    }
  33.    Ciclos=get_timer0();
  34.    Ciclos=(int32)(Contador*0x100 + Ciclos);
  35.    X=Ciclos/1000; // (Ciclos*(4/4MHz))*1000 -> [ms]
  36.    disable_interrupts(INT_RTCC);
  37. }
  38.  
  39.  
  40.  
  41. void main()
  42. {
  43.  
  44.    setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
  45.    
  46.    enable_interrupts(INT_RTCC);
  47.    enable_interrupts(GLOBAL);
  48.    set_timer0(255);
  49.  
  50.    while(1){}
  51.  
  52. }
No contesto mensajes privados, las consultas en el foro

Desconectado ronny22

  • PIC10
  • *
  • Mensajes: 13
Re: Como leer el tiempo q dura un pulso q entra a la pata RA4/TOCKI pic16f84a
« Respuesta #5 en: 20 de Mayo de 2009, 22:36:56 »
hola que tal amigos.

Citar
Esta bien para detectar los pulsos.. pero como los contabilizas?? Porque tendrias que ir incrementando una variable a medida que vas detectando el pulso para despues hacer un timing en funcion de eso.

bueno colega a decir verdad cambie un poco el programa con el cual inicie este post.

Código: [Seleccionar]
void funcion(void)
{
#asm
espero:  btfss  porta,4 ;¿ra4=1?
                goto   espero  ;no, espero
espero2: btfsc  porta,4 ;si, ¿ra4=0?
                goto  espero2 ;no, espero
                retlw 0          ;si retorno.
#endasm
}

aca lo que hace esta funcion es q cuando la llaman ella dura el mismo tiempo que dura el pulso, es decir primero verifica cuando esta en 1 logico y luego cuando esta en 0 logico,luego q termina de verificar estas dos cosas regresa a la siguiente linea donde se quedo.

aca te dejo el programa y el esquema en proteus:

Código: [Seleccionar]
#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#byte porta=5
#byte portb=6

void funcion(void);

void main()
{
set_tris_b(0b00000000);
portb=0b00000000;


while(true)
{

if(porta==0b00000000)
{
portb=0b11111111;
funcion();
portb=0b00000000;
funcion();
}
}
}
void funcion(void)
{
#asm
espero:   btfss  porta,4     ;¿ra4=1?
              goto   espero     ;no, espero
espero2: btfsc  porta,4     ;si, ¿ra4=0?
              goto  espero2    ;no, espero
              retlw 0              ;si retorno.
#endasm
}

la imagen la dejo adjunta.

PD: cabe aclarar que no necesariamente se tiene que utilizar la pata RA4/TOCKI para leer los pulsos con esta funcion que se le implemento al programa,lo bueno de esto es q podemos utilizar cualquier pata del pic para esto.
« Última modificación: 20 de Mayo de 2009, 22:55:39 por ronny22 »

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: Como leer el tiempo q dura un pulso q entra a la pata RA4/TOCKI pic16f84a
« Respuesta #6 en: 20 de Mayo de 2009, 23:11:07 »
amigo tu lo que quieres es varias la velocidad del efecto o los efectos con el potenciometro de 555 verda?

Desconectado ronny22

  • PIC10
  • *
  • Mensajes: 13
Re: Como leer el tiempo q dura un pulso q entra a la pata RA4/TOCKI pic16f84a
« Respuesta #7 en: 21 de Mayo de 2009, 10:31:50 »
sep eso mismo,debe ser q al principio no me explique bien con eso jeje,mil disculpas.


 

anything