Algunas dudas en el planteamiento de un proyecto microcontrolado

Hola estimados, primero que todo, disculparme por el título pero la verdad no se me ocurre nada más descriptivo para el problema que tengo.

Bueno a lo nuestro, gracias al material encontrado en este foro sobre este PIC es que me puse a estudiar esto de los microcontroladores para ver si puedo llevar a buen término un proyecto que tengo en mente hace bastante tiempo. Explico lo que tengo hecho y lo que quiero hacer.

Explicación de lo hecho:

Tengo diseñado un switcher pseudoprogramable de 8 canales y 8 loops para mis pedales de guitarra el cual tiene principalmente 3 etapas.

1.- Etapa de control: Mediante un octal latch tipo D hago que sólo un canal esté activo en cada momento, es decir, tengo los 8 switches (uno por canal) al apretar por ejemplo en 1, se activa dicho canal y el array de salidas del latch estaría configurado de la forma [1 0 0 0 0 0 0 0], luego al apretar el switch 3, se desactiva en canal 1 y se activa el canal 3 quedando el array de salidas del latch de la forma [0 0 1 0 0 0 0 0]. La idea es siempre mantener sólo uno de los 8 valores de array de salida en 1 y el resto en 0.

2.- Etapa de configuración: a cada salida del latch tengo conectado un dipswitch de 8 interruptores, en el cual determino que relés se activarán en la siguiente etapa. En otras palabras, acá tengo un array de tamaño 8 que representa la configuración del dipswitch por lo cual un array del tipo [1 0 1 1 1 0 0 0] representa que los interruptores 1, 3, 4 y 5 del dipswitch están cerrados y determinará que los relés 1, 3 , 4 y 5 serán activados mientras que los relés 2, 6, 7 y 8 permanecerán desactivados, puesto que los interruptores 2, 6, 7 y 8 del dipswitch están abiertos.

3.- Etapa de relés: cada salida de cada dipswitch está conectada a la base de un transistor (todos los interruptores N de los 8 dipswitch se unen en el transistor N de esta etapa), por lo cual a los transistores que les llegue señal dejarán pasar corriente del colector al drenador permitiendo que se activen los relés correspondientes.

Básicamente lo que tengo acá es una configuración "estática" de que loop se activará en cada canal, digo "estática" porque estará determinada por cada uno de los dipswitchs.

Explicación de lo que busco hacer:

Remplazar esos dipswitchs por un PIC16F877 (o algún otro, la verdad recién me estoy metiendo en el mundo de los microcotronladores por lo cual no me extrañaría que este microcontrolador este sobredimencionado para lo que busco, pero en fin esa es otra discusión :LOL:).

Para esto pretendo programar la lógica de la etapa de control en el PIC de tal manera que éste sea el encargado de mantener sólo un canal activo en cada momento y lógicamente guardar en la memoria no volátil del PIC (no recuerdo el nombre en este momento ayer lo leí pero no lo recuerdo) el array de bits que representará cada dipswitch. Además, teniendo el PIC puedo crear varios bancos de canales, por ejemplo, puedo tener los banco A, B, C y D y cada uno de ellos tener 6 canales (6 switchs), claramente en este punto tengo que agregar 2 switchs más para navegar por los bancos un switch que suba de banco y otro que baje de banco y finalmente, agregar un switch que ponga el sistema en modo edición de tal manera que con los 8 switchs existentes (o con otros da igual) configurar el array que determinará que relés se activarán y luego guardar este array en la memoria.

Hasta acá todo bien, la idea la tengo clara (y espero haberla expuesto clara también :p) el tema que me tiene complicado en este momento, es el número de I/Os del 877, porque no tengo las 9 entradas y 8 salidas juntas, por lo cual tendré que hacer un juego de cambio de función de los pines según lo que se desee hacer, por ejemplo, imaginemos que tengo los 9 switchs (los 6 canales, los dos para navegar en los bancos y el que activa el modo de edición) conectados de la siguiente manera:

switch 1 -> RA0
switch 2 -> RA1
switch 3 -> RA2
switch 4 -> RA3
switch 5 -> RB0
switch 6 -> RB1
switch 7 -> RB2
switch 8 -> RB3
switch 9 -> RB4

Y las 8 salidas configuradas para:

salida 1 -> RA0
salida 2 -> RA1
salida 3 -> RA2
salida 4 -> RA3
salida 5 -> RB0
salida 6 -> RB1
salida 7 -> RB2
salida 8 -> RB3

Entonces he pensado hacer los siguientes pasos:

1.- Setear pines en escucha (como entrada).
2.- Al apretar uno de los switches, identificarlo (según la entrada por la que venga) y rescatar el array correspondiente.
3.- Setear pines en escritura (como salidas).
4.- Enviar el array un bit por salida.
5.- Volver al paso 1.

