Byte-Banging 2 8051 usando direcciones de puerto

Actualmente tengo dos microcontroladores configurados en los que todos los puertos están conectados entre sí (P1.1 conectado a P1.1, P1.2 conectado a P1.2, etc.). También tengo dos pares de pines GPIO adicionales conectados como líneas de señal.

Lo que quiero lograr es una forma de enviar y recibir un byte en el menor tiempo posible.

Supongamos que el maestro le pide al esclavo que agregue 1 a un número y el esclavo responde:

Aquí está mi código hasta ahora para el microcontrolador esclavo:

SLAVEDATA equ P1
SLAVEACK equ P2.0
SLAVECMD equ P2.1

jnb SLAVECMD,$  ;wait for command
mov SLAVEDATA,#0FFh ;tristate to allow input
nop             ;wait how many uS?
mov A,SLAVEDATA ;see what number came in
inc A ;add 1
mov SLAVEDATA,A ;produce result
setb SLAVEACK   ;send acknowledgement
jb SLAVECMD,$   ;wait till remote lowers comand line
clr SLAVEACK    ;clear acknowledgement
;transaction complete

Y aquí está el código para el maestro:

MASTERDATA equ P0 ;Master's P0 connects to slave's P1
MASTERACK equ P3.0 ;Master's P3.0 connects to slave's P2.0
MASTERCMD equ P3.1 ;Master's P3.1 connects to slave's P2.1

mov MASTERDATA,#20h ;Set number to 32
setb MASTERCMD      ;tell slave to increment
jnb MASTERACK,$     ;wait until its done
mov MASTERDATA,#0FFh ;tristate port to allow input
nop                 ;delay by how many uS?
mov A,MASTERDATA    ;Get result here
clr MASTERCMD       ;tell slave were done
jb MASTERACK,$      ;wait until slave understands this

Si bien creo que este código funciona principalmente, no estoy seguro de cuánto tiempo debe esperar el programa entre el momento en que los pines del puerto se configuran en alto y el momento en que se leen los datos válidos en los pines.

Si no espero nada, obtendré datos incorrectos. Creo que tiene que ver con los FET dentro de mi AT89C4051 y AT89S52 que estoy usando, pero el manual no indica cuánto tiempo debo esperar.

Ambos micros tienen los mismos cristales, condensadores y arreglos de pistas de PCB para los cristales y condensadores.

Cada capacitor es de cerámica de 33pF

Cada cristal es 22.1184Mhz que salió del mismo paquete

Cada pista de PCB en la que se conectan los cables del cristal tiene 1,9 mm de ancho.

¿Cómo calculo la cantidad mínima de NOP en mi código para que se puedan capturar datos válidos en el pin del puerto después de probarlo?

Además, debido a que cada micro tiene el mismo circuito de control de reloj, ¿podría reemplazar los puestos (esperando reconocimientos, por ejemplo) con tres nops? ¿O seguiré experimentando un pequeño desfase del reloj?

No puedes confiar en que dos cristales tengan exactamente el mismo tiempo. Incluso dos cristales del mismo paquete. No serán exactamente de la misma frecuencia. Los cristales son bastante buenos, pero no tan buenos. Incluso los relojes atómicos no son tan buenos.

Respuestas (1)

En general, no debería usar esperas cronometradas en absoluto. Más bien, debe usar un protocolo de enlace que garantice que los eventos en el bus de datos ocurran en el orden requerido.

Esos eventos son:

  • Bus de datos de unidades maestras
  • Maestro libera bus de datos
  • Bus de datos de unidades esclavas
  • El esclavo libera el bus de datos

Desafortunadamente, solo dos señales adicionales no son suficientes para administrar este proceso para un bus bidireccional. Necesitará al menos otra señal conectada entre los dos procesadores. Hay varias maneras en las que podría usar esa señal. Uno de los más simples es tratarlo como una señal de lectura/escritura, controlada por la CPU maestra.

La transacción entonces sería algo como esto.

  1. El maestro maneja el bus de datos, establece lectura/escritura baja (escritura) y luego afirma la CMDseñal.
  2. El esclavo observa CMDafirmado, lee la señal de lectura/escritura y luego lee el bus de datos y luego afirma ACK.
  3. El maestro observa ACKafirmado, prueba el bus de datos y luego lo niega CMD.
  4. Esclavo observa CMDnegado, y niega ACK.

Tenga en cuenta que si el esclavo está ocupado con otra cosa cuando el maestro inicia la transacción, simplemente retrasa la afirmación de ACK en el paso 2. El maestro espera el tiempo que sea necesario.

Para transferir el resultado:

  1. El maestro deja el bus de datos triestablecido, establece lectura/escritura alta (lectura) y luego afirma la CMDseñal.
  2. El esclavo observa CMDafirmado, lee la señal de lectura/escritura. Luego conduce el resultado al bus de datos y afirma ACK.
  3. El maestro observa ACKafirmado, lee el bus de datos y luego lo niega CMD.
  4. El esclavo observa CMDnegado, prueba el bus de datos y niega ACK.

Tenga en cuenta que si el esclavo requiere algo de tiempo para calcular su resultado, simplemente retrasa la afirmación de ACK en el paso 6, y el maestro simplemente esperará el tiempo que sea necesario.

Supongo que tendré que usar un bus nibble bidireccional ya que ilustraste la necesidad de tres señales de control