¿Cómo conecto un LED a través del pin tx en mi Atmega328?

Construí un Arduino independiente y cargué bocetos a través de este método Desde Arduino a un microcontrolador en una placa de pruebas . Me gustaría conectar un LED a través de TX como en la placa Arduino, así que simplemente lo conecté al pin TX con una resistencia conectada a tierra. Y funciona en un boceto en el que simplemente estoy enviando datos en serie a una velocidad de 9200 baudios. Los LED de Arduino TX y ATmega TX parpadean correctamente.

Sin embargo, mi aplicación involucra una tasa de baudios de 19200, pero cuando cargo este boceto, el pin TX en mi ATmega permanece encendido constantemente, incluso si no se envían datos en serie. Lo que es aún más interesante es que el LED Arduino TX parpadea correctamente para el mismo boceto. ¿Alguien puede ayudar?

¿Puede mostrarnos cómo conectó su LED? ¿O al menos dinos a qué pin exacto está conectado? Técnicamente, los pines que está usando no son los de la interfaz serial (pines 2 y 3), por lo que lo más probable es que esté usando algún otro pin que se usa durante la programación del ISP (MISO, MOSI, etc.).
Si estuviera usando el pin serial TX, tendría que conectar el LED a Vcc (con la resistencia limitadora de corriente en serie) y no a tierra, ya que la UART (interfaz serial) está inactiva en ALTO (es decir, permanecen en los niveles de Vcc cuando no hay nada). transmitido). Por lo tanto, será útil saber con qué pin conectó su LED.
@ZackB: si observa detenidamente un Arduino, verá que los LED TX y Rx no están conectados a los pines Tx y Rx de ATmega. En un Arduino, son controlados por pines en el chip de interfaz USB a serie. No he mirado las especificaciones, pero es posible que a altas velocidades en baudios o cables largos (u otras cosas con señales de transmisión reducidas) las comunicaciones comiencen a ser poco confiables porque los LED ejercen una carga adicional en la conexión. Es posible que desee considerar controlar los LED indirectamente con un MOSFET o un transistor Darlington.
@Ricardo Conecté el led a vcc y no tengo actividad alguna. No estoy muy seguro de cómo publicar una imagen de cómo está cableado el LED, pero está conectado al pin tx en un extremo y una resistencia a tierra en el otro.
@gbulmer Si lo que dice es cierto, entonces no me molestaré en intentar configurar y dirigir la transmisión en serie porque realmente no es esencial para mi proyecto.
@Ricard En contradicción con mi comentario anterior: después de conectar correctamente a Vcc, ¡el LED funciona! Gracias. (Olvidé que los leds son realmente solo diodos)
@ZackB: por favor, no dejes que te desanime; No estaba tratando de persuadirte de que no lo hicieras. Creo que los LED parpadeantes son una interfaz humana útil y sencilla. Solo pretendo advertirle que existe la posibilidad de que algo salga mal sobre la base de que se advierte con anticipación; si las comunicaciones se vuelven un poco inestables, apague los LED y vea si se soluciona. ¿Qué tamaño de resistencia usas?
@gbulmer De hecho, no estoy seguro de qué resistencia porque, según la página del producto LED , parece que no necesita una resistencia grande, pero es extremadamente brillante, incluso cuando está conectada con una resistencia de 10k. ¿Eso es normal?
@ZackB: solo para confirmar, ¿está ejecutando ese LED de 5V con una resistencia limitadora de corriente en serie de 10k ? Eso sería (5V-3.4V)/10k = 0.16mA, ¿sí? Los LED azules son muy llamativos, pero eso es muy impresionante. Estaba a punto de sugerir que si pudiera ejecutar sus LED Tx y Rx con resistencias de 4k (muy por debajo de la corriente de 1 mA), probablemente evitaría los problemas que me preocupaban. Por ejemplo, algunos convertidores RS232 a serie antiguos son de baja corriente (IIRC por debajo de 4 mA), por lo que unos 4 mA para un LED pueden ser demasiado. El efecto puede ser distorsionar algunos patrones de bits, ya que tuvo problemas para reducir la señal lo suficientemente rápido
@gbulmer Sí, el LED produce una salida razonable incluso con una corriente tan baja. En su lugar, puse una resistencia de 220 ohmios y era casi demasiado brillante para mirar. Lo tengo a 2.2k en este momento, lo que se ve bien teniendo en cuenta que solo parpadea durante una fracción de segundo.
@ZackB: gracias por los comentarios. ¿Ha probado el LED con 4,4 k, es decir, dos de esos 2,2 k en serie? Impulsado con 2.2k debería reducir significativamente los problemas que me preocupaban.

