Línea serie de multiplexación

4

He construido este sensor de identificación para una pista de automóvil de slot Scalextric, basado en un PIC12F629. El sensor de ID envía el ID de un automóvil detectado como una señal RS232 en un pin (nivel TTL).

Mi pregunta es, ¿cómo puedo recibir datos de como cuatro de estos microcontroladores en USART de otro microcontrolador (PIC18F2550)?

Se me ocurrieron estas posibilidades:

  1. Simplemente conecte todas las líneas seriales "directamente" al pin RX del PIC18 y espere que dos autos no pasen ningún sensor que se cierre en el tiempo, por lo que las señales se superponen entre sí. Esto podría ser un buen comienzo y probablemente funcionará el 99.9% del tiempo. Quiero decir, la probabilidad matemática de que se detecten dos autos que se cierran en el tiempo no puede valer el esfuerzo de las otras sugerencias ... después de todo, es un proyecto de pasatiempo.
  2. Implemente una señal de ocupado que se genera cuando los sensores de ID envían datos y se verifican antes de enviarlos.
  3. Agregue un chip multiplexor de lujo que coma las señales en serie y las emita en una sola línea.

Cada chip del sensor de ID se codificará con un identificador que se envía como parte de los datos, para que puedan separarse en el extremo receptor.

Actualización: Se agregó más información sobre el hardware del sensor.

    
pregunta Anttu

5 respuestas

0

Encontré este sitio con una solución llamada BlackNet. Se basa en un protocolo bastante simple en el que la idea es que cada nodo de la red tenga un intervalo de tiempo propio. Es decir. Es una especie de lógica de round-robin. La última imagen en la página muestra un esquema con la menor cantidad de componentes necesarios para que funcione.

Utilicé esta idea y acabo de conectar los dos sensores que he construido directamente al pin RX en el PIC18F2550. Sin embargo, no implementé el protocolo round-robin, sino que simplemente pegué los datos en la línea (y espero que solo uno transmita a la vez). Hasta ahora ha funcionado bastante bien ...

Para futuros lectores: Si es fundamental que sus datos siempre se transmitan, la solución que he utilizado probablemente no sea una buena idea. Sin embargo, si rara vez envía datos y puede vivir con la posibilidad de que colisionen y desea la solución más sencilla posible, creo que esta es lo suficientemente buena.

    
respondido por el Anttu
2

Si configura su protocolo de modo que los autos solo respondan cuando las consultas del controlador, entonces puede unir (al menos a nivel lógico) a todos juntos.

El truco es si tiene RS-232 real (con 1 = -6 a -12 V y 0 = 6 a 12 V) o solo una línea lógica estándar (1 = VCC, 0 = GND). La hoja de datos o un alcance deben responder esto.

Si es lógica estándar, podría ser realmente fácil. Si sus sensores pueden controlar sus controladores de salida, entonces programe para que no conduzca la salida a menos que salga un mensaje. Si tiene que dejar el controlador de salida encendido todo el tiempo, haga que conduzca uno o dos transistores para hacer una configuración de "colector abierto", conecte todos los colectores de los sensores juntos, y tire de la línea conectada a VCC y conéctela a El pin RX de tu controlador principal. Esto funciona porque el protocolo RS-232 está inactivo en un estado lógico 1. Si se usan niveles de señal RS-232, entonces tiene que cambiar un poco la configuración del transistor, pero seguirá siendo un colector abierto en el fondo.

El controlador principal simplemente solicita a cada sensor sus datos en secuencia. Cada sensor responde cuando se consulta. De esa manera, no tiene más de una que maneje la línea de RX a la vez, que es el objetivo principal.

Ahora, si no puede hacer que sus sensores hablen solo cuando se les habla ... entonces su problema se volvió muy difícil. Tanto que la respuesta simple es dar a cada sensor su propio puerto serie, tal vez utilizando controladores de 8 pines como administradores de sensores, que luego se pueden conectar a un bus serie cooperativo. Otras técnicas, como la detección de colisiones con la retransmisión de mensajes (como lo hizo 10base-T Ethernet), son mucho más complejas.

    
respondido por el Mike DeSimone
2

