Forum: Mikrocontroller und Digitale Elektronik Atmega168 Power Down und Int0 ISR


von Chris (Gast)


Lesenswert?

Hallo,

ich steh mal wieder total aufm Schlauch.

Folgendes Programm funktioniert einwandfrei (ISR für Timer auch, hab ich 
aber jetzt weggelassen), die Warteleuchte schaltet ein, wenn INT0 auf 
Masse gezogen wird:
1
int main(void)
2
{
3
DDRC = (1<<PC0); // Warteleuchte Ausgang
4
5
// Pullup an PIN2 aktivieren. (Als eingang geschaltet INT0)
6
PORTD = (1<<PIND2);
7
8
// Set Timer mit Interrupt für LEDs und Sekunden zähler
9
// Comparewert errechnet mit Prescaler 1024 -> 14399
10
TCCR1B = (1<<WGM12) | (1<<CS10) | (1<<CS12);
11
OCR1A = 14399;
12
TCNT1 = 0;
13
TIMSK1 = (1<<OCIE1A);
14
15
// Interrupt für RI einrichten
16
EICRA = (1<<ISC01); // Erkenne fallende Flanke an RI
17
EIMSK = (1<<INT0); // Löse bei INT0 Interrupt aus
18
19
sei();
20
21
while (1)
22
{
23
24
}
25
26
}
27
28
ISR(INT0_vect) // Interrupt Vector für RI Pin
29
{
30
PORTC |= ( 1 << PC0 ); // Warteleuchte an
31
}

Sobald ich Das ding aber schlafen lege in der while-Endlosschleife, 
Schaltet die Warteleuchte nicht mehr ein, bzw. wird die ISR nicht mehr 
ausgeführt:
1
.
2
.
3
.
4
while (1)
5
{
6
        sleep_sek = 0;
7
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
8
        sleep_mode();
9
}
10
.
11
.
12
.
Mit diesem Code wird die ISR nie ausgeführt...

Wieso?
Kann mir jemand helfen? "Verpasst" der Controller die ISR beim 
Aufwachen?

Dank und Gruß
Chris

von MWS (Gast)


Lesenswert?

Nur Level-Interrupt, kein Pinchange aus Powerdown, siehe DB.

von spess53 (Gast)


Lesenswert?

Hi

>EIMSK = (1<<INT0); // Löse bei INT0 Interrupt aus

Soweit ich mich erinnere wird der µC durch einen Level-Interrupt 
(INT1:INT0= 00) aufgeweckt.

MfG Spess

von Chris (Gast)


Lesenswert?

Mmm, also gut, was ich verstanden habe bzw. im DB gefunden habe ist, 
dass ich nicht auf den Flankenwechsel reagieren kann sondern nur auf 
einen Low-Level.

Der PIN2 (INT0) wird durch mein Modem 120ms low gehalten. Reicht das 
überhaupt um einen Interrupt auszulösen?

Also setzte ich nur EIMSK = (1<<INT0); um einen Interrupt bei Low-Level 
an INT0 auszulösen?!

Das scheint allerdings genau so wenig zu funktionieren.

Bitte etwas ausführlichere Antworten mit etwas Erklärung.

Dank und Gruß
Chris

von Chris (Gast)


Lesenswert?

Ah - ok. Funktioniert doch!!

DANKE!

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.