Respuestas (5)

Advertencia: aunque el OP aceptó mi respuesta como la mejor, se publicó otra respuesta mejor después de eso, que es posible que desee leer antes de leer la mía. Como señaló Chetan Bhargava, mi solución puede consumir demasiada corriente para impulsar los LED de las líneas en serie.


A continuación se muestra parte del esquema de un convertidor de RS232 a UART que hice. En él, conecté LEDs (y sus respectivas resistencias limitadoras en serie) de las líneas RX y TX a la línea Vcc, tal como podrías conectar el tuyo . Conecte los ánodos a Vcc y los cátodos a las líneas TX/RX, con la resistencia limitadora de corriente en serie (ya sea antes o después del LED).

Conexiones LED RX y TX

Los LED deben estar conectados a Vcc y no a tierra porque las líneas UART (es decir, la interfaz serial ATmega) están inactivas en ALTO, es decir, permanecen en niveles de Vcc cuando no se transmite nada.

Sin embargo, tenga en cuenta lo que dijo gbulmer en sus comentarios:

... es posible que a altas velocidades de transmisión, o cables largos (u otras cosas con señales de transmisión reducidas) las comunicaciones comiencen a ser poco confiables porque los LED ejercen una carga adicional en la conexión. Es posible que desee considerar controlar los LED indirectamente con un MOSFET o un transistor Darlington.

No he tenido problemas con esos LED conectados a las líneas seriales hasta 78600 baudios, pero podrías hacerlo si vas más rápido.


Si estaba interesado en conectar indicadores LED como retroalimentación en el programador de su ISP, podría hacer lo siguiente. El boceto ArduinoISP (firmware) ya maneja tres LED indicadores:

  1. Heartbeat en D9: parpadea (desvanecerse) para mostrar que el boceto funciona correctamente;
  2. Programación en D7: está encendido cuando se está realizando la programación real;
  3. Error en D8: encendido cuando algo sale mal.

Estos indicadores funcionan perfectamente con el boceto ArduinoISP.

Para cablear estos LED, use el siguiente esquema:

Escudo ArduinoISP

El esquema es para un Arduino Shield que hice para programar ATmegas y ATtinies, para usar con el boceto ArduinoISP. Espero que esto ayude.

Si realmente desea conectar LED a las líneas de transmisión, responda las preguntas que publiqué como comentarios, luego actualizaré mi respuesta.

