Hola Marlon. Se que este video es algo antiguo, pero igual quiero dejar mi comentario. En efecto le he encontrado una utilidad a la interrupción de TX del USART. Se puede usar para cargar el siguiente byte en el registro de transmisión inmediatamente después que se envié el anterior. Puede que no sea la gran cosa, pero en realidad esto puede evitar que el microcontrolador se quede bloqueado cada vez que se tiene que enviar un byte. Me explico: Usualmente la velocidad de transmisión de los periféricos es muy inferior a la del microcontrolador. Un baudrate de 115200 es 139 veces más lento que la velocidad del CPU a 16Mhz. Con los ciclos while la ejecución del código se bloquea y este tiempo podría estar siendo aprovechado para realizar otras tareas. El siguiente código funcionaria de igual manera, pero sin bloquear el microcontrolador: #define LENGHT 13 char message[LENGHT] = "Hello world" char current_byte = 0; ISR(USART_TX_vect) { UDR0 = message[current_byte]; current_byte++; if(current_byte >= LENGHT) { current_byte = 0; } } Este programa imprime "Hello world" infinitamente en el monitor serie. Hay que hacer algunos ajustes como programar una inicialización, es decir cargar el primer byte para que la interrupción comience a funcionar. Este es solo un código de ejemplo y es mejorable por mucho. Funcionaría más o menos así: La interrupción carga el siguiente byte en el registro. Una vez cargado, el programa sale de la interrupción y regresa a la ejecución del código principal. Por lo tanto, no tiene que esperar a que se termine de transmitir el byte bloqueándose en el proceso, ya que la interrupción se volverá a llamar automáticamente cuando el byte se haya transmitido. Esto puede ser útil en aplicaciones donde se requiera una respuesta rápida de las entradas o cuando haya que hacer multitasking. O al menos esa es una de las utilidades que le he encontrado a esta interrupción. Un saludo Marlon y gracias por hacer este excelente video.
Marlon soy ing en electronica y estoy retomando los microcontroladores despues de mas de 10 años, la verdad mis respetos y admiración , son de mucha ayuda tus videos pues es muy poca la información de micros avr en español, saludos desde hermosillo sonora mexico
Hola, Juan! Mil gracias por tus palabras. En verdad me alegra mucho el poder ayudarte. Yo también soy ing. electrónico :D Te mando un abrazo desde Lima, Perú.
@@Electrosaurio Saludos Ing. Marlon, si gustas visitar mi canal, me dedico a la reparacion de equipo de audio profesional, tengo algunos videos al respecto
@@ignaciocaballero Ayer me di una vuelta por tu canal y en verdad tienes videos muy interesante. No había visto algo similar el youtube antes y menos en español. Sí o sí voy a recomendar tu canal en un futuro video!
Hola, te comencé a seguir hace un par de días por tus tutoriales de stm32, y quedé muy sorprendido, eres un capo en la materia y también enseñando, vengo de usar por mucho tiempo los PICS, y estaba reforzando lo de los AVR, jaja. Un aporte pequeño, el minuto 44:47, mencionas sobre la interrupción por transmisión, y una muy buena aplicación de este tipo de interrupción es en los BUFFER CIRCULARES; esta técnica soluciona el problema de que el uC se quede detenido en el while al momento de transmitir un dato y tenemos mas tiempo libre en el main. Acá te dejo un blog, que aunque es con PIC está bien explicado, y se ve claramente los beneficios de esta técnica, que se basa en la interrupción por transmisión: picfernalia.blogspot.com/2012/06/comunicaciones-uart-con-interrupciones.html
Hermano, muchas gracias! Revisaré el enlace que me mandaste :D Y sí, tienes razón. Esa es una muy buena utilidad de la interrupción por transmisión. Cuando hice este video no tenía ni idea xd, pero es algo que usaremos más adelante en los vídeos de los stm32 :D Muchas gracias por compartir lo que sabes (x
Buenas tardes Marlon, estoy usando estos componentes XY-LJ02 dentro de las características menciona que es compatible con UART, me he dado a la tarea de saber que es eso, como funciona y demas, y todo lo que he visito y leído es acerca de microproceadores pero este artículo ya está configurado por lo que pienso que solo debe recibir información pero la pregunta que me surge es como la recibí o hasta donde puedo llegar ojalá puedas dar un comentario para saber un poquito más
hola Marlon...desde argentina, muchas gracias por tus videos . consulta: cual es tu trabajo..a que te dedicas? utilizas el atmega 328 habitualmente? gracias
Hola Marlon que tal, primero que nada excelente video, simulado igual que tu me jala super bien perop a la hora de pasarlo a mi arduino, por alguna extraña razón no me transmite el mensaje real, sino que otros carácteres muy raros, me podrías apoyar un poco? gracias!!
HOLA , ME HAN SERVIDO MUCHO TUS VÍDEOS , TENGO UNA DUDA. ESTOY TRABAJANDO EN UN CÓDIGO PARA ENVIAR UN DATO BINARIO CON UART CUANDO PULSE UN BOTÓN ENVIAR 1 Y CUANDO PULSE OTRO ENVIAR 0 , PERO NO HE CONSEGUIDO HACERLO . PODRÍAS AYUDARME POR FAVOR.
@@Electrosaurio El código del vídeo funciona sobre una placa Arduino? Porque por más que he probado, no logro hacer funcionar el UART, ni en proteus ni en físico. En cambio si uso el ide de Arduino con la clase Serial, si que funciona, que podrá ser? Saludos
Eres lo máximo Marlon, una consulta, si se conecta de frente el módulo HC-05 con el microcontrolador(ambos trabajando a la misma velocidad de transmisión),¿sería suficiente o habría que hacer algo más?
Hola amigo, he estado comentando tus videos y me han servido demasiado. Solo que estuve haciendo el código contigo pero al momento de simularlo en proteus no funciona como se espera no hace nada. Ya descargué tu codigo y tampoco me funcionó. No sé si me puedas ayudar? Saludos.
Excelente, es realmente un gusto ver tu trabajo. Sólo unas preguntas : -¿Qué tanto mejora en cuanto al tiempo usar este método de escritura por UART en comparación con la función Serial.print() de Arduino? ¿Si lo hará más rápido? -¿Existe posibilidad que me pueda contactar contigo para cuestiones de asesoría personal?
No sé si sea más rápida la ejecución al escribirla en C nativo, pero lo que si he comprobado en este caso es el ahorro de memoria de programa, con la clase Serial en el at328 ocupa hasta 9-10%, al escribirla en C, apenas roza el 1% de memoria de programa
@@josecrisostomofuentes1691 mmmm 🤔 Siempre se envía uno por uno porque el tamaño del buffer es de un byte. Sin embargo, esto tarea se puede optimizar con el uso de interrupciones. La interrupción de transmisión, avisa cuando el buffer está vacío y esto se puede utilizar para cargar un nuevo carácter al buffer. Es similar a lo que hice para la interrupción de recepción de datos, pero esta vez para transmisión :D
@@Electrosaurio pero para enviar números de varios dígitos, cómo podría convertir estis a un string para poder utilizar las funciones ya creadas? Por ejemplo enviar las lecturas de mis ADC
@@josecrisostomofuentes1691 Puedes usar la función sprintf de C, pero creo que gasta mucha memoria rom, existe otra manera más eficiente pero se me escapa en este momento
Querido Marlon, una consulta, como se puede evitar que cuando el atmega328p o pb esta sin energizar y un sensor entrega un voltaje 4v en por ejemplo en pin PC0, PC1 etc, se encienda el arduino??? me he encontrado con ese problema y no se como resolverlo. ya he problado con varios chip y siempre es lo mismo :( saludos
Queeeeeee??? Imposible!! Eso no debería pasar!! 🤣🤣 Te pasa con cualquier pin? Es Arduino común y silvestre? Haz lo siguiente: 1. Pruébalo con otro Arduino para confirmar que sea un fenómeno que ocurre en todos. 2. Pruébalo con varios pines. Si es posible, con todos. 3. Si solo pasa con algunos pines, revisa el esquemático, puede que haya una conexión que relacione esos pines con VCC 4. Si el esquemático no muestra nada y solo pasa con tu Arduino, dale una limpieza con alcohol a tu placa, y verifica la continuidad con VCC y tierra. Si bota una baja resistencia entre esos puntos, puede que el micro este dañado internamente. Disculpa por contestar recién, no lo había leído. Espero esto te pueda ayudar. Un abrazo!
@@Electrosaurio Marlon efectivamente funciona con cualquier atmega328p y Atmega328pb-au de alguna forma interna tienen conexión , probé con chips nuevos comprados en lcsc y en otros fabricantes y lo mismo. Si es que tienes un promini hace el intento de energizar un pin dejando el GND conectado y verás que el voltaje sale por el pin VCC encendiendo el led rojo que marca que la placa está energizada , para verificar que el voltaje no era un error limpie las placas con alcohol isopropílico y sigue los mismo . Antes del regulador LDO no hay voltaje si en su salida. Eso indica que el voltaje sale por los pines. La solución que encontré es colocar un diodo de baja caída a la salida de los pines que ocupo , o también ocupar un MOSFET de nivel lógico, pero es extraño el comportamiento.
@@redbumlandia sí, lo es 🤔 No recuerdo que me haya pasado antes. Lo bueno es que encontraste una solución. Podrías probar también con una resistencia (si no se está usando una pullup). Así tal vez no necesites un diodo o MOSFET que por lo general son más caros.
Qué tal, podrías subir un vídeo sobre la comunicación i2c? Por favor, estoy tratando de comunicarme con un acelerómetro y giroscopio pero no lo consigo. Saludos.
Acabo de enviarte elcódigo que estaba preparando para el video de I2C... Este cideo tomará algo de tiempo en salir porque antes quería hablarles sobre otro tema. Pero bueno. Para que puedas entener bien el código y puedas usarlo con tu sensor, tienes que usar el datasheet del micro y del sensor al mismo tiempo. Espero te sea de ayuda.
A mi no me funciona nada del baudrate, configuro con cristal externo interno , cambiando los fusibles , los bps los configura a 9600,19200 lo que sea y siempre en el osciloscopio el pulso de cada bit es 1.8mS, en otras palabras 1/1.8ms=555.55bps y si configuro mi lector de serial con un baudrate de 550baudios se lee correctamente, alguien sabe que está pasando? porque ninguna configuración afecta el baudrate para poderlo configurar a 9600, Saludos.
!Me animaste Marlom, con tu introducción! Gracias
Hola Marlon. Se que este video es algo antiguo, pero igual quiero dejar mi comentario.
En efecto le he encontrado una utilidad a la interrupción de TX del USART.
Se puede usar para cargar el siguiente byte en el registro de transmisión inmediatamente después que se envié el anterior. Puede que no sea la gran cosa, pero en realidad esto puede evitar que el microcontrolador se quede bloqueado cada vez que se tiene que enviar un byte.
Me explico: Usualmente la velocidad de transmisión de los periféricos es muy inferior a la del microcontrolador.
Un baudrate de 115200 es 139 veces más lento que la velocidad del CPU a 16Mhz.
Con los ciclos while la ejecución del código se bloquea y este tiempo podría estar siendo aprovechado para realizar otras tareas.
El siguiente código funcionaria de igual manera, pero sin bloquear el microcontrolador:
#define LENGHT 13
char message[LENGHT] = "Hello world"
char current_byte = 0;
ISR(USART_TX_vect)
{
UDR0 = message[current_byte];
current_byte++;
if(current_byte >= LENGHT)
{
current_byte = 0;
}
}
Este programa imprime "Hello world" infinitamente en el monitor serie. Hay que hacer algunos ajustes como programar una inicialización, es decir cargar el primer byte para que la interrupción comience a funcionar. Este es solo un código de ejemplo y es mejorable por mucho.
Funcionaría más o menos así:
La interrupción carga el siguiente byte en el registro. Una vez cargado, el programa sale de la interrupción y regresa a la ejecución del código principal. Por lo tanto, no tiene que esperar a que se termine de transmitir el byte bloqueándose en el proceso, ya que la interrupción se volverá a llamar automáticamente cuando el byte se haya transmitido. Esto puede ser útil en aplicaciones donde se requiera una respuesta rápida de las entradas o cuando haya que hacer multitasking.
O al menos esa es una de las utilidades que le he encontrado a esta interrupción.
Un saludo Marlon y gracias por hacer este excelente video.
Me salvaste 🙏, muchísimas gracias, y perfecta explicación!!!
Marlon soy ing en electronica y estoy retomando los microcontroladores despues de mas de 10 años, la verdad mis respetos y admiración , son de mucha ayuda tus videos pues es muy poca la información de micros avr en español, saludos desde hermosillo sonora mexico
Hola, Juan!
Mil gracias por tus palabras. En verdad me alegra mucho el poder ayudarte.
Yo también soy ing. electrónico :D
Te mando un abrazo desde Lima, Perú.
@@Electrosaurio Saludos Ing. Marlon, si gustas visitar mi canal, me dedico a la reparacion de equipo de audio profesional, tengo algunos videos al respecto
@@ignaciocaballero
Ayer me di una vuelta por tu canal y en verdad tienes videos muy interesante. No había visto algo similar el youtube antes y menos en español. Sí o sí voy a recomendar tu canal en un futuro video!
Electrosaurio mil gracias marlon, y seguimos en contacto, un saludo
Buenos videos con un profe que siempre te motiva aún las desveladas, saludos!!!
Excelente video, también se puede aplicar para que el módulo gm65 envié datos por uart y el microcontrolador los imprima en una pantalla lcd ?
Hola, te comencé a seguir hace un par de días por tus tutoriales de stm32, y quedé muy sorprendido, eres un capo en la materia y también enseñando, vengo de usar por mucho tiempo los PICS, y estaba reforzando lo de los AVR, jaja.
Un aporte pequeño, el minuto 44:47, mencionas sobre la interrupción por transmisión, y una muy buena aplicación de este tipo de interrupción es en los BUFFER CIRCULARES; esta técnica soluciona el problema de que el uC se quede detenido en el while al momento de transmitir un dato y tenemos mas tiempo libre en el main.
Acá te dejo un blog, que aunque es con PIC está bien explicado, y se ve claramente los beneficios de esta técnica, que se basa en la interrupción por transmisión:
picfernalia.blogspot.com/2012/06/comunicaciones-uart-con-interrupciones.html
Hermano, muchas gracias!
Revisaré el enlace que me mandaste :D
Y sí, tienes razón. Esa es una muy buena utilidad de la interrupción por transmisión. Cuando hice este video no tenía ni idea xd, pero es algo que usaremos más adelante en los vídeos de los stm32 :D
Muchas gracias por compartir lo que sabes (x
Gracias ,men por tus vídeos. Me son de mucha ayuda.
Grande Marlon
🔝
Excelente video bro, hoy resolví mis dudas, saludos
Buenas tardes Marlon, estoy usando estos componentes XY-LJ02 dentro de las características menciona que es compatible con UART, me he dado a la tarea de saber que es eso, como funciona y demas, y todo lo que he visito y leído es acerca de microproceadores pero este artículo ya está configurado por lo que pienso que solo debe recibir información pero la pregunta que me surge es como la recibí o hasta donde puedo llegar ojalá puedas dar un comentario para saber un poquito más
hola Marlon...desde argentina, muchas gracias por tus videos . consulta: cual es tu trabajo..a que te dedicas? utilizas el atmega 328 habitualmente? gracias
Hola Marlon que tal, primero que nada excelente video, simulado igual que tu me jala super bien perop a la hora de pasarlo a mi arduino, por alguna extraña razón no me transmite el mensaje real, sino que otros carácteres muy raros, me podrías apoyar un poco? gracias!!
Hola, tus videos son super geniales felicidades... Una consulta, si quiero enviar un valor del adc,¿como le hago?
Gracias :o , para mi era complicado de entender ahora lo entiendo un poco mejor gracias 🙌
HOLA , ME HAN SERVIDO MUCHO TUS VÍDEOS , TENGO UNA DUDA.
ESTOY TRABAJANDO EN UN CÓDIGO PARA ENVIAR UN DATO BINARIO CON UART CUANDO PULSE UN BOTÓN ENVIAR 1 Y CUANDO PULSE OTRO ENVIAR 0 , PERO NO HE CONSEGUIDO HACERLO . PODRÍAS AYUDARME POR FAVOR.
Gracias por el video, me viene perfecto para comunicarme a través de un módulo Bluetooth, excelente
De nada, hermano!
Me alegra mucho el poderte ayudar!
@@Electrosaurio El código del vídeo funciona sobre una placa Arduino? Porque por más que he probado, no logro hacer funcionar el UART, ni en proteus ni en físico.
En cambio si uso el ide de Arduino con la clase Serial, si que funciona, que podrá ser? Saludos
Eres lo máximo Marlon, una consulta, si se conecta de frente el módulo HC-05 con el microcontrolador(ambos trabajando a la misma velocidad de transmisión),¿sería suficiente o habría que hacer algo más?
Hola amigo, he estado comentando tus videos y me han servido demasiado. Solo que estuve haciendo el código contigo pero al momento de simularlo en proteus no funciona como se espera no hace nada. Ya descargué tu codigo y tampoco me funcionó. No sé si me puedas ayudar? Saludos.
Lástima no poder dar más de un LIKE!! jaja
Hola, muchas gracias por tus videos. Como puedo guardar un valor entero enviado por la usart dentro de una variable del programa? Gracias
Excelente, es realmente un gusto ver tu trabajo. Sólo unas preguntas :
-¿Qué tanto mejora en cuanto al tiempo usar este método de escritura por UART en comparación con la función Serial.print() de Arduino? ¿Si lo hará más rápido?
-¿Existe posibilidad que me pueda contactar contigo para cuestiones de asesoría personal?
No sé si sea más rápida la ejecución al escribirla en C nativo, pero lo que si he comprobado en este caso es el ahorro de memoria de programa, con la clase Serial en el at328 ocupa hasta 9-10%, al escribirla en C, apenas roza el 1% de memoria de programa
muchas gracias! Eres el mejor.
Grande Marlon
Hola, muy buen video. Tienes alguna recomendación para poder enviar por UART "strings" en vez de chars individualmente?
Hola, José! Podrías hacer lo siguiente:
char msg[ ] = "Hola mundo";
int i = 0;
while (msg[i] != 0){
if (!(UCSR0A & (1
@@Electrosaurio Gracias!! Osea que siempre el envío es "entrada por entrada" de mi data.
Saludos desde Chile.
@@josecrisostomofuentes1691 mmmm 🤔
Siempre se envía uno por uno porque el tamaño del buffer es de un byte. Sin embargo, esto tarea se puede optimizar con el uso de interrupciones. La interrupción de transmisión, avisa cuando el buffer está vacío y esto se puede utilizar para cargar un nuevo carácter al buffer.
Es similar a lo que hice para la interrupción de recepción de datos, pero esta vez para transmisión :D
@@Electrosaurio pero para enviar números de varios dígitos, cómo podría convertir estis a un string para poder utilizar las funciones ya creadas? Por ejemplo enviar las lecturas de mis ADC
@@josecrisostomofuentes1691 Puedes usar la función sprintf de C, pero creo que gasta mucha memoria rom, existe otra manera más eficiente pero se me escapa en este momento
Excelente video
Gracias!
Exelente
Buenos videos amigo, saludos desde Argentina!!
Querido Marlon, una consulta, como se puede evitar que cuando el atmega328p o pb esta sin energizar y un sensor entrega un voltaje 4v en por ejemplo en pin PC0, PC1 etc, se encienda el arduino??? me he encontrado con ese problema y no se como resolverlo. ya he problado con varios chip y siempre es lo mismo :( saludos
Queeeeeee??? Imposible!! Eso no debería pasar!! 🤣🤣
Te pasa con cualquier pin? Es Arduino común y silvestre?
Haz lo siguiente:
1. Pruébalo con otro Arduino para confirmar que sea un fenómeno que ocurre en todos.
2. Pruébalo con varios pines. Si es posible, con todos.
3. Si solo pasa con algunos pines, revisa el esquemático, puede que haya una conexión que relacione esos pines con VCC
4. Si el esquemático no muestra nada y solo pasa con tu Arduino, dale una limpieza con alcohol a tu placa, y verifica la continuidad con VCC y tierra. Si bota una baja resistencia entre esos puntos, puede que el micro este dañado internamente.
Disculpa por contestar recién, no lo había leído. Espero esto te pueda ayudar.
Un abrazo!
@@Electrosaurio Marlon efectivamente funciona con cualquier atmega328p y Atmega328pb-au de alguna forma interna tienen conexión , probé con chips nuevos comprados en lcsc y en otros fabricantes y lo mismo. Si es que tienes un promini hace el intento de energizar un pin dejando el GND conectado y verás que el voltaje sale por el pin VCC encendiendo el led rojo que marca que la placa está energizada , para verificar que el voltaje no era un error limpie las placas con alcohol isopropílico y sigue los mismo . Antes del regulador LDO no hay voltaje si en su salida. Eso indica que el voltaje sale por los pines. La solución que encontré es colocar un diodo de baja caída a la salida de los pines que ocupo , o también ocupar un MOSFET de nivel lógico, pero es extraño el comportamiento.
@@redbumlandia sí, lo es 🤔
No recuerdo que me haya pasado antes. Lo bueno es que encontraste una solución.
Podrías probar también con una resistencia (si no se está usando una pullup). Así tal vez no necesites un diodo o MOSFET que por lo general son más caros.
Qué tal, podrías subir un vídeo sobre la comunicación i2c? Por favor, estoy tratando de comunicarme con un acelerómetro y giroscopio pero no lo consigo. Saludos.
Hermano, trataré de subirlo esta semana. Por si acaso, pásame tu correo...
@@Electrosaurio Gracias, te paso mi correo y.r.eduardo@gmail.com
Acabo de enviarte elcódigo que estaba preparando para el video de I2C... Este cideo tomará algo de tiempo en salir porque antes quería hablarles sobre otro tema. Pero bueno.
Para que puedas entener bien el código y puedas usarlo con tu sensor, tienes que usar el datasheet del micro y del sensor al mismo tiempo.
Espero te sea de ayuda.
@@Electrosaurio Muchas gracias por la información, estaré al pendiente de tus próximos vídeos. Saludos desde México.
Podria contactarte, y felicitaciones por tu video
A mi no me funciona nada del baudrate, configuro con cristal externo interno , cambiando los fusibles , los bps los configura a 9600,19200 lo que sea y siempre en el osciloscopio el pulso de cada bit es 1.8mS, en otras palabras 1/1.8ms=555.55bps y si configuro mi lector de serial con un baudrate de 550baudios se lee correctamente, alguien sabe que está pasando? porque ninguna configuración afecta el baudrate para poderlo configurar a 9600, Saludos.
Ya encontree el error URSEL tiene que estar en '1'
Bárbaro dinosaurio >
Gracias Crack!
De nada, hermano
Amigo marlon necesito tu ayuda plis :,(
y el debug ? XD.
Tarea para la casa v:
@@Electrosaurio he intentado hacer debugg pero no he podido ver el dato en el registro de envio y recepción de datos y al parecer no se puede :(