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?