Utilicé el boceto ISP para cargar el atmega, pero después de eso, solo uso tx, rx y líneas de restablecimiento entre los dos para cargar bocetos.
¡Allá! He actualizado mi respuesta para dar cuenta de sus aclaraciones y también para servir como referencia futura.
Por favor, siéntase libre de votar y aceptar la respuesta que le resultó más útil. Hágalo haciendo clic en la flecha que apunta hacia arriba y la marca de verificación cerca de la parte superior de la respuesta, en el lado izquierdo.
@Ricardo: ¿el primer diagrama es realmente parte del esquema o acaba de dibujar algo para responder a esta pregunta? Creo que está roto y no puede funcionar como se muestra. El esquema muestra Rx conectado directamente a +5V, por lo que es muy poco probable que funcione. Además, ¿podría mostrar el valor de R1 y R2? Además, ese es un R@232 a UART y la pregunta no menciona RS232.
@gbulmer ¡¡Muy bien visto!! La imagen era de un tablero de trabajo real que tengo, pero editado con Photoshop para que se vea mejor en caso de que Olin lo vea. Se ha arreglado ahora.
@gbulmer Las resistencias son ambas de 1K. La imagen es de la parte de mi convertidor conectado a los pines ATmega UART TX y RX. Lo he usado como el mejor ejemplo que tenía para ilustrar cómo conectar los LED.
@Ricardo - está bien, eso es mejor. Sin embargo, ahora leo que el circuito tiene una pieza electrónica cercana que ha realizado la conversión del nivel de señal RS232 a nivel de señal UART de 5V. Eso no es exactamente sobre lo que le estoy advirtiendo a ZackB. Lo que sugerí es una pieza electrónica local que actúe como un búfer y, por lo tanto, controle la electrónica . Estoy tranquilo acerca de cómo se aborda el problema. Sin embargo, creo que su circuito no es evidencia de que el circuito de ZackB sea robusto y confiable. Sólo estoy tratando de ser claro para minimizar la confusión.
@gbulmer ¿Puede explicar lo que quiere decir con más detalle? Por ejemplo, ¿por qué exactamente esta configuración no es confiable? ¿Porque existe la posibilidad de que se pierdan datos? ¿Porqué entonces?
@gbulmer Gracias por la aclaración. Pero si cree que mi referencia a su comentario no es clara e incorrecta, siéntase libre de editarlo. O, si quieres, puedo eliminarlo por completo. O puede colocar una respuesta aclarándola. Estoy bien con cualquier opción que elijas.
@ZackB en realidad, terminé eliminando los LED de esa pregunta que vinculé, porque sabía que estaban mal conectados...
@Ricardo: ¡No me importa en absoluto que identifiques un caso real en el que todo funcionó bien!-) Mi punto es que el diagrama del circuito superior podría representar la línea entre el convertidor RS232 a serie y el UART, no puedo ser seguro. Sin embargo, si está entre esos dos puntos finales, y todos están en su placa local, entonces no pueden estar sujetos a "cables largos (u otras cosas con señales de transmisión reducidas)". Sin embargo, si ese no es el caso, y esas señales están sujetas a esos peligros, entonces se erige como evidencia de que funciona y define las condiciones en las que ZackB debería estar bien.
@Ricardo en la figura "Conexiones LED RX y TX" (Figura 1), ¿no se extraería mucha corriente de las líneas RX y TX para impulsar los LED?
@Chetan Realmente depende de R1 y R2. Con resistencias de 1K, generalmente obtengo corrientes de 5 mA. ¿Es mucho? no puedo decir Simplemente funciona para mí. ¿Es eso suficiente para perturbar las líneas seriales?
@Ricardo, todo depende de la cantidad de corriente extraída y del controlador de salida TTL en las líneas TX y RX. Al mirar algunas hojas de datos de cables FTDI, dice que pueden hundirse 6-8ma. No estoy seguro si dibujar 5ma de los pines es una buena idea.
@Chetan: ¿estaría bien controlar los LED usando BJT como interruptores, conectando sus bases a las líneas en serie usando resistencias limitadoras en serie adecuadas?
@Ricardo sí, sería posible con BJT con alta hFE y también posible con MOSFET.

En general, no es una buena idea extraer mucha corriente de sus líneas Rx y Tx para impulsar los LED. El consumo de corriente adicional puede reducir su Fan-out a su objetivo.

Para evitar el consumo de corriente adicional de sus líneas, puede usar un OpAmp dual como LM358D para controlar esos LED.

ingrese la descripción de la imagen aquí

LM358 TI

La alta impedancia de las entradas OpAmp no extraerá mucha corriente de sus líneas Tx y Rx y preservará la distribución en las líneas.

Simulé este esquema en LTSPICE y lo verifiqué físicamente con LM324 (TI) en una placa de pruebas. Lo siento, no tenía un LM358D a mano, pero funcionan de manera similar.

Editar: gracias a los punteros de arudino.tyro. Pude probar el nuevo esquema con LM358D. El esquema antiguo está aquí: http://i.stack.imgur.com/GHauy.png