Si su sensor puede acomodar una línea "lista" y aplazar los eventos que llegan cuando no está confirmado, transmitiéndolos cuando está, su mejor opción es enviar un cable de ocupado separado a cada sensor y usar un "AND" "Puerta para combinar las señales de todos los sensores. Yo sugeriría que si tiene cuatro sensores, debe hacer un ciclo de los cables "listos" en forma de turno rotatorio, con un tiempo "muerto" entre ellos (cuando nadie está "listo"); Si un byte entra durante el tiempo "muerto", suponga que fue enviado por el último sensor activo. Establezca el tiempo "listo" el tiempo suficiente para que un sensor pueda reaccionar, y el tiempo muerto el tiempo suficiente para que el sensor tenga tiempo de terminar de transmitir un evento que ocurre justo antes de que se desestime su línea "lista".

Editar

Basado en descripciones adicionales, dado que aparentemente cada sensor tiene un número de identificación conocido distinto, estoy pensando que el mejor enfoque puede ser tener una sola línea serie que esté conectada a una salida PWM a través de una resistencia paralela y un diodo, de modo que se levanta a 1,900us cada 2 ms, pero se baja a 200 us (si uno pudiera tener un interruptor PWM entre activo-bajo y flotante, eso sería aún mejor). Tan pronto como se ve un automóvil, un sensor debe iniciar la siguiente máquina de estados, y hacer un seguimiento de las decenas de microsegundos que han transcurrido desde que comenzó a ejecutarse.

  1. Espere a que la línea de datos esté alta.
  2. Espere a que la línea de datos esté baja.
  3. Borrar temporizador de línea baja
  4. Espere a que la línea de datos aumente, aumentando el temporizador de línea baja (y el temporizador principal) mientras espera.
  5. Si el temporizador indica que la línea estaba baja menos de 200us, vuelva al paso 2
  6. Continúe incrementando el temporizador de línea baja mientras observa que la línea esté baja, hasta que el temporizador alcance un período de duración único que sea único para la ID del nodo. Si la línea baja en ese tiempo, vuelva al paso 3.
  7. Establezca la línea de datos para emitir, transmita los datos a una velocidad de 16 us / bit o más (conduciendo la línea de forma activa tanto a nivel alto como bajo), y comience a buscar el próximo automóvil. Tenga en cuenta que los datos deben incluir el número de intervalos de 10 us que han transcurrido entre ver el automóvil y comenzar la transmisión.

Usando un UART, este enfoque debería permitirle a uno procesar los autos que llegan a cualquier sensor, en cualquier orden, y resolver sus tiempos dentro de 10 us, con la condición de que los autos se procesarán secuencialmente a una velocidad de uno cada 2 ms, y los sensores estarán "ciegos" entre el momento en que vean un auto y la CPU principal llegue a procesarlo. A menos que haya una gran cantidad de sensores, eso no debería plantear un problema. Tenga en cuenta que la CPU principal no tiene que tener una sincronización precisa en nada más que en su salida PWM. Todo lo demás se puede inferir del flujo de datos en serie (incluidos los "cortes largos" que resultan de los "bajos" pulsos de PWM).

    
respondido por el supercat
0

Puede implementar un protocolo MODBUS en modo RTU con la interfaz RS485 que funciona bien en PIC (no estoy seguro de su PIC).

Puedes tener una línea multipunto para descansar tus diferentes dispositivos de microcontroladores y tener una buena comunicación entre ellos en el UART serie.

Puedes hacer tu PIC18F2550 como un maestro que iniciará la transacción desde cualquier otro 4 controlador.

    
respondido por el OnkarK
0

Usa multiplexación por división de tiempo. El maestro envía un pulso de sincronización en una línea separada que los esclavos usan para reiniciar un temporizador. Cuando un esclavo tiene datos para enviar, espera hasta que el temporizador iguala (número de esclavo * ancho de la ranura de tiempo) antes de enviar. El intervalo de tiempo debe ser lo suficientemente largo como para enviar el paquete y tener en cuenta la inexactitud del reloj entre los sensores.

Eléctricamente, es posible que desee levantar la línea de TX compartida y alternar entre 0 y triestado para transmitir en lugar de obtener la corriente para afirmar un 1.

    
respondido por el joeforker

Lea otras preguntas en las etiquetas