Bus de datos bidireccional dividido en nibbles que no devuelven datos correctos - 8051

0

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
    
pregunta Mike

0 respuestas

Lea otras preguntas en las etiquetas