Si no me equivoco, ¿se usa este amplificador operacional como búfer? ¿así se llama?
¿Cuál es un valor típico para R1 y R2? ¿Cuál es la corriente de salida típica en 1 y 7 suponiendo 5V Vcc y 5v TTL? Creo que la clasificación de corriente máxima de 1 y 7 es de 40 mA. Pero, ¿cuál es el valor típico con los valores dados? Gracias
@arudino.tyro los valores de R1 y R2 dependen de la calificación actual del LED, la cantidad de corriente que desea pasar a través del LED y (o) qué tan brillante desea que el LED esté encendido. Puede buscar en Google la calculadora de corriente LED.
@ChetanBhargava, usé tu circuito y permanece encendido todo el tiempo. Creo que he encontrado el problema: los niveles de TTL son realmente bajos si el voltaje es de 0,7 V o menos, y son altos cuando son de 2 V o más. Entonces, con su circuito, "compara" dos voltajes. Uno es el nivel TTL en IN- y el otro en IN+. Si la salida del comparador debe ser el estado (invertido) de las líneas de señal, debe compararlas con un voltaje fijo entre 0,7 V y 2,0 V. Aquí está el problema: lo comparas con la salida. (OUT está conectado a IN+)
@ChetanBhargava, si la salida es alta (5 V), entonces la entrada IN debe ser superior a 5 V para cambiar la salida. Lo mismo ocurre cuando la salida es baja, entonces necesita un voltaje de entrada inferior a 0V para que la salida cambie. Problema resuelto 1. desconectando OUT de IN+, 2. suministrando 1.5v desde 5v a través de un divisor de voltaje (o probablemente un diodo Zener). Te agradecería si pudieras arreglar tus esquemas. Gracias
Estimado @ChetanBhargava: Sí, lo probé en una placa de prueba y permaneció encendido todo el tiempo. Busqué en Internet y encontré un tema de foro en edaboard: " edaboard.com/thread346127.html ", ¡el OP usó exactamente sus esquemas con su nombre! Debes ser miembro para ver los esquemas. Informó lo mismo. Hice el truco sugerido allí y arregló tu circuito. En lugar de una línea de retroalimentación, proporcione en v+ (sin inversión...) proporcione un voltaje entre 0.7v y 2.0v. Proporcioné 1.5v de la línea de 5v a través de un divisor de voltaje. También lo simulé en LTspice.
@arudino.tyro Gracias por los consejos, he mejorado mi respuesta. Te agradecería si puedes probar el nuevo esquema. Mi antiguo esquema era solo un búfer (no un búfer de inversión). Olvidé que las señales UART están invertidas.
@ChetanBhargava, Ok... Lo haré lo antes posible. ¿Qué programa estás usando para dibujar esquemas?

No puedo imaginar que el circuito publicado por Chetan Bhargava funcione correctamente, ya que cuando lo simulo, el LED es como lo señala arudino.tyro en un comentario constantemente. Además, el comportamiento es diferente en comparación con el circuito simple de resistencia más LED propuesto por Ricardo .

UART es ALTO cuando está INACTIVO, por lo que debe encender el LED cuando el bus está BAJO. Es posible que espere ver algunos parpadeos con el "circuito incorrecto", cuando una transmisión está en curso, porque el LED aún está activado, ¿verdad? Sin embargo, creo que esto es demasiado rápido, que puedes verlo con tus ojos (por ejemplo, 9600 kHz).

Mi propuesta para resolver este problema es el siguiente circuito. Es básicamente un seguidor de voltaje (amperaje no inversor con una ganancia de 1), pero la salida está conectada al circuito LED, que está conectado a 5 V. Esto da como resultado que la corriente fluya a través de la lámpara una vez que la entrada es negativa. .

Esquemas LED UART.

De acuerdo con LTSpice, la corriente solo fluye a través del LED cuando hay una transmisión en curso (usted ve esto como un "estado ENCENDIDO más largo" cuando las transmisiones están en curso). Si hay una pequeña pausa entre un par de transmisiones, verá un parpadeo (el LED se apaga).

Simulación LED UART.

Construyo mi circuito en una placa para I2C y UART. I2C, que también simulé, uno solo ve transmisiones más largas o si el bus está corrupto (lo cual también es bueno). Puede consultarlo: github.com/m3x1m0m/UppSense2017/blob/master/pcbs/backplane/… Con su circuito, el LED también puede parpadear, pero está encendido constantemente cuando no hay transmisión en curso, porque UART es ALTO en modo inactivo.

@Chetan Bhargava su circuito siempre estará encendido todo el tiempo. Porque UART es ALTO en modo inactivo. Para evitar este problema, cambie la dirección de los LED. Como se muestra en la imagen que se muestra a continuación.

ingrese la descripción de la imagen aquí

Creo que esto funcionará

esquemático

simular este circuito : esquema creado con CircuitLab