Mi problema acá es que me imagino que al volver a setear los pines en escucha, dejará de llegarle la señal a los transistores de la etapa de relés por lo cual se desactivarán, ¿o me equivoco? De no equivocarme, me dije, bueno pongo el octal latch a la salida del PIC de tal manera que el latch sea el que guarde temporalmente el array salido del PIC, esto hasta que se presione otro interruptor y los datos del latch se sobrescriban.

Hasta acá creo que tengo todo claro y es muy posible hacerlo, incluso me parece que voy bien encaminado, espero que así sea :LOL:. Pero ahora se me presenta otra cosa, sería deseable saber en que banco y en que canal estoy en cada momento, por lo cual se podría tener 2 displays de 7 segmentos que me indiquen el banco y el canal en el que estoy (pensé en un LCD pero en verdad es mucho para lo que necesito mostrar). Para este caso la idea es la misma, guardar momentáneamente los arrays en un latch para cada display.

Y es en este punto justamente donde está mi duda,

¿Hay alguna forma de electrónicamente determinar que tipo de salida esta dando el PIC?
Es decir, necesito distinguir las salidas destinadas a cada latch de modo de saber si se trata de una indicación para el display1, para el display2 o para el que determina que relés activar, mi idea es tener siempre conectados los tres latch a las salidas del PIC, poniendo entre medio el posible selector de salidas.

De no ser posible, ¿Hay alguna forma de que electrónicamente separar un string de 8 bits en 8 bits independientes? De ser así, puedo utilizar un puerto de salida para cada cosa (uno para el display1, uno para el display2 y otro para la configuración de los relés) y conectar a cada uno de ellos el supuesto divisor de cadena y luego enviar los bits a las entradas correspondientes del latch.

Finalmente, me gustaría pedirles un consejo, ya que ustedes que de seguro tienen más experiencia que yo en esto, a ver que cambiarían o mejorarían.

Un saludo cordial,

Atte. Metallick
 
Claro que se peude hacer... de echo lo que tu buscas es lo que se llega a conocer como "expansor de puertos", basicamente el PIC controla todo... pero obtiene y envia datos en latches externos, asi puedes en teoria tener un numero infito de entradas y salidas, en la realidad esto estara limitado por tu memoria RAM y de programa

Busca expansor PIC en el foro.. hay muchisimos circuitos disponibles, seriales, paralelos e incluso analogicos
 
Muchisimas gracias, ahora buscaré y me informaré al respecto. Como comenté, recien estoy entrando en este mundo y aún desconozco muchas cosas, voy tomando nota de los conceptos que voy aprendiendo.

Saludos y reitero mis agradecimientos.
 
Buenas gente, he estado dandole otras vueltas al tema este, y también me informé de lo que me comentaste chico3001 y la verdad es que eso de la expansión abre un sinnumero de posibilidades muy interesantes, pero creo que para lo que busco no lo necesitaré, digo creo porque en una n-écima vuelta que le doy al tema (dibujando bosquejos del flujo de lo que encesito en papel) y me he dado cuenta que no termino de comprender algo del 877, en la hoja de datos que he mirado dice que los puertos A, B, C, D y E son I/O bidireccionales pero agregan otras cosas como estas:

RA0/AN0
RA1/AN1
RA2/AN2/ Vref-
RA3/AN3/Vref+
RA4/T0CKI
RA5/SS/AN4

Y esto me confunde un poco, puesto que me imagino que puedo utilizar todos estos puertos como I/O normal ¿no? De ser así, por software basta que indique con un 1 o un 0 los que quiero que sean entradas y los que quiero que sean salidas ¿no? Porque de ser así puedo usar los puertos de la siguiente manera:

A y E como entradas (el A para los interruptores de los 6 canales y el E para los dos interruptores de bancos y el interruptor de edición)
B: Salida display 1
C: Salida display 2
D: Salida a relés

Si estoy en lo correcto, ¿Ya no necesitaría un latch para guardar los datos de la salida del PIC por el puerto D verdad? Porque me imagino que será la misma mientras no se cambie de canal (active una de las entradas).

Bueno sin más que preguntar por ahora, se despide con un saludo cordial,

Atte. Metallick

PD: igual me tocará averiguar para que se usan las demás tipos de I/O que señalan en la hoja de datos de este bicho para entender bien esto.
 
Última edición:
Normalmente los uControladores debido a espacio tienen pines con multiples funciones, y desde el programa se pueden configurar para cambiar la funcion dinamicamente

En tu caso puedes configurar todos los puertos como entradas y salidas digitales y eso te va a ahorrar comprar latches tipo D o deserializadores...
 
Atrás
Arriba