Byte-Banging 2 8051's usando direcciones de puerto

1

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 solicita 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 en su mayoría, no estoy seguro de cuánto tiempo debe esperar el programa entre el momento en que los pines del puerto están en alto y el tiempo válido se lee en los pines.

Si no espero nada, obtendré datos incorrectos. Creo que tiene que ver con los FET dentro de mis 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 pista de PCB para los cristales y condensadores.

Cada condensador es de cerámica 33pF

Cada cristal es 22.1184Mhz que salió del mismo paquete

Cada pista de PCB en la que están conectados los cables del cristal tiene un ancho de 1,9 mm.

¿Cómo calculo el número mínimo de NOP en mi código para que se puedan capturar datos válidos en el pin del puerto después de tratarlos?

Además, dado que cada micro tiene el mismo circuito de conducción del reloj, ¿podría reemplazar los puestos (esperando por ejemplo acuses de recibo) con tres nops? ¿O seguiré experimentando una pequeña desviación del reloj?

    
pregunta Mike

1 respuesta

1

En general, no deberías usar esperas cronometradas en absoluto. En su lugar, debe utilizar un protocolo de enlace que garantice que los eventos en la base de datos se produzcan en el orden requerido.

Esos eventos son:

  • El bus de datos de las unidades maestras
  • Bus de datos de versiones maestras
  • bus de datos de unidades esclavas
  • bus de datos de versiones de esclavos

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 una serie de formas en las que podría usar dicha 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 luego sería algo como esto.

  1. El maestro controla el bus de datos, establece lectura / escritura baja (escritura), luego afirma la señal CMD .
  2. El esclavo observa CMD afirmado, lee la señal de lectura / escritura y luego lee el bus de datos y luego afirma ACK .
  3. El Maestro observa ACK afirmado, desactualiza el bus de datos, luego niega CMD .
  4. El esclavo observa CMD negado y niega ACK .

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

Para transferir el resultado:

  1. El maestro deja el bus de datos triste, establece lectura / escritura alta (lectura), luego afirma la señal CMD .
  2. El esclavo observa CMD afirmado, lee la señal de lectura / escritura. Luego lleva el resultado al bus de datos y afirma ACK .
  3. El Maestro observa ACK afirmado, lee el bus de datos y luego niega CMD .
  4. El esclavo observa CMD negado, desactualiza el bus de datos y niega ACK .

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

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas