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?
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:
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.
CMD
señal.CMD
afirmado, lee la señal de lectura/escritura y luego lee el bus de datos y luego afirma ACK
.ACK
afirmado, prueba el bus de datos y luego lo niega CMD
.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 retrasa la afirmación de ACK en el paso 2. El maestro espera el tiempo que sea necesario.
Para transferir el resultado:
CMD
señal.CMD
afirmado, lee la señal de lectura/escritura. Luego conduce el resultado al bus de datos y afirma ACK
.ACK
afirmado, lee el bus de datos y luego lo niega CMD
.CMD
negado, 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.
usuario253751