Estoy tratando de descubrir la mejor manera de integrar todos los dispositivos a la perfección en los microcontroladores basados en 8051. Si cada dispositivo tuviera la misma velocidad baja, entonces podría multiplexar todos y cada uno de ellos dentro de la rutina del temporizador por sí mismo y olvidarme de la interrupción en serie, pero un dispositivo debe ejecutarse aproximadamente 10 veces más rápido. Pero encontré un cuello de botella ...
INTERRUPTS
Sin duda, la forma óptima es tener una interrupción para la rutina en serie y otra para el temporizador para que todo se ejecute limpiamente. He redactado el código en bruto a continuación:
Org (Timer)
(insert software uart routines here)
reti
Org (Serial Interrupt vector)
push PSW
mov PSW,#SERIALBANK
jbc RI,gotabyte
jbc TI,sentabyte
exitserial:
pop PSW
reti
gotabyte:
mov CHAR,SBUF
ajmp exitserial
sentabyte:
inc R1
cjne R1,#ENDOFBUF,notend
ajmp exitserial
notend:
mov SBUF,@R1
ajmp exitserial
Pero hay un gran problema. Parece que puedo recibir y enviar datos correctamente en el dispositivo de mayor velocidad mientras todos los dispositivos de menor velocidad están desincronizados (solo porque la interrupción en serie tiene prioridad y retrasa la ejecución del temporizador que maneja los UART restantes por el tiempo que lleva para terminar su interrupción), o puedo hacer que todos los dispositivos de baja velocidad funcionen correctamente mientras el dispositivo de alta velocidad no está sincronizado (solo por la situación opuesta ... el temporizador se ejecuta justo en un mal momento mientras que la rutina en serie intenta enviar o recibir datos). Confíe en mí, incluso ejecuté un temporizador y verifiqué los indicadores de TI y RI a una velocidad mucho mayor que la del UART y que incluso devolvió datos inexactos.
Así que pensé en una idea
Según mis tarjetas de circuitos anteriores y el hardware disponible para mí, estoy pensando en descargar la mayoría de las rutinas en serie a otro microcontrolador basado en 8051 (AT89C2051), ya que gran parte de los datos en serie que ingresan al sistema principal se descartan casi de inmediato. después del procesamiento (como la suma de comprobación).
La pregunta es, ¿cuál es la mejor forma de transferir datos entre los dos microcontroladores?
En su estado actual, puedo crear uarts adicionales y todos corro a una velocidad lenta en el microcontrolador principal, pero estoy tratando de pensar en una forma de enviar los datos de manera confiable a través de tres cables sin introducir retrasos graves a ambos lados hasta el punto en que los datos de cualquier dispositivo no estén sincronizados.
Uno puede sugerir SPI, pero eso implica tener un microcontrolador parado hasta que se ajuste la línea del reloj. Convertirla en una línea UART no funcionará porque el microcontrolador más pequeño que está conectado a la radio de alta velocidad podría perder caracteres porque la rutina en serie interrumpirá constantemente el flujo de datos.
Si mi idea de usar dos micros es la mejor para mi situación, ¿puede alguien dirigirme a un buen protocolo de datos asíncrono al que pueda recurrir para usar solo tres cables?
Para mayor claridad en mi diagrama, S1 a S4 son sensores individuales, y RIN y ROUT son conexiones al módulo de radio. DIN, DOUT y DCLK son Entrada de datos, Salida de datos y Reloj, pero esos nombres podrían cambiarse más adelante.
Ambos micros son operados por cristales independientes de 22.1184Mhz con condensadores cerámicos de 33pF conectados entre cada pin de cristal y tierra.