Velocidad máxima confiable del pin GPIO dado solo capacitancia y sin resistencia

Busqué información sobre mi microcontrolador AT89S52 y parece que no puedo averiguar la velocidad máxima a la que puedo operar un pin GPIO.

Lo estoy ejecutando con un reloj de 22,1184 Mhz y, a veces, noto que cuando modifico el valor de un puerto, no se actualiza de inmediato sin agregar varias declaraciones NOP, pero no quiero adivinar. Quiero saber los valores para poder ajustar el código.

Esta es la información de la hoja de datos que obtuve:

ficha de datos

Enumera la capacitancia del pin, pero no veo nada sobre la resistencia del pin. ¿Cómo calculo la resistencia aquí? ¿O hay otra forma de calcular la velocidad máxima confiable de procesamiento de pines?

Probablemente no tenga nada que ver con la capacitancia. Mire el conjunto de instrucciones para determinar si el comando asm que carga ese registro con los valores de salida toma > 1 ciclo. Inspeccionar la arquitectura.
electronics.stackexchange.com/questions/25551/… consulte este enlace, creo que encontrará su respuesta.
¿Cómo determina si hay un retraso entre "modificar el valor del puerto" y la "actualización" real del valor del puerto? ¿Cómo sabe cuándo modifica realmente el valor del puerto?
La impedancia interna del controlador GPIO se puede estimar a partir de la hoja de datos VoL = 0,45 V cuando IoL = 1,6 mA. 450 mV / 1,6 mA = 280 ohmios. Port0 tiene alrededor de 140 ohmios. La conducción ALTA tiene una impedancia mucho más alta (parece alrededor de 3 kOhms), nuevamente se puede estimar por la caída de voltaje a la corriente especificada. Pero todo esto no tiene nada que ver con la capacitancia de los pines ni con los NOP.
En realidad, conducir 10 pF de alto con un controlador de 3 k da un tiempo de rampa de aproximadamente 30 ns, por lo que apenas es suficiente para generar 20 MHz.
@AliChen, cuando trato de ejecutar un programa que tiene dos micros comunicándose entre sí a través de pines GPIO, encuentro que las cosas no funcionan bien si un micro envía salida a un pin GPIO al mismo tiempo que el otro micro intenta leer la entrada desde el mismo pin. (por ejemplo, si un código de microproceso le gusta MOV P2,Aexactamente al mismo tiempo que los otros procesos MOV A,P2)
No existe tal cosa como "al mismo tiempo" cuando tiene eventos en dos lugares diferentes (y probablemente independientes). Tiene un problema clásico de sincronizar una comunicación entre dos dominios de reloj. Busque en la literatura las palabras clave "cruce de dominio de reloj".
Además, incluso si los dispositivos están perfectamente sincronizados, no hay forma de que escribir en un puerto y al mismo tiempo leer esos pines de otra MCU funcione de manera confiable. Deberá esperar al menos hasta que finalice la instrucción de salida. También debería agregar ese caso de uso a la pregunta en sí; sin ella, su pregunta es bastante vaga y difícil de responder.

Respuestas (1)

La hoja de datos especifica una corriente alta de salida de 60 uA a 2,4 V para los puertos 1-3 y 800 uA para el puerto 0 (pero solo en modo de bus externo). A partir de esto se pueden calcular las resistencias equivalentes. 5,0 V-2,4 V = 2,6 V. 2.6V/60uA = ~43kΩ. 2,6 V/800 uA = ~3,3 kΩ.

En el modo de E/S, el puerto 0 está abierto, por lo que se deben aplicar resistencias pull-up externas. ¿Cuál es la resistencia pull-up de valor más bajo que todavía permite que el pin baje a la lógica TTL 0? Los pines del puerto 0 pueden absorber 3,2 mA a 0,45 V. 5V-0,45V = 4,55V. 4,55 V/3,2 mA = ~1,4 KΩ. Los otros pines del puerto pueden absorber 1,6 mA, por lo que podrían tener resistencias pull-up externas tan bajas como ~2,8 kΩ.

El 89S52 necesita 12 relojes por ciclo de máquina. A 22,1184MHz esto corresponde a 0,543us. 43kΩ x 10pF = 0,43us, por lo que incluso los pull-ups débiles en los puertos 1-3 deberían ser lo suficientemente fuertes como para alternar a toda velocidad. Sin embargo, cualquier cosa conectada a un pin (incluso una sonda de alcance) tendrá su propia capacitancia que aumentará el tiempo de subida.

anything connected to a pin will have its own capacitance which will increase the rise time.... Eso tiene sentido. Entonces, si conecté un pin GPIO de un 89S52 a un pin GPIO de otro 89S52, y un 89S52 cambió el estado de ese pin, entonces tengo que hacer que mi programa en ambos 89S52 espere 0.86uS (2 ciclos de máquina) para poder hacerlo. reconocer los cambios en el pin?
Si quisiera leer el estado del pin en la misma MCU, o si quisiera alternarlo hacia arriba y hacia abajo, tendría que esperar al menos 1 ciclo. 2 ciclos proporcionarían un margen de seguridad. La otra MCU probablemente estaría leyendo la señal de forma asíncrona, por lo que habría al menos un ciclo de fluctuación y es posible que deba mantener el estado de salida durante 2 ciclos o más para asegurarse de que la MCU receptora lo detecte (incluso si el tiempo de subida es corto).