Forum: Mikrocontroller und Digitale Elektronik ATMega324 Power-Down Modus Probleme UART


von Alex K. (derheld2k1)


Lesenswert?

Hallo,

wahrscheinlich grad schlechte Zeit, aber ich versuchs trotzdem mal :)

Ich habe einen ATMega324A und empfange über UART im Interrupt Modus 
Zeichen von einem GPS Modul.
Nun versuche ich den Controller in den Power-Down Modus zu versetzen 
mit:
1
SMCR |= (1<<SE);
2
SMCR |= (1<<SM1);

Allerdings wird dann weiterhin die ISR des UARTS aufgerufen.

Habe ich den Controller überhaupt in den PowerDown Modus versetzt, oder 
wird er durch den UART Interrupt einfach wieder aufgeweckt.

Falls er dadurch aufgeweckt wird, ist es dann ausreichend mittels cli(); 
die Interrupts global zu deaktivieren (bzw. den UART RX Interrupt)?

Danke schonmal,
Alex

von g457 (Gast)


Lesenswert?

> Nun versuche ich den Controller in den Power-Down Modus zu versetzen mit:

Machst Du danach auch noch ein 'sleep'? Mit obigen Befehlen hast Du 
nämlich nur den gewünschten Modus konfiguriert.

HTH

von Alex K. (derheld2k1)


Lesenswert?

> Machst Du danach auch noch ein 'sleep'? Mit obigen Befehlen hast Du
> nämlich nur den gewünschten Modus konfiguriert.

Nein, wusste ich nicht.
Dann muss ich also die avr/sleep.h auch noch einbinden.
Das SE bit habe ich bereits "per Hand" gesetzt.
Dann muss ich ja nur sleep_cpu() aufrufen und nicht sleep_enable() oder 
sleep_mode()?

PS: Ich will nie wieder aufwachen wenn der Sleepmodus einmal aktiviert 
wurde

von g457 (Gast)


Lesenswert?

> Dann muss ich also die avr/sleep.h auch noch einbinden.

Müssen ist relativ - asm sleep kannst Du auch direkt absetzen. Es macht 
halt das Leben leichter (gäbe dort neben sleep_cpu() auch noch 
sleep_enable(), sleep_disable() und set_sleep_mode(..)).

> Ich will nie wieder aufwachen wenn der Sleepmodus einmal aktiviert wurde

Ein derartiger Sleep-Modus ist nicht dokumentiert - da hilft nur Strom 
abdrehen.

HTH

von Alex K. (derheld2k1)


Lesenswert?

Alles klar, danke für die Hilfe.

Ich werde nun so in den "unendlichen" Sleep gehen, wenn der Akku leer 
ist:
1
// Interrupts ausschalten
2
cli();
3
// AVR in Power-Down Mode
4
SMCR |= (1<<SE);
5
SMCR |= (1<<SM1);
6
sleep_cpu();

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.