¿El puerto semidúplex bit-Banged para 8051 microcontroladores es demasiado lento?

1

Estaba mirando: enlace y afirma que se puede lograr más de 2mbps en un reloj de 32Mhz cuando se golpea con un 8051. Eso significa 1mbps a 16Mhz. Estoy usando un reloj de más de 16Mhz y siento que solo puedo alcanzar un máximo de 19.2kbps.

Miré su código fuente y realmente no ayuda. Tomé prestados fragmentos de código para el protocolo I2C para el 8051, pero eso es una exageración.

Debido a que los dos 8051 con los que estoy tratando se ejecutan a la misma velocidad de reloj y tienen los mismos condensadores conectados al cristal, es muy probable que este código funcione. Un enfoque más seguro que usé en el pasado fue agregar un código de verificación adicional (por ejemplo: jnb clocktriggered, $ y jb clocktriggered, $) para asegurar que se leyó el byte, pero que utiliza 2 ciclos de reloj adicionales por bit.

Pido disculpas por el código extra largo, pero repetí deliberadamente el código en lugar de usar el control de bucle para guardar 2 ciclos de reloj adicionales.

También consideré usar interrupciones pero cada llamada de interrupción desperdicia al menos 4 ciclos de reloj. 2 para saltar a una nueva dirección y 2 para regresar de la dirección de interrupción.

El microcontrolador para el que estoy tratando de optimizar esto es para un AT89C4051

Entonces, ¿cómo pueden las personas de Maxim obtener una velocidad tan alta (16000 kbps +) y no puedo? ¿Es porque bloquean funciones en su microcontrolador 8051 que les permite alcanzar tales velocidades?

;RUN=logic high starts data transfer
;DIN=Data input
;DOUT=Data output
;Worst case total cc (clock cycles): 39
;Crystal used: 22.1184Mhz
;Max UART speed = 22118400 / (39cc * 2 * 12) = 23.6K. Convert to standard = 19.2K

main:
jnb RI,nrcv      ;2cc
    mov R7,SBUF  ;1cc
nrcv:            ;3cc total receive from serial

jnb RUN,main     ;2cc
  jb RUN,$       ;2cc
  jnb IO,nosxmit ;2cc

nosrcv:          ;uC to serial
  CLR A ;had to add nops to align with receiver
  nop
  nop
  mov C,DIN
  RRC A
  nop
  mov C,DIN
  RRC A
  nop
  mov C,DIN
  RRC A
  nop
  mov C,DIN
  RRC A
  nop
  mov C,DIN
  RRC A
  nop
  mov C,DIN
  RRC A
  nop
  mov C,DIN
  RRC A
  nop
  mov C,DIN
  RRC A
  jnb TI,$ ;Trying to make it where program doesn't stall forever waiting for transmission
  CLR TI
  mov SBUF,A
ajmp main           ;36cc total transmit

nosxmit:              ;Serial to uC
  mov DOUT,C
  mov A,R7
  RRC A
  mov DOUT,C
  RRC A
  mov DOUT,C
  RRC A
  mov DOUT,C
  RRC A
  mov DOUT,C
  RRC A
  mov DOUT,C
  RRC A
  mov DOUT,C
  RRC A
  mov DOUT,C
  RRC A
  mov DOUT,C
ajmp main ;33cc total receive

actualizacion

Esta es mi configuración:

Como puede ver, para el maestro principal (AT89S52) hay un UART que usa la computadora. Tengo 4 pines GPIO que puedo usar con el AT89C4051. El módulo transceptor inalámbrico HM-TRP utiliza la UART en ese micro.

Estoy tratando de hacer un juego que requiera que cada dispositivo se conecte con el servidor, ya que el HM-TRP es semidúplex.

¿Y por qué molestarse con hardware antiguo? Su precio es más bajo y ya aprendí a usarlo y ya hice PCB's para él.

    
pregunta

0 respuestas

Lea otras preguntas en las etiquetas