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.