Tiempo mínimo para que un puerto de in pic detecte la señal-

Saludos amigos, recurro a ustedes con el fin de aclarar una duda. Antes que nada, busqué con atención algún tema similar en el foro pero no lo encontré. Si quieren que ponga el circuito lo haré. Les comento lo siguiente: he hecho un circuito sencillo con un INTERRUPTOR DE FINAL DE CARRERA, al cerrar sus contacto a través de una planchita metálica da un pulso de 5 voltios a un puerto del pic 16F628A y enciende un led. Hasta ahí todo bien. El problema es cuando esta planchita la someto al golpe de un balín en calibre 5.5 mm de una carabina de aire. La idea es que cuando el balín golpee esta palchita se hunda y cierre el contacto del pulsador final de carrera. En la practica NO funciona, "pareciera" que el contacto de este pulsador se cierra "tan rápido" que el micro "no se da cuenta". Entonces, amigos, puede ser cierto esto, que a pesar de cerrar contacto, éste sea tan rápido que este voltaje, corriente no la detecte el micro? Estuve buscando el tiempo "mínimo" para que el puerto de un pic detecte la señal, pero no lo encontré, sólo hablan de tiempos mínimos pero de "valores" de voltajes. Si esto es cierto, amigos, cómo puedo reemplazar este pulsador? para que a pesar de ser este contactó tan rápido, sea detectado? Muchas gracias de antemano por sus amables respuestas.
 
Te has asegurado que el contacto se cierra realmente? a que distancia se hace el disparo?
No hubiera sido mejor un sensor optico que desplace dicha plaquita, por la forma de trabajar de dara un tiempo más largo y no tendras que complicar tu esquema
puede ser de este tipo:

sensor-optico-de-herradura-itr8102-arduino-pic-robotica-D_NQ_NP_386325-MLM25436517342_032017-F.jpg
s-l300.jpg

Otra opción y muy interesante es utiliza un sensor capacitivo, tienen la ventaja, que se puede ajustar la distancia
tambien podes utilizar este
encoder-infrarrojo.jpg
 
Última edición:
Estuve buscando el tiempo "mínimo" para que el puerto de un pic detecte la señal, pero no lo encontré, sólo hablan de tiempos mínimos pero de "valores" de voltajes.
Estoy seguro que buscaste por todos lados, menos en la hoja de datos.
No es lo mismo un puerto que un pin o terminal. Un puerto son los 8 bits o pines y un pin es tan solo un bit del puerto.

El tiempo de respuesta que tarda un pin en responder, está basado en la frecuencia de reloj.
Ve a la sección 17.0: "Electrical Specifications" y busca la tabla 17-6. (CLKOUT AND I/O TIMING REQUIREMENTS)
Ahí encontrarás lo que necesitas saber.
Ahora, para lo que requieres es mejor que uses la interrupción externa por RB0
Y si tu programa sensa el estado del pin por polling y usas retardos, olvidate de que sea leído inmediatamente.
 
Yo no he leído casi ningún datasheet de los pics y no recuerdo haberlo visto pero segurísimo que está.
En la mayoría de los micros es entre dos y cuatro pulsos de reloj, eso para una interrupción, claro. Por polling pues lo mismo más lo que tarde el programa en leer.
 
Voy a revisar con mucha atención tu sugerencia amigo. Saludos.
Mensaje automáticamente combinado:

Te has asegurado que el contacto se cierra realmente? a que distancia se hace el disparo?
No hubiera sido mejor un sensor optico que desplace dicha plaquita, por la forma de trabajar de dara un tiempo más largo y no tendras que complicar tu esquema
puede ser de este tipo:

sensor-optico-de-herradura-itr8102-arduino-pic-robotica-D_NQ_NP_386325-MLM25436517342_032017-F.jpg
s-l300.jpg

Otra opción y muy interesante es utiliza un sensor capacitivo, tienen la ventaja, que se puede ajustar la distancia
tambien podes utilizar este
encoder-infrarrojo.jpg
Te comento que luego de utilizar sin buenos resultados el interruptor final de carrera, utilicé lo que me dices con el MOC70, en la práctica(usando mi dedo o el golpe con algo y tratándolo de hacerlo muy rápido, funciona), pero sucedió lo mismo, yo estoy COMPLETAMENTE seguro de que el golpe del balín logra hundir la planchita que tengo soldada a la plancha que recibe el golpe y ésta se hunde y ATRAVIESA (interrumpe) este sensor MOC70. Pero el micro no marca. Voy a ver ese sensor capacitivo. Gracias.
Mensaje automáticamente combinado:

Estoy seguro que buscaste por todos lados, menos en la hoja de datos.
No es lo mismo un puerto que un pin o terminal. Un puerto son los 8 bits o pines y un pin es tan solo un bit del puerto.

