AVR ATmega: ¿puedo activar una interrupción externa configurando el bit de indicador INTF correspondiente?

Estoy escribiendo un programa en C para ATmega64A que tiene un ISR INT0. Este ISR debe ejecutarse en caso de flanco descendente de INT0 O si el TIMER3 se desborda.

Para evitar duplicar el código, me gustaría activar Int0 ISR en el ISR de desbordamiento del temporizador 3.

Desafortunadamente no hay tal información en la hoja de datos. Al menos en la sección de descripción del registro INTF:

ingrese la descripción de la imagen aquí

¿Alguien intenta esto? ¿O tal vez alguien sabe esto en teoría?

¿Podría estar haciendo más en esa ISR de lo que idealmente debería?

Respuestas (1)

No.

Escribir un 1 en la bandera la borrará. Escribir un 0 no hará nada.


Sin embargo, si está usando avr-libcy quiere tener dos (o más) vectores que tengan exactamente el mismo código, esto es posible. Utiliza alias de interrupción. Un ejemplo (de aquí ):

ISR(PCINT0_vect){  
    ...  
    // Code to handle the event.
}

ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect));

En este ejemplo, ambos PCINT0y PCINT1compartirán el mismo código de interrupción: ambas entradas en la tabla de vectores apuntarán a la misma función. Esto puede ser suficiente para sus necesidades.

Entonces, ¿hay alguna solución para tal tarea (ejecutar un código de varios ISR)?
@RomanMatveev ve mi edición: tuve que buscar la sintaxis.
... o simplemente puede crear cada ISR como un shell (contenedor) que llame a una subfunción común.
@DaveTweed eso se puede hacer, pero llamar a funciones desde ISR no siempre es una buena idea al menos con avr-libc/ avr-gcc. Puede dar como resultado una sobrecarga adicional de registros adicionales que se empujan y abren, y también agrega una sobrecarga de las instrucciones call/ret. La creación de alias, si está disponible, es un método agradable y limpio que da como resultado una sobrecarga cero además de la rutina de interrupción original.
El aliasing tiene su propia desventaja: los ISR deben ser EXACTAMENTE iguales. Por lo tanto, no puedo borrar INT0 ISR y el registro del temporizador desde Timer ISR al mismo tiempo.
@RomanMatveev, ¿qué estás tratando de aclarar? Si son solo las banderas, se autolimpian. De lo contrario, usar la sugerencia de DaveTweeds es la única forma simple de hacerlo si desea que cada uno haga cosas diferentes.
Tom, hablo sobre el registro del contador del temporizador (TCNT) claro. Es un ejemplo artificial (ya que TCNT no debería borrarse en realidad). Además, pensé en activar el INT0 ISR cambiando el estado del pin. ¿Funcionará?
@RomanMatveev Creo que cambiar el registro de salida debería activar el ISR, pero no estoy 100% seguro.