Forum: Mikrocontroller und Digitale Elektronik Interrupt Service Routine (AVR, AtmelStudio6 C++)


von Steve-o B. (steve_o)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Steve-o B. (steve_o)


Lesenswert?

Danke für die schnellen Antworten!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.