www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR: Merkwürdiges Verhalten des externen Interrupts


Autor: Luky S. (luky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?
SIGNAL(SIG_INTERRUPT0) {
   PORTB |= (1<<PB0); //PIN an

//Wenn USART_transmit aktiv, dauert es 0,3µs länger, in die Interruptroutine zu springen
//  USART_transmit(cnt++);

   PORTB &= ~(1<<PB0); //PIN Aus
}

void main(void)
...
EICRA = (1<<ISC00); // interrupt on INT0 pin state change
EIMSK = (1<<INT0); //enable INT0
sei();


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Sichert der Compiler hier ev. nicht in der Interruptroutine benötigte Register
> nicht mit?

Für gewöhnlich sichert der Compiler nur die Register, die auch verwendet 
werden.  Es sei denn, es wird eine Funktion aufgeruffen. Dann kann der 
Compiler nicht mehr feststellen, welche Register das sind, und sichert 
alle.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lukas Slz wrote:

> Sichert der Compiler hier ev. nicht in der Interruptroutine benötigte
> Register nicht mit?

Natürlich nicht, warum sollte er?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus wrote:

> Für gewöhnlich sichert der Compiler nur die Register, die auch verwendet
> werden.  Es sei denn, es wird eine Funktion aufgeruffen. Dann kann der
> Compiler nicht mehr feststellen, welche Register das sind, und sichert
> alle.

Nein, nicht alle. Er sichert zusätzlich die "Call-Clobbered-Register". 
Das sind zwar einige, aber nicht alle.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm noch ein Klaus. :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.