Guten Abend,
ich habe hier einen Code der zwar wunderbar funktioniert, ich aber gerne
wüsste warum.
Geht um den Power Down Sleep Mode eines Atmel Attiny44 µC, der bei einem
Pinchange an einem der beiden Pins aufwachen soll.
Folgende ISR Routine wird beim Pinchange aufgerufen:
1 | ISR (PCINT1_vect) {
|
2 |
|
3 | arbeiten = true;
|
4 |
|
5 | }
|
Folgende Funktionen konfigurieren den Sleep Mode und schicken den µC ins
Bett:
1 | void setup_sleep() {
|
2 |
|
3 | cli();
|
4 | GIMSK |= (1<<PCIE1);
|
5 | PCMSK1 |= ((1<<PCINT8)|(1<<PCINT9));
|
6 | sei();
|
7 | }
|
8 |
|
9 | void goto_sleep() {
|
10 |
|
11 | ADCSRA &= ~_BV(ADEN); //ADC ausschalten
|
12 |
|
13 | MCUCR |= (1 << SM1) & ~(1 << SM0); //Sleep Modus = Power Down
|
14 | MCUCR |= _BV(SE); //Sleep Enable setzen
|
15 | sleep_cpu(); // Schlafe
|
16 | MCUCR &= ~(1<<SE); // Sleep Disable Bit setzen
|
17 | }
|
Wie gesagt, das funktioniert auch super wenn ich goto_sleep(); aufrufe.
Nun meine Frage: Woher weiß der µC welche ISR er beim Pinchange aufrufen
soll? Warum weiß er dass PCINT1_vect hierfür zuständig ist?
Vielen Dank :)