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.