Interrupt Service Routine (AVR, AtmelStudio6 C++)

OP #2804655
Hallo Leute,

ich beschäftige mich zur Zeit mit dem Thema Interrupts und habe ne Frage 
zur Interrupt Service Routine (ISR).

Ich verwende das AtmelStudio6 C++.

Hier mal etwas Code:

*******************
1
#ifndef F_CPU
2
#define F_CPU 16000000
3
#endif
4

5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7

8
int main(void)
9
{
10
    DDRD=0xFF;              
11
  
12
    PORTD|= (1<<PIND7);          //LED grün an        
13
  
14
    sei();      //aktiviere global interrupts
15

16
    PCICR |= (1 <<PCIE0);  //aktiviere PinChangeInterrupt 0(PCI0)
17
  
18
    PCMSK0 |= (1 << PCINT2);    //PB2 entspricht PCINT0
19
  
20
    while(1)
21
    {
22
        //mache irgendwas bis Taster an PINB2 gedrückt wird.. 
23
        //dann Interrupt
24
    }
25
}
26

27
ISR (PCINT0_vect)
28
{
29
  PORTD ^= 1 << PIND4; //LED rot an/aus
30
  PORTD ^= 1 << PIND7; //LED grün aus/an
31
  
32
  //evtl. weiterer Code
33
}
*******************

Ich habe in verschiedenen Foren/Tutorien gelesen, dass es nötig sein 
kann die Prozessor-Register (wie SREG, usw.) zu speichern, da der 
Interrupt in manchen fällen schreibend auf die Register zugreift. Somit 
können deren Werte geändert werden, was später durchaus uncool werden 
kann...

Meine Frage:

Werden die Register automatisch gespeichert und wiederhergestellt, wenn 
ich die ISR wie in meinem Code-Beispiel aufrufe, also: ISR(*_vect)?

Oder muss ich das zusätzlich noch implementieren?

Ich weiß, dass die Interrupts automatisch gesperrt werden und am schluss 
auch wieder aktiviert, aber beim Sichern der Register bin ich nicht 
sicher.
Habe schon viel gelesen aber das hab ich leider noch nicht ganz kapiert.

Wäre nett, wenn ihr mir weiterhelfen könntet.

Danke schon mal!

Steve
Steve-o Bane schrieb:

> Ich habe in verschiedenen Foren/Tutorien gelesen, dass es nötig sein
> kann die Prozessor-Register (wie SREG, usw.) zu speichern, da der
> Interrupt in manchen fällen schreibend auf die Register zugreift. Somit
> können deren Werte geändert werden, was später durchaus uncool werden
> kann...

Ja - wenn du Assembler programmierst.

Du bist hier in einer Hochsprache. Da ist es der Job des Compilers, sich 
um solche Kleingkeiten zu kümmern.


> Werden die Register automatisch gespeichert und wiederhergestellt, wenn
> ich die ISR wie in meinem Code-Beispiel aufrufe, also: ISR(*_vect)?

Du 'rufst' die ISR überhaupt nicht auf. Die wird für dich aufgerufen. 
Wann immer das entsprechende Ereignis eintritt und die Interrupts 
freigegeben sind.

> Oder muss ich das zusätzlich noch implementieren?

Darum brauchst du dich nicht kümmern.

(Unter anderem) deswegen benutzt man ja Hochsprachen und Compiler, damit 
man sich um diesen ganzen Kleinkram nicht kümmern muss.


> Ich weiß, dass die Interrupts automatisch gesperrt werden und am schluss
> auch wieder aktiviert

das ist schon mal gut, das du das weißt.
Gast
Steve-o Bane schrieb:
> Werden die Register automatisch gespeichert und wiederhergestellt, wenn
> ich die ISR wie in meinem Code-Beispiel aufrufe, also: ISR(*_vect)?

ja das Register und auch die Normalen Register R1-R32 werden bei bedarf 
gesichert.

Außerdem rufst du die ISR ja nicht auf, die deklariest sie nur.

Die interupts werde von der Hardware gesperrt, das muss gar nicht in 
software gemacht werden.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.