Como tengo 10 líneas de E / S conectadas entre dos microcontroladores (AT89C4051 + AT89S52), estoy tratando de salirme con la transferencia de datos elegante. En lugar de pasar meses rehaciendo una placa de circuito completa, estoy tratando de dividir el puerto de 8 bits en dos nibbles para poder lograr una transferencia de datos bidireccional, así como poder omitir el paso de inflexión y espera.
Excepto en algún lugar de mi código, algo está mal. Logré transmitir los datos del maestro al esclavo y los datos se reconocen, pero cuando el esclavo devuelve sus datos al maestro, el valor devuelto es incorrecto. En este ejemplo, se supone que el maestro envía el valor 5 al esclavo, y luego se supone que el esclavo responde con el valor 9, pero en cambio el esclavo devuelve el valor de 15 (0Fh). Lo sé porque usé la rutina hexadecimal (incluida en el fragmento de código) que convierte el valor devuelto en hexadecimal.
Siento que obviamente hay algo mal en mi código pero mi cerebro está frito. ¿Qué puedo hacer para que este código funcione?
;Port is organized as: rrrrssss where:
;r= 4-bit data received from master
;s= 4-bit data sent to master
;Master begins with this function
test59:
mov A,#05h ;set output to 5
lcall uCdat ;process
lcall printhex ;print result to screen in hex
;Expecting A=09h, but always getting A=0Fh. why?
ret
;mini micro issues a 4-bit command to big micro
;then waits for a reply
;Low nibble of accumulator = data to send
uCdat:
orl A,#0F0h ;Make high nibble tristate
mov D,A ;Send XXXXdata to port
clr ACT ;Tell remote were ready
jb ACK,$ ;Wait till remote is done
mov A,D ;Get data
anl A,#0F0h ;High nibble is output
swap A ;Make it low nibble
setb ACT ;Tell remote were ready
jnb ACK,$ ;Wait till remote is done
ret
;Function takes input as accumulator and prints out "xnn " where n=hex character
;Example. if A=#0ABh, then xAB is printed.
printhex:
setb NIBNO
mov R7,A
mov A,#'x'
lcall cout ;each call to cout prints a digit on serial line
mov A,R7/swap A
nextnib:
anl a,#15
add a,#246
jnc phexb
add a,#7
phexb:
add a,#58
lcall cout
mov A,R7
jbc NIBNO,nextnib
mov A,#' '
lcall cout
ret
;Slave starts with this function
get5send9:
;Stall until we receive a 5.
test1:
lcall miniuCdatin
jc test1 ;if C=0, then remote lowered ACT line and we have data.
cjne A,#05h,test1 ;Input must be 5 to proceed
;Send out 9
mov A,#09h
test2:
lcall miniuCdatout
jnc test2 ;Stall until data is sent out
;All this is processed, but apparently 0Fh is returned to master instead of 09h
ret
;Slave calls to get data from master
miniuCdatin:
mov C,ACT ;Check action
jc noUdat
mov A,D ;receive XXXXdata from port
anl A,#0Fh ;get request into low nibble
noUdat:
mov ACK,C ;Acknowledgement = Request state
ret
;Big slave then processes data then calls this to give result.
miniuCdatout:
mov C,ACT
jnc noUdat2
swap A ;make output high nibble
orl A,#0Fh ;Tristate lower nibble
mov D,A ;send dataXXXX to port
noUdat2:
mov ACK,C
ret