El tiempo de respuesta que tarda un pin en responder, está basado en la frecuencia de reloj.
Ve a la sección 17.0: "Electrical Specifications" y busca la tabla 17-6. (CLKOUT AND I/O TIMING REQUIREMENTS)
Ahí encontrarás lo que necesitas saber.
Ahora, para lo que requieres es mejor que uses la interrupción externa por RB0
Y si tu programa sensa el estado del pin por polling y usas retardos, olvidate de que sea leído inmediatamente.

Hola D@rkbytes, tienes mucha razón, esa parte de la hoja de datos no lo analicé. Y efectivamente, debí decir un pin del puerto del pic. Voy a seguir al pie de la letra tus recomendaciones. Luego comentaré los resultados. Muchas gracias.
 
Última edición:
Estoy seguro que buscaste por todos lados, menos en la hoja de datos.
No es lo mismo un puerto que un pin o terminal. Un puerto son los 8 bits o pines y un pin es tan solo un bit del puerto.

El tiempo de respuesta que tarda un pin en responder, está basado en la frecuencia de reloj.
Ve a la sección 17.0: "Electrical Specifications" y busca la tabla 17-6. (CLKOUT AND I/O TIMING REQUIREMENTS)
Ahí encontrarás lo que necesitas saber.
Ahora, para lo que requieres es mejor que uses la interrupción externa por RB0
Y si tu programa sensa el estado del pin por polling y usas retardos, olvidate de que sea leído inmediatamente.

Hola D@rkbytes, quiero agradecerte primeramente a ti y también al resto de amigos que me dieron sus sugerencias. Te comento que el proyecto lo hice con la interrupción RB0 y !funcionó ! perfectamente. Una y otra vez, todos los disparos los detectaba, no había ninguno que dejara de activar la alarma. Ahora amigo, voy a implementarlo ya con la confianza de su funcionamiento, pero le agregaré un display de 7 segmentos, para que no solamente dé aviso del tiro acertado con el buzzer y un led, sino que quede anotado en un display que se irá incrementando hasta el valor de 9. Una consulta más D@rkbytes, yo estoy utilizando los módulos Tx y Rx con los pic 16F628A y todo está bien como mencioné; pero, es posible que transmita desde el 16F628A y lo reciba en el 16F877A?, por que quiero usar dos display de 7 segmentos (en recepción) para que se pueda evaluar DOS tiros sobre el mismo bull, pero uno más dificil que le otro (diámetro más pequeño). Gracias.
 
Sí, o cualquier otro dispositivo que disponga de RS-232

No conozco tu hardware, pero pienso que se puede hacer con un solo microcontrolador.

Hola D@rbytes, te comento, estoy tratando de enlazar en mi circuito con módulos RF y entre dos 16f628A funcionan (gracias a ustedes) perfectamente; pero cuando quiero usar como RECEPTOR el 16f877A no quiere funcionar, pensé que si también usaba como transmisor otro 16f877A funcionaría, pero aún asi no funciona. Hay algo que se me esté pasando? Uso los comandos SERIN y SEROUT y con los 16f628A funciona muy bien. Tal vez me puedas dar alguna pista? Gracias.
 
Hola...Una transmisión serie es eso en cualquier pic que uses(no depende del modelo de él).

Usa los comando HSERIN y HSEROUT y la UART incluida en el hardware de los PIC(para eso están), usa osciladores a cristal y no utilices velocidades super-altas ya que en las mayoría de las aplicaciones con usar 1200bps a 9600bps es mas que suficiente.

Algún error habrá en el software o hardware para que no te funcione con el cambio de PIC que como no muestras no podemos saber sin tener que adivinar.

Saludos.

Ric.
 
Hola...Una transmisión serie es eso en cualquier pic que uses(no depende del modelo de él).

Usa los comando HSERIN y HSEROUT y la UART incluida en el hardware de los PIC(para eso están), usa osciladores a cristal y no utilices velocidades super-altas ya que en las mayoría de las aplicaciones con usar 1200bps a 9600bps es mas que suficiente.

Algún error habrá en el software o hardware para que no te funcione con el cambio de PIC que como no muestras no podemos saber sin tener que adivinar.

Saludos.

Ric.
Gracias por tu respuesta amigo. Tengo entendido de que los comandos Hserin y Hserout se utilizan cuando uno usa del hardware de transmisión serie propio de los micros y Serin y Serout cuando uno realiza esta transmisión por software. En todo caso amigo, pongo los programas tanto de Tx como de Rx que funcionan muy bien (gracias a las recomendaciones principalmente de D@rbytes) con los pic 16f628a y que quisiera que también funcionaran usando el Rx con un 16f877a (si fuera posible). Saludos.

