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