Ich schreibe ein C-Programm für ATmega64A, das eine INT0 ISR hat. Diese ISR sollte im Falle einer fallenden Flanke von INT0 ausgeführt werden ODER wenn der TIMER3 überläuft.
Um eine Verdoppelung des Codes zu vermeiden, möchte ich Int0 ISR in der Überlauf-ISR von Timer 3 auslösen.
Leider fehlt im Datenblatt eine solche Angabe. Zumindest im INTF-Registerbeschreibungsabschnitt:
Versucht das jemand? Oder kennt das vielleicht jemand theoretisch?
Nö.
Wenn Sie eine 1 in das Flag schreiben, wird es gelöscht. Das Schreiben einer 0 wird nichts tun.
avr-libc
Wenn Sie jedoch zwei (oder mehr) Vektoren mit genau demselben Code verwenden und haben möchten, ist dies möglich. Sie verwenden Interrupt-Aliasing. Ein Beispiel (von hier ):
ISR(PCINT0_vect){
...
// Code to handle the event.
}
ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect));
In diesem Beispiel teilen sich sowohl PCINT0
als auch PCINT1
denselben Unterbrechungscode – beide Einträge in der Vektortabelle zeigen auf dieselbe Funktion. Dies kann für Ihre Anforderungen ausreichend sein.
avr-libc
/ nicht immer eine gute Idee avr-gcc
. Dies kann zu zusätzlichem Overhead durch zusätzliche Register führen, die geschoben und gepoppt werden, und fügt auch Overhead von den Call/Ret-Befehlen hinzu. Aliasing, falls verfügbar, ist eine schöne, saubere Methode, die zusätzlich zu der ursprünglichen Interrupt-Routine zu keinem Overhead führt.
JimmyB