Autor Tema: Problema de tiempo...  (Leído 2103 veces)

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

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
Problema de tiempo...
« en: 04 de Diciembre de 2004, 21:24:00 »
Les comento una duda existencial que tengo hace bastante tiempo...
En un momento hice un proyecto con el puerto paralelo prácticamente sin componentes electrónicos y me surgió una duda. Para que se entienda lo voy a explicar de la manera más sencilla que pueda:

Supongamos que yo conecto un cable en uno de los pines de un puerto de salida del puerto paralelo de la PC (de ahora en más PS) y le conecto un switch y de ahí conecto un cable a un pin de un puerto de entrada del mismo puerto paralelo (de ahora en más PE).
Entonces hago un programa en la pc que haga lo siguiente:

Repetir
PS = 1
Si PE = 1 then
Print "Interruptor pulsado"
Fin Si
PS = 0         (atención con esta línea)
Fin Repetir

Cual podría ser el problema? Yo en ese momento pensé: que podría llegar a suceder si la electrónica del puerto paralelo fuere lo suficientemente lenta como para no llegar a tiempo a poner el PS en 1 antes de leer el PE? Se produciría una lectura errónea... (PS termina siendo 0 en el bucle). Afortunadamente en ése caso el programa funcionando bajo Windows era más lento que el puerto, porque Windows ya de por sí tiene que gestionar otros procesos y se producen demoras de software, entonces el puerto es más rápido y nunca tuve ese problema.

A que viene todo esto? Parece que con los PIC la situación no es la misma...

Tengo el siguiente programa (en PBP) que multiplexa 40 switches a través de 5 pines de el puerto C configurado como salida y los 8 pines del puerto B configurado como entradas (8 x 5 = 40).

"********Programa principal**********

PORTC = %00011111

loop:
EstadoPuertoB = PORTB

if EstadoPuertoB > 0 then
   GOSUB sector1
endif

Pause 100
goto loop

"***********Sector 1 ***************

sector1:
PORTC = %00000001 "RC0

if PORTB.0 then
   HSEROUT ["1",13]
endif

if PORTB.1 then
   HSEROUT ["2",13]
endif

if PORTB.2 then
   HSEROUT ["3",13]
endif

if PORTB.3 then
   HSEROUT ["4",13]
endif


if PORTB.4 then
   HSEROUT ["5",13]
endif


if PORTB.5 then
   HSEROUT ["6",13]
endif

if PORTB.6 then
   HSEROUT ["7",13]
endif

if PORTB.7 then
   HSEROUT ["8",13]
endif

Pause 100
PORTC = %00011111
RETURN

end
"******************************

Con esta rutina yo lo que hago (por ahora) es revisar la primera fila de 8 switches conectados en un terminal en paralelo con RC0 y en el otro terminal a PORTB y que me devuelva el estado vía serie.

RB0 ------/ -------|        |--------/-------RB0
RB1-------/--------|        |--------/-------RB1
RB2 ------/ -------|        |--------/-------RB2
RB3-------/--------|        |--------/-------RB3
RB4 ------/ -------|         |--------/-------RB4
RB5-------/--------|        |--------/-------RB5
RB6 ------/ -------|         |--------/-------RB6
RB7-------/--------|         |--------/-------RB7
..........................|.|
..........................|.|
RC0----------------|         |
............................|
RC1------------------|

Ahí está la prueba evidente que lo mío no es el "ASCII Art", tuve que agregar unos puntos para que no se deforme, pero bueno...
Lo otro que quiero que se note es como se van multiplexando los pines del puerto C con el B.

El problema es el siguiente:
Cuando yo acciono cualquiera de los switchs conectados a RC0 todo funciona bien.
El problema es que si acciono el switch de la combinación RC1-RB0 me dá una falsa lectura como si fuera RC0-RB0 (nótese que esa rutina no existe) y el programa me devuelve "1". Lo mismo con la combinación RC1-RB1 que devuelve RC0-RB1 o sea "2". El resto de RC1 funciona bien (no devuelve nada).

Mi teoría es la siguiente:
Yo al principio de cada ciclo pongo la parte que uso del puerto C en alto (PORTC = %00011111) y después si hay actividad lo voy rotando. Aparentemente cuando hago PORTC = %00000001 y leo RB0 el puerto C todavía está en el estado "00011111" o sea que todavía no me actualizó el cambio al menos electrónicamente. Lo mismo sucedería cuando leo el estado de RB1. Por lo visto después se estabiliza y el resto de las lecturas del puerto B funcionan bien.

