Muchas gracias por la mencion de mi persona y mi canal, no me lo esperaba de verdad mil gracias, no me pierdo tus videos por el exelente contenido un gran saludo
sigo impresionado con la calidad de tus contenidos, se nota mucho tu preparación y dedicación..muchas gracias por compartir tus conocimientos y de una forma muy amena y entendible.
Muy buenos tus vídeos sobre los micros stm32. Entras en profundidad, y lo explicas de una manera muy sencilla. ¿Has pensado en hacer una serie igual de videos, pero para el micro Esp32?. Sigue así
Como siempre, un contenido brutal, no pares de compartir tu conocimiento con los que estamos empezando en esto de microcontroladores. Quería preguntarte, ¿cuándo declaras un pin de entrada como pull Up o pull down, internamente se hace la conexión física del pin con la resistencia tanto si es pull Up (conectado a vcc) como si es pull down (conectado a gnd)?
Hola, Antonio. Gracis por tu comentario! Claro, al nosotros activar el pull down o pull up. un mosfet une una resistencia conecta a tierra, para pull down; o conectada a VCC, para pull up. Esto lo podemos ver a más de talle en la hoja de datos del microcontrolador, pero también lo muestro en el video de configuración de pines de entrada y salida (enlace: th-cam.com/video/4IK3OAglAno/w-d-xo.html) en el minuto 11:09 :D
@@Electrosaurio los delay que por ejemplo usan para no enviar un montón de mensajes por uart.. aun que bueno utilizo temporizadores jugando con el CCR y ARR el prescaler pero me gustaría que tocaras el tema de temporizadores y los prescaler seria interesante como aplicarías tu esto... también seria bueno por ejemplo el pwm de los servomotores hay muchos videos de esto Si pero siento que no estan completos o suelen utilizar el metodo mas facil y al final no se entiende el por que de las cosas. tambien por ejemplo como tu sacarias un pin pwm para 125khz 300khz 10khz etc etc ya que hay aplicaciones en donde puedes hacer fuentes conmutadas con estos micros por ejemplo los dsPic que algunas familias lo usan para fuentes SMPS y estas cosas me gustaria ver como tu aplicarias estos.
@@roderickdiaz3834 Hola, Roderick! (Que nombre tan genial xd jaja) El próximo video que subiré hablará sobre el uso del UART de la forma como lo describes, pero no usamos timers, sino interrupciones :D El tema de prescalers, tal vez lo toquemos. Eso va a depender de la libertad de configuración que nos de la librería HAL (Por ahora sólo nos estamos centrando en el uso de esta librería). El tema de PWM también vamos a tocarlo cuando hablemos de tos timers y fijo haremos algo con servomotores 😎 Haremos varias cosas que señalas, pero por el momento no puedo darte un fecha jeje. Pero de que se harán se harán 😎 Saludos!
Hahaha pues gracias a tu canal e podido avanzar un poco mas pero en este caso toco registros de estos. De igual forma me gustó que tengas una parte de teoria y parte de practica y que no seas tan "ponga esto aqui copie aqui, utiliza esto, y funciona" y me encanto que explicas cada cosa. Y por que se usan.. a parte lo de interrupciones yo manejo esto con interrupciones del timer. Que tengas buenas tardes y exitos en el canal.
Puedes hacer un video donde hables de cómo usar el Switch En el ciclo while, evaluando con case y que estos sean detectados si le conectamos un dipswitch, por ejemplo case 1, si yo le doy on al switch 1 por ende se alimenta la entrada asignada, el programa ejecute un programa simple por así decirlo prender y apagar un foco, pero a lo mejor en case 2, al darle on al switch 2, pues el programa ejecute una secuencia de contador binario. Y así. Por favor
En el video de interrupciones externas, uso el debugger para probar el funcionamiento de las interrupciones :D Los break points ayudan mucho en ellos. Dale un vistazo para que tengas una mejor idea ^^
Hola Marlon, como puede evitar las espureas del pulsador para que no obtenga los rebotes, se me ocurre colocar un retardo un retardo para solucionarlo gracias
Hola, Juan! Sí, puedes colocar un retardo. Uno de 20ms estaría bien, pero una mejor solución es añadir un circuito anti-rebote. Un capacitor con un condensador bastaría si la aplicación es simple. Hay varias formas de atenuar o hasta eliminar esos ruidos. Googlealo y verás 😎
La funcio HAL_GPIO_EXTI_Callback es la unica funcion que se ejecuta en el main, por que no esta tambien la funcion HAL_GPIO_EXTI_IRQhandler tamien en la funcion main.c?
No se necesita declarar o definir en main.c porque es una función que no debe ser modificada por el programador. A menos que quiera alterar el funcionamiento de la librería para optimizar su aplicación, pero esto podría traer más problemas que soluciones, si no se sabe manejar bien la librería. HAL_GPIO_EXTI_IRQhandler es generada automáticamente por la interfaz gráfica y se encuentra declarada en el archivo stm32fxxx_it.h y definida en stm32fxxx_it.c Saludos! :D
Es muy genial como te facilita el proyecto, pero si ya tienes uno hecho y quieres añadir mas funciones *sin* modificar la estructura de tu codigo o que el ide sobreescriba, tienes que hacer varias plantillas o copiar el codigo generado de más a tu proyecto ya hecho, de esta forma considero que las liberias HAL no sirven para proyectos escalables. tener que escribir tu codigo en los campos de _user_code, es muy ineficiente.
MUY BUENA CLASE al finalizar la interrupción de debe seguir ejecutando lo que esta dentro WHILE (1) , pero no sucede eso en mi caso es mas a veces el compilador borra lo que escribo en esa área alguna sugerencia o por que pasa eso
Hola, Werner! Existen espacios en los archivos generados por el IDE que están dedicados para el código del usuario (los programadores). Estos están señalados por comentarios como // User Code Begin y // End User Code Ubica esos espacios y escribe el código que quieras añadir dentro. Cualquier código que sea escrito fuera de esos espacios será eliminado por el IDE cuando se haga un modificación en la vista de chip Saludos :D
Holaa Electrosaurio!! Muchas gracias por tus vídeos de verdad me ayudan mucho con mis proyectos para la facu Te quería consultar si sabes si es posible usar el USB device y al mismo tiempo un pulsador por interrupción externa? Esto en la stl 32 blue pill, he estado probando pero no me sale Gracias
Hola, estaba probando otra vez este modulito y me generaron varias dudas, si yo uso 2 diferentes lines EXTI (digamos las interrupciones de la linea 0 y las interrupciones del grupo 10 al 15) tendrían el mismo callback no? porque al buscar la función callback de cada exti me doy cuenta que son lo mismo. Si es así? es que antes programaba rellenando los registros manualmente y antes cada linea exti tenía su propia función callback
Hola, Andres! Sí, lo que deduces es correcto. Todas las interrupciones externas consultan al mismo callback, por eso es importante especificar, mediante un condicional, a que interrupción en específico se está haciendo obedeciendo :D
cuando se activa el Nvic en el cube ide para las interrupciones el PENDING-BIT se desactiva automaticamente en las funciones que se crean por el compilador? en ningun momento se ve que lo desactivas ese bit sino que aparece ya desactivado por el compilador
En el minuto 11:30 resaltamos la función __HAL_GPIO_EXTI_CLEAR_IT e indicamos que esta es la función que reinicia el PENDING-BIT (reinicia, limpia y desactiva son sinónimos en este contexto). No ingresamos a la función por lo que no muestro exactamente cuál línea lo hace, pero si entras por tu cuenta verás la siguiente macro: #define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) PR hace referencia al PENDING REGISTER, registro que contiene los pending bits de los EXTI. Esa macro toma como parámetro al pin que a activado la interrupción y desactiva su respectivo PENDING-BIT. Espero te haya sido de ayuda. Saludos :D
Cómo estás Marlon, no entiendo algo con respecto a la interrupción, programé mi STM32F103C8 y cuando escribo el código dentro de la función: void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) no funciona si escribo un HAL_Delay para hacer prender y apagar un led con algo de tiempo dentro de la interrupción, pero si borro el HAL_Delay si funciona, me puedes explicar porqué. Gracias!!
Hola, Wilson! Eso se debe a las prioridades. Te recomiendo entrar al canal y buscar el video de prioridades. Ahí está todo el tema bien explicado. PD: Nunca debes poner un retardo tendría una rutina de interrupción
Hola, Wilson! Explicártelo por chat tomaría mucho tiempo porque hay teoría de por medio. Pero esto ya lo tengo explicado en un serie de videos. Te recomendaría ver el play list completo de teoría de interrupciones: th-cam.com/video/FP_dtaou9wA/w-d-xo.html O, en su defecto, por lo menos ver estos dos videos específicos: 1ro: th-cam.com/video/JxlldWOMYOA/w-d-xo.html 2do: th-cam.com/video/_oUwvOZeKBk/w-d-xo.html Espero te sean de utilidad :D
Ojala puedas hacer otro video de este mismo tema pero sin el HAL, siento que el HAL te hace depender mucho del mismo y no sabes realmente que estas haciendo pero aun asi buen video
Enhorabuena por tu labor, es increible lo que estoy aprendiendo. Me surge una duda, he visto que para controlar las interrupciones existen las funciones HAL_NVIC_EnableIRQ() y HAL_NVIC_DisableIRQ(), pero tengo un problema con la primera, cada vez que la uso me salta una interrupción que no se ha generado externamente. ¿Se puede evitar eso?, muchas gracias
Hola, Efrem! Disculpa por la demora en mi respuesta. Lo que pasa es que cuando activas un IRQ estás activando todas las interrupciones asociadas a ese IRQ, las cuales, en la mayoría de casos, son más de una. Lo que debes hacer es filtrar esas interrupciones. Eso lo explico en este video. Más o menos apartir del minuto 17 hacia arriba ^^ PD: Las interrupciones se van a dedectar sí o sí, pero al filtrarlas tú puedes decir al micro que cuando las detecte no hag nada :D
Muchas gracias por la mencion de mi persona y mi canal, no me lo esperaba de verdad mil gracias, no me pierdo tus videos por el exelente contenido un gran saludo
De nada, Juan!
Te dije que lo haría!
Además, tienes un excelente contenido 😎
A seguir dándole con fuerza. Un abrazo!
@@Electrosaurio de nuevo gracias y un gran saludo desde Hermosillo Sonora Mexico
sigo impresionado con la calidad de tus contenidos, se nota mucho tu preparación y dedicación..muchas gracias por compartir tus conocimientos y de una forma muy amena y entendible.
Me deleito con estos videos.Gracias!!!!
Gracias por tus explicaciones. En verdad son de lo mejor. Te deseo mucho éxito con tu canal. Es un gusto ver tus videos y aprender.
Muy buenos tus vídeos sobre los micros stm32. Entras en profundidad, y lo explicas de una manera muy sencilla. ¿Has pensado en hacer una serie igual de videos, pero para el micro Esp32?. Sigue así
Gracias por las playlists. Excelente contenido!!!
excelente video amigo, yo tengo una stm y ufff la teoria que subes esta increible
De nada, hermano!
Es un gusto enorme poder ayudar!!
ya habia trabajado con la plataforma de atmel y los handlers trabajan un poco diferente a st
Enhorabuena por esta excelente serie de videos
Excelentes vídeos felicitaciones!
Muy bueno, gracias por los videos
Excelente Marlon, las interrupciones externas son vitales para hacer buenos desarrollos los proyectos con MCU, Saludos
gracias por tus videos, me ayudaste a entender los callback.
Como siempre, un contenido brutal, no pares de compartir tu conocimiento con los que estamos empezando en esto de microcontroladores.
Quería preguntarte, ¿cuándo declaras un pin de entrada como pull Up o pull down, internamente se hace la conexión física del pin con la resistencia tanto si es pull Up (conectado a vcc) como si es pull down (conectado a gnd)?
Hola, Antonio. Gracis por tu comentario!
Claro, al nosotros activar el pull down o pull up. un mosfet une una resistencia conecta a tierra, para pull down; o conectada a VCC, para pull up. Esto lo podemos ver a más de talle en la hoja de datos del microcontrolador, pero también lo muestro en el video de configuración de pines de entrada y salida (enlace: th-cam.com/video/4IK3OAglAno/w-d-xo.html) en el minuto 11:09 :D
@@Electrosaurio Perfecto me ha quedado mucho más claro ahora volviendo a ver esa parte del vídeo de teoría. 😁👍
Excelente video!! espero ansioso el siguiente donde enseñes a conectar un sensor de distancia i2c al stm32 :)
Gracias, Esteban! Espero poder tocar temas del I2C pronto.
Un abrazo!
Buen vídeo manin ❤
cual es la diferencia entre los pending bit y los flag de las interrupciones? donde se borra el flag de la interrupcion?
Muy bueno, continúa así!!
Muchas gracias!!!
se puede hacer una comparacion entre 2 interrupciones ?
Exelente me ayuda mucho tus videos.. bueno me gustaria como utilizarias un temporizador para evitar delays.
Me parece muy buena tu pregunta, pero podrías ser un poco más específico? que clase de delays quisieras evitar?
@@Electrosaurio los delay que por ejemplo usan para no enviar un montón de mensajes por uart.. aun que bueno utilizo temporizadores jugando con el CCR y ARR el prescaler pero me gustaría que tocaras el tema de temporizadores y los prescaler seria interesante como aplicarías tu esto... también seria bueno por ejemplo el pwm de los servomotores hay muchos videos de esto Si pero siento que no estan completos o suelen utilizar el metodo mas facil y al final no se entiende el por que de las cosas. tambien por ejemplo como tu sacarias un pin pwm para 125khz 300khz 10khz etc etc ya que hay aplicaciones en donde puedes hacer fuentes conmutadas con estos micros por ejemplo los dsPic que algunas familias lo usan para fuentes SMPS y estas cosas me gustaria ver como tu aplicarias estos.
@@roderickdiaz3834
Hola, Roderick! (Que nombre tan genial xd jaja)
El próximo video que subiré hablará sobre el uso del UART de la forma como lo describes, pero no usamos timers, sino interrupciones :D
El tema de prescalers, tal vez lo toquemos. Eso va a depender de la libertad de configuración que nos de la librería HAL (Por ahora sólo nos estamos centrando en el uso de esta librería).
El tema de PWM también vamos a tocarlo cuando hablemos de tos timers y fijo haremos algo con servomotores 😎
Haremos varias cosas que señalas, pero por el momento no puedo darte un fecha jeje. Pero de que se harán se harán 😎
Saludos!
Hahaha pues gracias a tu canal e podido avanzar un poco mas pero en este caso toco registros de estos.
De igual forma me gustó que tengas una parte de teoria y parte de practica y que no seas tan "ponga esto aqui copie aqui, utiliza esto, y funciona" y me encanto que explicas cada cosa. Y por que se usan.. a parte lo de interrupciones yo manejo esto con interrupciones del timer. Que tengas buenas tardes y exitos en el canal.
Puedes hacer un video donde hables de cómo usar el Switch
En el ciclo while, evaluando con case y que estos sean detectados si le conectamos un dipswitch, por ejemplo case 1, si yo le doy on al switch 1 por ende se alimenta la entrada asignada, el programa ejecute un programa simple por así decirlo prender y apagar un foco, pero a lo mejor en case 2, al darle on al switch 2, pues el programa ejecute una secuencia de contador binario. Y así. Por favor
otra consulta como puedo probar con el debugger para emular una interrupción gracias y muy buenos los videos
En el video de interrupciones externas, uso el debugger para probar el funcionamiento de las interrupciones :D
Los break points ayudan mucho en ellos. Dale un vistazo para que tengas una mejor idea ^^
Hola Marlon, como puede evitar las espureas del pulsador para que no obtenga los rebotes, se me ocurre colocar un retardo un retardo para solucionarlo gracias
Hola, Juan!
Sí, puedes colocar un retardo. Uno de 20ms estaría bien, pero una mejor solución es añadir un circuito anti-rebote.
Un capacitor con un condensador bastaría si la aplicación es simple. Hay varias formas de atenuar o hasta eliminar esos ruidos. Googlealo y verás 😎
Buenos dias, nada que ver con el tema del video pero de casualidad trabajaste con el paquete de libreris de stemWin? Saludos
No, Jorge. Lo siento :/
La funcio HAL_GPIO_EXTI_Callback es la unica funcion que se ejecuta en el main, por que no esta tambien la funcion HAL_GPIO_EXTI_IRQhandler tamien en la funcion main.c?
No se necesita declarar o definir en main.c porque es una función que no debe ser modificada por el programador. A menos que quiera alterar el funcionamiento de la librería para optimizar su aplicación, pero esto podría traer más problemas que soluciones, si no se sabe manejar bien la librería.
HAL_GPIO_EXTI_IRQhandler es generada automáticamente por la interfaz gráfica y se encuentra declarada en el archivo stm32fxxx_it.h y definida en stm32fxxx_it.c
Saludos! :D
Es muy genial como te facilita el proyecto, pero si ya tienes uno hecho y quieres añadir mas funciones *sin* modificar la estructura de tu codigo o que el ide sobreescriba, tienes que hacer varias plantillas o copiar el codigo generado de más a tu proyecto ya hecho, de esta forma considero que las liberias HAL no sirven para proyectos escalables. tener que escribir tu codigo en los campos de _user_code, es muy ineficiente.
MUY BUENA CLASE
al finalizar la interrupción de debe seguir ejecutando lo que esta dentro WHILE (1) , pero no sucede eso en mi caso es mas a veces el compilador borra lo que escribo en esa área alguna sugerencia o por que pasa eso
Hola, Werner!
Existen espacios en los archivos generados por el IDE que están dedicados para el código del usuario (los programadores). Estos están señalados por comentarios como // User Code Begin y // End User Code
Ubica esos espacios y escribe el código que quieras añadir dentro. Cualquier código que sea escrito fuera de esos espacios será eliminado por el IDE cuando se haga un modificación en la vista de chip
Saludos :D
Holaa Electrosaurio!! Muchas gracias por tus vídeos de verdad me ayudan mucho con mis proyectos para la facu
Te quería consultar si sabes si es posible usar el USB device y al mismo tiempo un pulsador por interrupción externa? Esto en la stl 32 blue pill, he estado probando pero no me sale
Gracias
Hola, estaba probando otra vez este modulito y me generaron varias dudas, si yo uso 2 diferentes lines EXTI (digamos las interrupciones de la linea 0 y las interrupciones del grupo 10 al 15) tendrían el mismo callback no? porque al buscar la función callback de cada exti me doy cuenta que son lo mismo. Si es así? es que antes programaba rellenando los registros manualmente y antes cada linea exti tenía su propia función callback
Hola, Andres!
Sí, lo que deduces es correcto. Todas las interrupciones externas consultan al mismo callback, por eso es importante especificar, mediante un condicional, a que interrupción en específico se está haciendo obedeciendo :D
cuando se activa el Nvic en el cube ide para las interrupciones el PENDING-BIT se desactiva automaticamente en las funciones que se crean por el compilador? en ningun momento se ve que lo desactivas ese bit sino que aparece ya desactivado por el compilador
En el minuto 11:30 resaltamos la función __HAL_GPIO_EXTI_CLEAR_IT e indicamos que esta es la función que reinicia el PENDING-BIT (reinicia, limpia y desactiva son sinónimos en este contexto). No ingresamos a la función por lo que no muestro exactamente cuál línea lo hace, pero si entras por tu cuenta verás la siguiente macro:
#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__))
PR hace referencia al PENDING REGISTER, registro que contiene los pending bits de los EXTI. Esa macro toma como parámetro al pin que a activado la interrupción y desactiva su respectivo PENDING-BIT.
Espero te haya sido de ayuda. Saludos :D
Cómo estás Marlon, no entiendo algo con respecto a la interrupción, programé mi STM32F103C8 y cuando escribo el código dentro de la función: void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) no funciona si escribo un HAL_Delay para hacer prender y apagar un led con algo de tiempo dentro de la interrupción, pero si borro el HAL_Delay si funciona, me puedes explicar porqué. Gracias!!
Hola, Wilson!
Eso se debe a las prioridades. Te recomiendo entrar al canal y buscar el video de prioridades. Ahí está todo el tema bien explicado.
PD: Nunca debes poner un retardo tendría una rutina de interrupción
@@Electrosaurio Discúlpame Marlon, me aconsejas no poner un retardo dentro de la rutina de interrupción? me explicas porfa.. Te agradezco.
Hola, Wilson!
Explicártelo por chat tomaría mucho tiempo porque hay teoría de por medio. Pero esto ya lo tengo explicado en un serie de videos. Te recomendaría ver el play list completo de teoría de interrupciones:
th-cam.com/video/FP_dtaou9wA/w-d-xo.html
O, en su defecto, por lo menos ver estos dos videos específicos:
1ro: th-cam.com/video/JxlldWOMYOA/w-d-xo.html
2do: th-cam.com/video/_oUwvOZeKBk/w-d-xo.html
Espero te sean de utilidad :D
@@Electrosaurio Super!! Muchas gracias 👍
Ojala puedas hacer otro video de este mismo tema pero sin el HAL, siento que el HAL te hace depender mucho del mismo y no sabes realmente que estas haciendo pero aun asi buen video
Enhorabuena por tu labor, es increible lo que estoy aprendiendo. Me surge una duda, he visto que para controlar las interrupciones existen las funciones HAL_NVIC_EnableIRQ() y HAL_NVIC_DisableIRQ(), pero tengo un problema con la primera, cada vez que la uso me salta una interrupción que no se ha generado externamente. ¿Se puede evitar eso?, muchas gracias
Hola, Efrem!
Disculpa por la demora en mi respuesta.
Lo que pasa es que cuando activas un IRQ estás activando todas las interrupciones asociadas a ese IRQ, las cuales, en la mayoría de casos, son más de una.
Lo que debes hacer es filtrar esas interrupciones. Eso lo explico en este video. Más o menos apartir del minuto 17 hacia arriba ^^
PD: Las interrupciones se van a dedectar sí o sí, pero al filtrarlas tú puedes decir al micro que cuando las detecte no hag nada :D
antilopes ajajajjaajajaj