es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Arduino – necesito reasignar el desbordamiento del Temporizador 0 (TIMER0_OVF_vect) a una ISR diferente – ¿cómo hacerlo?

En una aplicación genérica basada en Arduino (ATMEGA386P), necesito que la interrupción por desbordamiento del Timer 0 (que normalmente va a TIMER0_OVF_vect) apunte a mi propio código, no al código existente de Arduino. Me doy cuenta de que esto hará que las funciones de tiempo de ejecución de Arduino dependientes del intervalo de 1 kHz que funciona normalmente no sean utilizables. Estoy trabajando dentro de una aplicación existente basada en Arduino y no puedo salir fácilmente del entorno de Arduino (por ejemplo, a AVR-GCC) ya que hay algunas dependencias de Arduino que necesito mantener. No puedo utilizar los otros temporizadores (Timer 1 o Timer 2) ya que están siendo utilizados para otros fines.

Mi pregunta es la siguiente: ¿cómo puedo (o puedo) reconfigurar el Timer 0 para que el vector de interrupción por desbordamiento apunte al punto de entrada ISR de mi propio código?

Gracias.

AGREGANDO INFORMACIÓN 13 DIC 2021 según el comentario de amike el 10 de dic 2021

Creé el ISR(TIMER0_OVF_vect) (que usaría como sustituto del presente en wiring.c)

ISR(TIMER0_OVF_vect)
{
// AQUÍ IRÁ MI CÓDIGO SUSTITUTO
}

Si bien el código parece pasar por el compilador, falla durante la vinculación con el siguiente mensaje de error (desde el IDE de Arduino)

wiring.c.o (símbolo del plugin): En la función ‘__vector_16’:
(.text+0x0): múltiple definición de ‘_vector_16’
sketch\MYTESTPROGRAM.ino.cpp.o (símbolo del plugin):(.text+0x0): definido por primera vez aquí
collect2.exe: error: ld devolvió el estado de salida 1
estado de salida 1
Error al compilar para la placa Arduino Uno

Este problema es un obstáculo para un proyecto más grande en el que estoy trabajando, así que estaría muy agradecido por cualquier consejo adicional sobre si puedo reemplazar la rutina de servicio de interrupción (sin alterar ni recompilar las bibliotecas de Arduino).

Gracias nuevamente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para reconfigurar el vector de interrupción por desbordamiento del Temporizador 0 para que apunte al punto de entrada de la ISR de su propio código, es necesario definir una nueva función ISR(TIMER0_OVF_vect) en su código que sirva como sustituto de la presente en wiring.c. Sin embargo, dado que se trata de una interrupción anidada, debe asegurarse de que su código de ISR no interfiera con el código de Arduino existente, ya que eso podría causar un comportamiento inesperado o errores.

    Una vez que haya definido su función ISR, es posible que el IDE de Arduino muestre un mensaje de error de múltiples definiciones del vector de interrupción por desbordamiento del Temporizador 0, ya que tanto su código como el código de Arduino intentan utilizarlo. Para resolver este problema, puede colocar su función ISR en un archivo .c o .cpp separado y excluir la dependencia del Temporizador 0 en wiring.c. Alternativamente, puede eliminar la ISR existente de wiring.c y redefinirla para llamar a su ISR en su lugar.

    Tenga en cuenta que si reconfigura el vector de interrupción por desbordamiento del Temporizador 0, es posible que otras funciones de tiempo de ejecución de Arduino que dependan de esta funcionalidad no funcionen como se esperaba, como mencionó en su pregunta original. Siempre es una buena idea probar minuciosamente su código antes de implementarlo en un entorno de producción para evitar problemas causados por interacciones inesperadas entre diferentes componentes de su sistema.

Comments are closed.