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.