Hallo!
Ich habe einen ATMega164P und habe mal nachgemesen, wie lange er
braucht, wenn der externe interrupt ausgelöst wird, in der
entsprechenden Interruptroutine einen Pin zu setzen. Dabei ist mir
aufgefallen, dass die Zeit stark schwankt, je nachdem ob in der
Interruptroutine nachher (!) noch eine Berechnung oder ein
Funktionsaufruf durchgeführt wird.
Soll die Interruptroutine nur einen Ausgang setzen, so ist dies nach
1,94µs erledigt. Kommt nachher jedoch noch ein Funktionsaufruf (Zeichen
über USART senden), so dauert es 2,24µs, bis der Pin gesetzt wurde.
Der Controller läuft mit 10MHz.
Sichert der Compiler hier ev. nicht in der Interruptroutine benötigte
Register nicht mit?
1 | SIGNAL(SIG_INTERRUPT0) {
|
2 | PORTB |= (1<<PB0); //PIN an
|
3 |
|
4 | //Wenn USART_transmit aktiv, dauert es 0,3µs länger, in die Interruptroutine zu springen
|
5 | // USART_transmit(cnt++);
|
6 |
|
7 | PORTB &= ~(1<<PB0); //PIN Aus
|
8 | }
|
9 |
|
10 | void main(void)
|
11 | ...
|
12 | EICRA = (1<<ISC00); // interrupt on INT0 pin state change
|
13 | EIMSK = (1<<INT0); //enable INT0
|
14 | sei();
|