Para comprobar dicha teoría comoque un "Pause 50"  después de la línea "PORTC = %00000001" y funciona bien para cualquier combinación del puerto B, de esta manera le doy tiempo a estabilizarce en ése estado.
Pero, esto debería funcionar en tiempo real y poner en "Pause 1" para que me tome los cambios ya me parece un desperdicio de tiempo para lo que es la velocidad del PIC (20Mhz).

Puede ser posible? Cual es la solución?
Ahhh.... me olvidaba. Las pruebas estas las estoy haciendo en ISIS.

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
RE: Problema de tiempo...
« Respuesta #1 en: 05 de Diciembre de 2004, 16:40:00 »
hola, a tu pregunta te contestaria q no, q no es posible, no tiene q ver con os tiempos de estabilizacion, q si bien existen, son bastante mas rapidos, o sea, menos de un ciclo de maquina, con 4Mhz tardaria menos de un microseg.

si bien conozco algo de basic no conozco cual es el resultado del compilador y creeria q pasa por alli la cosa...
para q el prog. sea mas parejo, deberias luego de poner el portC en 00000001 leer el portB en una variable y luego analizar esta bit a bit, dado q de la manera q lo haces el prog. lee cada vez el port y por supuesto el dato puede cambiar mientras....
los delay no deberian ser necesarios ninguno y tal vez solo un "nop" seria demasiado...

si el circuito es real y lo q tienes es un switch o un teclado !!!! debes considerar los tiempos humanos y los rebotes y eso si cambiara la cosa, una tecla de un teclado dependiendo de la calidad tarda hasta 3 milisegundos en estabilizarse y no tener mas rebores....

fijate si podes poner algo mas para verlo....
suerte...

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: Problema de tiempo...
« Respuesta #2 en: 05 de Diciembre de 2004, 19:24:00 »
Gracias por tu respuesta wqtrp!!!
Con respecto a los tiempos de estabilización estube buscando en el datasheet, pero todavía no encontré la parte específica donde diga cuanto tarda un puerto en responder en HIGH o LOW. Aunque supongo que tanto el tiempo de máquina como el tiempo de los pins debe estar relacionado con respecto a la velocidad del oscilador (en este caso es de 20Mhz).
La idea de almacenar el valor del puerto B en una variable para después analizarla no es mala, la voy a probar, aunque desde ya me parece que el problema no pasa por ahí. Este puerto no varía la lectura de esa manera, si observás bien te vas a dar cuenta que puede fallar la primera vez, pero en el próximo ciclo el switch en cuestion ya está "estabilizado", asi que no me podría dar ése error en todos los ciclos.
Y con respecto al "debouncer" acá no se aplica, o por lo menos ISIS no lo tiene en cuenta, o si?

Voy a ver de que manera puedo subir todo el circuito así lo ven todos, porque creo que todavía hay dudas de como funciona esto. La verdad no me esperaba este problema y me está costando trabajo encontrarle la vuelta. Mientras tanto espero consejos y respuestas, creo que esto se va a dar a la polémica.... je je!
Quizás el problema este dado en la forma que implemento el teclado, que aunque es sencilla no la he visto en ningún lado.

Puedo dar gracias a que existen programas como ISIS, si esto me llegara a pasar en un circuito real no sabría encontrar por donde pasa el problema...

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: Problema de tiempo...
« Respuesta #3 en: 05 de Diciembre de 2004, 19:37:00 »
No puedo subir el proyecto...
Alguien sabe como? Son apenas 100Kb. Si alguien sabe como que me avise, sinó lo paso por mail.
Está bueno, inclusive tiene un sistema de teclado que me gustaría que lo vieran...

Salu2.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17756
    • MicroPIC
RE: Problema de tiempo...
« Respuesta #4 en: 06 de Diciembre de 2004, 00:54:00 »
Intenta subirlo a todopic3.foro.st y si aún así no puedes, envíamelo por privado a la cuenta de hotmail.
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: Problema de tiempo...
« Respuesta #5 en: 06 de Diciembre de 2004, 09:54:00 »

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: Problema de tiempo...
« Respuesta #6 en: 06 de Diciembre de 2004, 09:55:00 »
Ahí están los enlaces.... de paso acepto todo tipo de críticas con respecto al diseño o lo que sea.
Salu2.

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
RE: Problema de tiempo...
« Respuesta #7 en: 06 de Diciembre de 2004, 16:18:00 »
no hay caso, no puedo acceder al link.....

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: Problema de tiempo...
« Respuesta #8 en: 06 de Diciembre de 2004, 18:02:00 »
Esta en el link que tiró Nocturno:

todopic3.foro.st

El topic se llama:

Problema de tiempo...


 

anything