Tire alto en el software

Estaba transfiriendo el ratón ps/2 de la biblioteca Arduino a pic y me preguntaba por qué tirar alto funciona cuando se declara el pin como entrada y luego lo pone alto y eso funcionó tanto para pic como para Arduino, pero cuando declaro el pin como salida, luego escribo alto, no entendí bien el reconocimiento.

¿Por qué tirar alto requiere ser una entrada? ¿Y por qué funciona la escritura de software en una entrada?

Respuestas (1)

Una entrada que está "elevada", como usted la llama, o también comúnmente "elevada" se refiere a una señal que está conectada a un riel positivo a través de una resistencia de valor medio (generalmente unos pocos 10s de kΩ). Como tal, su nivel de voltaje está definido por el riel positivo, siempre que no fluya una corriente significativa a través de la resistencia pull-up. Dentro del PIC o AVR, se ve así:

esquemático

simular este circuito : esquema creado con CircuitLab

Si extraemos una corriente significativa de ese pin de E/S, por ejemplo, conectándolo a tierra a través de una baja impedancia, ya sea un cable, un interruptor o un transistor de colector abierto , el voltaje en el pin de E/S caerá. Esto suena como algo malo, pero puede ser realmente útil. Nos permite definir el voltaje predeterminado en el pin de E/S y luego dejar que los circuitos externos lo modifiquen. Aún mejor, debido a que no requerimos que esos circuitos definan el voltaje de estado alto por sí mismos, podría tener muchos interruptores (o resistencias de colector abierto) en paralelo, y si alguno de ellos se enciende, eso tiraría de la I/ Tensión de clavija O baja. El protocolo I2C hace uso de esto para permitir que el dispositivo esclavo reconozca la transferencia de datos tirando del pin SDA (datos) hacia abajo.

No tengo ningún conocimiento práctico de PS/2, pero supongo que lo mismo está pasando aquí. Si conduce el pin alto como salida, en lugar de hacerlo a través de una resistencia de valor medio, lo está impulsando con fuerza a través de un transistor, y esa es una ruta de resistencia mucho más baja. Necesitaría extraer mucha más corriente del pin para reducirlo, por lo que el reconocimiento no funcionará. Puede pensar en esto como un pin levantado que es un estado de voltaje débilmente definido: otros circuitos pueden cambiar el voltaje en el pin con relativa facilidad. Un pin impulsado por salida es un estado mucho más definido, y deliberadamente, ya que no desea que sea susceptible a la influencia de otros circuitos.

En cuanto a por qué funciona escribir un valor alto en un pin de entrada, esta es una peculiaridad de la forma en que se distribuyen los registros dentro del AVR y el PIC. Si el bit DDxn para un pin en particular se establece como una entrada, el AVR interpreta el bit de valor PORTxn como si conectar o no un pull up. Si el bit DDxn está configurado para ser una salida, el bit de valor PORTxn determina el nivel de la unidad (alto o bajo). Para obtener una explicación de esto, consulte la página 76 de la hoja de datos de Atmega328 . Otras arquitecturas reaccionan de manera diferente (algunas, por ejemplo, permiten la conexión de una resistencia pull-up O pull-down, a través de diferentes configuraciones de registro). Como Arduino ha crecido para incluir una gama más amplia de arquitecturas, el uso de

pinMode(pin, INPUT);
digitalWrite(pin, HIGH);

para habilitar una entrada pull-up ha sido reemplazada por

pinMode(pin, INPUT_PULLUP);

para que sea más fácil de entender y, en general, adaptable a arquitecturas más modernas.

Me ahorra escribir una respuesta. Quería / Podría incluir una referencia a, por ejemplo, atmel.com/images/doc2503.pdf Página 50.
Gracias @Scheintod: agregó el enlace como se sugirió (aunque a la hoja de datos de Atmega328)