Almacenamiento de datos en comunicación serial 422

Hola buenas,
estoy poniendome con esto de los PICs y me gustaría consultar algunas dudas antes de lanzarme del todo.
Quiero usar un PIC de la serie 16F en C(compilador de CCS) para realizar una comunicación serial 422, es decir, por una patilla le entrará un flujo asincrono de datos serie provenientes de un dispositivo A que deben ir almacenandose e ire sacando por otro puerto a otro dispositivo B esos mismos datos pero organizados en paquetes definidos cada 20ms.
Mi idea era usar una interrupción cada 20 ms para generar el aviso de salida de los bits enpaquetados en mensajes y mi duda surge aqui: Si se empieza a ejecutar la interrupción que gestiona la salida hacia el dispositivo B no voy a poder seguir almacenando los bits procedentes del dispositivo A?!
Se puedes ejecutar los procesos de almacenamiento de entrada y ejecución de la interrupción simultaneamente? Ni siquiera se si con una sola UART valdría.
El tema del protocolo 422 no me preocupa pq será algo similar al 232 usando algún chip422.

Un saludo y gracias
 
Manel28 escribio: "Si se empieza a ejecutar la interrupcion que gestiona la salida hacia el dispositivo B no voy a poder seguir almacenando los bits procedentes del dispositivo A?!"

Lo mas seguro es que no vas a poder... pero eso es facil de arreglar. Usas una bandera de "Listo (Ready)" en un pin libre del micro para indicarle al dispositivo A, bajando la bandera, que no esta disponible para recibir datos, mientras esta atendiendo al dispositivo B. Cuando el paquete de datos sea entregado a B, vuelves a subir la bandera para indicarle a A que puede enviar.

Saludos
 
El problema es que el dispositivo A va a enviar bits si o si y no puedo indicarle que pare de enviar ya que la comunicación A->PIC se produce en este sentido siempre :unsure:
Creo entonces que debería jugar con los tiempos entre bits para poder procesar la interrupción
 
Entonces debes recurrir a una especie de buffer tipo LIFO en el PIC para que puedas atender a A y B.
Pregunta, con B no se puede emplear el esquema de la bandera "Listo" ?

Saludos
 
Ahi no haría falta ya que depende de las interrupciones. Cada 20ms el dispositivo B espera un paquete de x bytes, una vez que tenga su paquete esperará al siguiente.
Yo creo que mi problema es que no se imaginarme 2 procesos a la vez en el PIC( almacenar los bits de a mientras envio a B los suyos con su sincronismo). No hay algo parecido a threads para PICs?
Muchas gracias por tus respuestas
 
En las generaciones mas actuales de PIC son muy sofisticados y complejos y podria ser posible, algo parecido a multiproceso.

Sigo pensando que el buffer de datos (creo que no es LIFO propiamente lo indicado) sirve. Ese esquema se usa mucho... en el teclado de las PCs y en las impresoras y sirven para que fluyan los datos sin perdida entre dispositivos de distinta velocidad.

Tengo curiosidad de saber que es exactamente el caso que consultas.

Saludos
 
Pues creo que si tienes razón:). Estaba buscando cosas raras y lo mismo es más simple de lo que parece.
Que buffer me recomiendas? El dispositivo A enviaría en todo momento bits al buffer y el PIC ya gestionaría los bits del buffer para para enviarlos en paquetes cada 20 ms, no es cierto?
Si es así gracias por iluminarme tecnogirl (y)
 
Que buffer me recomiendas? El dispositivo A enviaría en todo momento bits al buffer y el PIC ya gestionaría los bits del buffer para para enviarlos en paquetes cada 20 ms, no es cierto?
Si es así gracias por iluminarme tecnogirl (y)

No me dijiste que es el caso concreto que consultas y es que eso podria variar la respuesta que te voy a dar...

Sin mas informacion de tu parte, el tipo de buffer no es LIFO ni FIFO sino RING (anillo), que es un poco mas complicado que los dos primeros.

A ver si me explico:

Los datos enviados por A ( D1 D2 D3 D4 D5 D6, .... ) se acomodan secuencialmene en la memoria (buffer) del microcontrolador. Se asocia un puntero que indica la ultima posicion de memoria ocupada y el cual se actualiza cada vez que llega un dato de A.

Por otro lado, se crea un segundo puntero (apuntador) al dato mas antiguo que esta en el buffer. Cuando se envie a B se actualiza el puntero.

Lo "logico" es que el puntero de los datos en el buffer siempre vaya adelante que el puntero de los datos despachados... pero hay un problema... no se puede tener un buffer de longitud infinita, asi que en algun momento, limitado por el tamaño de la memoria, el buffer llega a un fin y es cuando hay que reponer los apuntadores hacia el comienzo del buffer, por eso lo llaman anillo (RING).

Este tipo de buffer es muy empleado: tu lo usas a diario, en tu PC, hay uno implementado en el buffer de datos del teclado.

Si buscas ese tema en Google puedes encontrar una explicacion muy detallada que te ayude a entender lo que te explique.

Saludos
 
Gracias Tecnogirl, creo que mirare el tema del buffer en anillo para enterarme bien de como funciona, creo que me debería servir. La idea es como te dije que vayan entrando bits y cuando salte la interrupción empezar a entregar bits a B en FIFO, es decir, si llegan ABCDEFGHIJKLMN cuando salte la interrupción se entragarán en este orden ABC...
Gracias por tu información, me esta siendo muy útil.
Saludos
 
Atrás
Arriba