¿Es mejor en dos microcontroladores estrechamente conectados enviar nibbles con un recibo o un byte con un retraso para un recibo?

0

Estoy tratando de encontrar el mejor método para transferir datos de alta velocidad entre dos microcontroladores (con sus propios cristales de la misma velocidad) de la misma variedad (entre AT89C4051 y AT89S52) desde un punto de vista eléctrico.

Los he conectado de la siguiente manera:

AT89S52 P0 is connected to AT89C4051 P1
AT89S52 P1.1 is connected to AT89C4051 P3.7

El AT89C4051 tiene 6 bytes de datos que el AT89S52 necesita, y el AT89S52 siempre inicia la descarga.

Mis opciones son las siguientes:

** OPCIÓN 1. Transferir en todo el byte. **

El código en AT89C4051 (transmisor) será este:

mov R1,#DATALOCATION
jb P3.7,$  ;Wait for falling edge
mov P1,@R1 ;send out byte
inc R1     ;Increment pointer
jnb P3.7,$ ;Wait for rising edge
mov P1,@R1
inc R1        
;and this code (minus first line) repeats twice for remaining bytes

Y el AT89S52 tendrá este código:

mov R0,#DATASPACE
mov P0,#0FFh ;Make ports accept data
clr P1.1 ;lower line to get first byte
mov @R0,P1 ;Load next byte in
inc R0     ;increment pointer
nop        ;waste cycles to let AT89C4051
nop        ;be ready for next byte. Is this wait time enough under worst
           ;case scenarios???
setb P1.1  ;raise line to get next byte
mov @R0,P1 ;Load next byte in
inc R0     ;increment pointer
nop        ;waste cycles to let AT89C4051
nop        ;be ready for next byte
;and this code (minus first line) repeats twice for remaining bytes

Ese es mi enfoque de 8 bits que parece rápido, pero no tenía suficientes pines libres para usar uno para un pin de confirmación, mientras que el resto se usa.

** OPCIÓN 2. Transferir a todo lo ancho **

El código en AT89C4051 (transmisor) será este:

mov R1,#DATALOCATION ;pointer = start of data
jb P3.7,$   ;Wait for falling edge (but this means stalls which I don't like)
mov A,@R1   ;get byte
orl A,#0F0h ;and accept lower nibble. 
clr ACC.7   ;Make P1.7 our ack bit (ack=0)
mov P1,A    ;return data in lower nibble with P1.7=0 as ack
jnb P3.7,$  ;Wait for rising edge
mov A,@R1   ;get byte
orl A,#0Fh  ;and accept high nibble. (ack=1)
swap A      ;and put it in our low nibble slot
mov P1,A    ;return data in lower nibble with P1.7=1 as ack
inc R1
;and this code (minus first line) repeats 5x for remaining bytes

El código en AT89S52 (receptor) será así:

mov R0,#DATALOCATION ;pointer = start of data
mov A,@R0 ;Load byte
orl A,#0F0h ;set our nibble and make rest of lines high to receive ack
mov P1,A  ;and show it
clr P1.1  ;lower clock
jb P1.7,$ ;wait till remote is ready
mov A,@R0 ;Load byte again
orl A,#0Fh ;set our nibble and make rest of lines high to receive ack
swap A    ;swap nibbles so we get right nibble
mov P1,A  ;show data
setb P1.1 ;raise clock
jnb P1.7,$ ;wait till remote is ready
inc R0
;and this code (minus first line) repeats 5x for remaining bytes

¿cuál es mejor?

Pero la parte que me preocupa es la sincronización y el hardware.

Los micros están conectados a no más de 10 cm de distancia entre sí y todas las trazas de PCB son de 12 millas de ancho con 12 mm de espacio. Cuando ejecuto cualquier circuito de microcontrolador, si mi mano toca ambos cables del cristal, entonces la velocidad de operación parece variar (¿probablemente porque la resistencia humana afecta la frecuencia del cristal?)

En todos los entornos a los que pueden estar expuestos los micros (excepto el agua), ¿cuál de mis dos ideas es la mejor para garantizar que obtengo los datos a la mayor velocidad posible? y solo tengo 9 líneas de E / S para jugar aquí.

Entonces, ¿recurro al método nibble y espero los acuses de recibo, incluso si la respuesta toma un tiempo? ¿O estoy seguro de usar el método de byte?

Recuerde, tenemos que asumir los peores escenarios. dedos tocando el área de cristal (como prueba), baterías débiles, etc. porque lo último que quiero que ocurra es la pérdida de datos.

Para aclarar, cada cable de cristal está conectado a condensadores cerámicos de 33pF que también están conectados a tierra. (Estoy usando la configuración de cristal del microcontrolador estándar). y mis planos de tierra son grandes.

ACTUALIZAR

Según lo solicitado, incluí las conexiones importantes. Ambos cristales son 22.1184Mhz. El condensador y la resistencia conectados al pin de reinicio son 47nF y 100K. Todos los demás condensadores son de 33pF.

Tambiénincluíundiagramadetiempobásico.TuvequeusarPaintparadibujarlíneasporquenotengoningúnprogramaenmicomputadoraparahacerdiagramasprofesionales.

    
pregunta Mike

2 respuestas

2

En primer lugar, debe colocar su proyecto en un recinto que evite que los dedos humanos (o cualquier otra cosa) se acerquen tanto al cristal que tenga un efecto importante en la frecuencia.

Una vez que tenga los relojes bajo control, el primer método debería estar bien, suponiendo que haya tenido en cuenta los retrasos en el peor de los casos a través de los sincronizadores de E / S en ambos chips. Tenga en cuenta que aunque los dos procesadores se encuentran en la misma frecuencia nominal, sus frecuencias reales variarán ligeramente y la relación de fase entre ellos puede ser cualquier cosa.

Probablemente necesitarás unas cuantas instrucciones nop más en el lado maestro (el que genera el reloj). Además, esas instrucciones nop deberían venir antes de la instrucción que lee los datos, lo que le da al asesor esclavo el tiempo que necesita para reconocer la transición del reloj y colocar los datos en el bus de 8 bits.

    
respondido por el Dave Tweed
3

Bien, veamos si entendí esto bien. ¿Estás tratando de lograr una transferencia de datos de alta velocidad y estás haciendo bit-banging? Además, literalmente está contando los tics de CPU para cada operación, lo que significa que su MCU se está ejecutando con una carga del 100% de forma continua.

Aquí solo hay dos resultados posibles. O se queda sin memoria RAM para los datos entrantes, o tiene que detenerse en algún lugar y procesarlos. Asumiré que es lo último, y el procesamiento lleva mucho más tiempo que la comunicación. Digamos al menos 5 veces más.

Ahora, lo curioso de las velocidades en baudios es que el volumen de datos transferidos a 1 Mbps 1/6 del tiempo es exactamente el mismo que el volumen transferido a 170 kbps continuamente. Parece que entiendes esto, como en tu comentario "línea serial a 56 kbps con un 8N1 típico".

Además, al utilizar la comunicación por hardware, puede realizar la transferencia y el procesamiento de datos simultáneamente. Entonces, ¿por qué no usa el hardware UART disponible en ambas MCU y es perfectamente capaz de velocidades más altas que las que cita?

Ahora, en caso de que necesite esos UART para otro uso, eche un vistazo a nota de aplicación 3524 de Microchip. Es una implementación de SPI que se supone que debe alcanzar una transmisión de 2Mbps (a 32Mhz).

    
respondido por el Maple

Lea otras preguntas en las etiquetas