LADO TX:
Código:
include "modedefs.bas"

cmcon=7

Trisa=%00000000

Trisb=%11110000


datos var byte

x var byte

'bull1 var portb.4

'bull2 var portb.5

'bull3 var portb.6

'bull4 var portb.7


portb=0


for x=0 to 7

high portb.1

pause 100

low portb.1

pause 50

next x       


on interrupt goto EXT_INT_RB4_RB7

intcon=%10001000    ;configurar el Registro INTCON

                    ; con interrupción por cambio de estado RB4_RB7


main:

' vacio

goto main


disable

EXT_INT_RB4_RB7:

   INTCON.7=0


select case portb

    case $10        ; Si puerto B=b'00010000 (RB4=1)

serout portb.0,n2400,[$FF,$FF,"OK","A"]


    case $20        ; Si puerto B=b'00100000 (RB5=1)

serout portb.0,n2400,[$FF,$FF,"OK","B"]


    case $40        ; Si puerto B=b'01000000 (RB6=1)

serout portb.0,n2400,[$FF,$FF,"OK","C"]


    case $80        ; Si puerto B=b'10000000 (RB7=1)

serout portb.0,n2400,[$FF,$FF,"OK","D"]

end select


'portb=0

intcon=%10001000

resume

enable


end

LADO RX:

Código:
include "modedefs.bas"

cmcon=7

trisa=%00000000

trisb=%00000001

datos var byte

x var byte

k var byte

l var byte

m var byte

n var byte


for x=0 to 5

high porta.1

pause 400

low porta.1

pause 200

next x


inicio:

serin portb.0,n2400,["OK"],datos  ; la señal ingresa por portb.0

If datos="A" then RB4

if datos="B" then RB5

if datos="C" then RB6

if datos="D" then RB7

goto inicio


RB4:

for k=0 to 5

high portb.4

pause 200

low portb.4

pause 100

next k

goto inicio


RB5:

for l=0 to 5

high portb.5

pause 200

low portb.5

pause 100

next l

goto inicio


RB6:

for m=0 to 5

high portb.6

pause 200

low portb.6

pause 100

next m

goto inicio


RB7:

for n=0 to 5

high portb.7

pause 200

low portb.7

pause 100

next n

goto inicio


end

NOTA: ¿Es posible transmitir por un pin del pic lado tx y recibir por OTRO pin del pic rx?
Gracias.
 
Última edición por un moderador:
¿Es posible transmitir por un pin del pic lado tx y recibir por OTRO pin del pic rx?
Sí es posible usando SerIn y SerOut (RS-232 por software)
Pero te recomiendo que uses los módulos USART de los microcontroladores.
De esa forma se usaría HSerIn y HSerOut (RS-232 por hardware) y puedes hacer uso de la interrupción por recepción.
 
Sí es posible usando SerIn y SerOut (RS-232 por software)
Pero te recomiendo que uses los módulos USART de los microcontroladores.
De esa forma se usaría HSerIn y HSerOut (RS-232 por hardware) y puedes hacer uso de la interrupción por recepción.
Ok D@rbytes, lo intentaré con Hserin y HserOut, y tengo una idea de primero hacer que funcione con UN solo micro;es decir, enviar un dato y recibirlo en el mismo 16F877A. Ya que como dije con el 16F628A funciona todo bien. Pero como quiero en recepción, también usar display de 7 segmentos y otras cositas más, me va a faltar pines que no dispone el 628A. Luego comento. Gracias nuevamente.
 
Hola D@rbytes, gracias a tus recomendaciones he logrado hacer mi proyecto muy bien como te comenté anteriormente. Sólo para seguir practicando, ahora con Hserin (mi sistema funciona con Serin y Serout), logré hacer un circuito sencillo enviando con Hserout por un pic, a través de módulos de RF lo recibí en otro pic con Hserin, pero quise hacerlo de ida y vuelta; es decir, enviar por un pin, recibir por el otro y viceceversa, pero no me funciona, siempre me da error con respecto al Hserin, osea, cuando anulo la línea Hserin en el pic opuesto, éste si recibe la orden del Hserout del otro pic. Gracias.
 
Habría que ver el programa. HSerIn/HSerOut únicamente deben ser usados en PIC's con módulo USART, en cambio SerIn/SerOut es RS-232 por software y pueden ser usados casi en cualquier PIC.
Me parece que en PICBasic el uso de RS-232 por software, no crea dependencia de Tx o Rx, es decir, el declarar un pin para recibir, no crea un pin para transmitir.
Ya que en PIC C Compiler, si no se declaran ambos pines en RS-232 por software, (Tx y Rx) el compilador genera por defecto el faltante en algún pin.
 
Atrás
Arriba