UART 🔥SIN ARDUINO🔥 ATMEGA328P - Transmisión, recepción e interrupciones

แชร์
ฝัง
  • เผยแพร่เมื่อ 7 พ.ย. 2024

ความคิดเห็น • 61

  • @gabrielaochoamagana2331
    @gabrielaochoamagana2331 11 หลายเดือนก่อน +4

    !Me animaste Marlom, con tu introducción! Gracias

  • @francescoelpro3124
    @francescoelpro3124 15 ชั่วโมงที่ผ่านมา

    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.

  • @logibroneo7059
    @logibroneo7059 5 หลายเดือนก่อน +1

    Me salvaste 🙏, muchísimas gracias, y perfecta explicación!!!

  • @ignaciocaballero
    @ignaciocaballero 4 ปีที่แล้ว +4

    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

    • @Electrosaurio
      @Electrosaurio  4 ปีที่แล้ว +1

      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ú.

    • @ignaciocaballero
      @ignaciocaballero 4 ปีที่แล้ว

      @@Electrosaurio Saludos Ing. Marlon, si gustas visitar mi canal, me dedico a la reparacion de equipo de audio profesional, tengo algunos videos al respecto

    • @Electrosaurio
      @Electrosaurio  4 ปีที่แล้ว +1

      @@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!

    • @ignaciocaballero
      @ignaciocaballero 4 ปีที่แล้ว

      Electrosaurio mil gracias marlon, y seguimos en contacto, un saludo

  • @johngalaviz1565
    @johngalaviz1565 ปีที่แล้ว

    Buenos videos con un profe que siempre te motiva aún las desveladas, saludos!!!

  • @magalylopez7326
    @magalylopez7326 หลายเดือนก่อน

    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 ?

  • @bryanreyes2632
    @bryanreyes2632 4 ปีที่แล้ว

    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

    • @Electrosaurio
      @Electrosaurio  4 ปีที่แล้ว

      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

  • @victorhugovanegascarvajal7532
    @victorhugovanegascarvajal7532 4 ปีที่แล้ว +1

    Gracias ,men por tus vídeos. Me son de mucha ayuda.

  • @markojosuepuchurilopez7564
    @markojosuepuchurilopez7564 ปีที่แล้ว

    Grande Marlon
    🔝

  • @garnicabecerriluriel157
    @garnicabecerriluriel157 3 ปีที่แล้ว

    Excelente video bro, hoy resolví mis dudas, saludos

  • @RicardoRamirez-pe2tu
    @RicardoRamirez-pe2tu 4 ปีที่แล้ว

    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

  • @jprindusrosa3906
    @jprindusrosa3906 3 ปีที่แล้ว

    hola Marlon...desde argentina, muchas gracias por tus videos . consulta: cual es tu trabajo..a que te dedicas? utilizas el atmega 328 habitualmente? gracias

  • @andreslezama5514
    @andreslezama5514 3 ปีที่แล้ว

    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!!

  • @ismaelbenitocarrillo4509
    @ismaelbenitocarrillo4509 4 ปีที่แล้ว +2

    Hola, tus videos son super geniales felicidades... Una consulta, si quiero enviar un valor del adc,¿como le hago?

  • @spaart9844
    @spaart9844 3 ปีที่แล้ว

    Gracias :o , para mi era complicado de entender ahora lo entiendo un poco mejor gracias 🙌

  • @massterviddeo9030
    @massterviddeo9030 4 ปีที่แล้ว +1

    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.

  • @victormikecharlie1596
    @victormikecharlie1596 4 ปีที่แล้ว

    Gracias por el video, me viene perfecto para comunicarme a través de un módulo Bluetooth, excelente

    • @Electrosaurio
      @Electrosaurio  4 ปีที่แล้ว

      De nada, hermano!
      Me alegra mucho el poderte ayudar!

    • @victormikecharlie1596
      @victormikecharlie1596 4 ปีที่แล้ว

      @@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

  • @luisangelcacerescarranza1363
    @luisangelcacerescarranza1363 3 ปีที่แล้ว

    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?

  • @danielnunez6836
    @danielnunez6836 3 ปีที่แล้ว

    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.

  • @mateotorrescastro_29
    @mateotorrescastro_29 3 ปีที่แล้ว +1

    Lástima no poder dar más de un LIKE!! jaja

  • @Leandroirigaray
    @Leandroirigaray 3 ปีที่แล้ว

    Hola, muchas gracias por tus videos. Como puedo guardar un valor entero enviado por la usart dentro de una variable del programa? Gracias

  • @DRACOBUCIO
    @DRACOBUCIO 4 ปีที่แล้ว

    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?

    • @victormikecharlie1596
      @victormikecharlie1596 4 ปีที่แล้ว +1

      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

  • @juanmanuelrodriguez4709
    @juanmanuelrodriguez4709 4 ปีที่แล้ว

    muchas gracias! Eres el mejor.

  • @el_arte_de_pensar
    @el_arte_de_pensar ปีที่แล้ว

    Grande Marlon

  • @josecrisostomofuentes1691
    @josecrisostomofuentes1691 4 ปีที่แล้ว

    Hola, muy buen video. Tienes alguna recomendación para poder enviar por UART "strings" en vez de chars individualmente?

    • @Electrosaurio
      @Electrosaurio  4 ปีที่แล้ว +2

      Hola, José! Podrías hacer lo siguiente:
      char msg[ ] = "Hola mundo";
      int i = 0;
      while (msg[i] != 0){
      if (!(UCSR0A & (1

    • @josecrisostomofuentes1691
      @josecrisostomofuentes1691 4 ปีที่แล้ว

      @@Electrosaurio Gracias!! Osea que siempre el envío es "entrada por entrada" de mi data.
      Saludos desde Chile.

    • @Electrosaurio
      @Electrosaurio  4 ปีที่แล้ว +1

      @@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

    • @josecrisostomofuentes1691
      @josecrisostomofuentes1691 4 ปีที่แล้ว

      @@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

    • @victormikecharlie1596
      @victormikecharlie1596 4 ปีที่แล้ว

      @@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

  • @jhofreojeda6615
    @jhofreojeda6615 3 ปีที่แล้ว

    Excelente video

  • @pabloLlanosGar
    @pabloLlanosGar ปีที่แล้ว

    Gracias!

  • @hectorulisescabreravillase2567
    @hectorulisescabreravillase2567 3 ปีที่แล้ว +1

    Exelente

  • @Electronics_Dreams
    @Electronics_Dreams 5 ปีที่แล้ว

    Buenos videos amigo, saludos desde Argentina!!

  • @redbumlandia
    @redbumlandia 4 ปีที่แล้ว

    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

    • @Electrosaurio
      @Electrosaurio  4 ปีที่แล้ว +1

      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!

    • @redbumlandia
      @redbumlandia 4 ปีที่แล้ว

      @@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.

    • @Electrosaurio
      @Electrosaurio  4 ปีที่แล้ว

      @@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.

  • @eduardoyehualarojas1293
    @eduardoyehualarojas1293 5 ปีที่แล้ว

    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.

    • @Electrosaurio
      @Electrosaurio  5 ปีที่แล้ว +1

      Hermano, trataré de subirlo esta semana. Por si acaso, pásame tu correo...

    • @eduardoyehualarojas1293
      @eduardoyehualarojas1293 5 ปีที่แล้ว

      @@Electrosaurio Gracias, te paso mi correo y.r.eduardo@gmail.com

    • @Electrosaurio
      @Electrosaurio  5 ปีที่แล้ว +1

      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.

    • @eduardoyehualarojas1293
      @eduardoyehualarojas1293 5 ปีที่แล้ว

      @@Electrosaurio Muchas gracias por la información, estaré al pendiente de tus próximos vídeos. Saludos desde México.

  • @autotronicaaguillon9791
    @autotronicaaguillon9791 4 ปีที่แล้ว

    Podria contactarte, y felicitaciones por tu video

  • @camelazo
    @camelazo 3 ปีที่แล้ว

    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.

    • @camelazo
      @camelazo 3 ปีที่แล้ว

      Ya encontree el error URSEL tiene que estar en '1'

  • @guidoherrera1341
    @guidoherrera1341 3 ปีที่แล้ว

    Bárbaro dinosaurio >

  • @Andry55555
    @Andry55555 5 ปีที่แล้ว

    Gracias Crack!

  • @juanbedolla2328
    @juanbedolla2328 3 ปีที่แล้ว

    Amigo marlon necesito tu ayuda plis :,(

  • @EdwardYamunaque
    @EdwardYamunaque 5 ปีที่แล้ว

    y el debug ? XD.

    • @Electrosaurio
      @Electrosaurio  5 ปีที่แล้ว

      Tarea para la casa v:

    • @EdwardYamunaque
      @EdwardYamunaque 5 ปีที่แล้ว

      @@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 :(