AVR Power-Down mit USART wakeup

Gast #406788
Lesenswert?
• ▲
▼
Hallo,

ist es möglich den AVR (ATMEGA169) in den Power-Down-Modus zu schicken
und ihn vom USART-Received-Interrupt wieder aufzuwecken?

Im Datenblatt steht davon leider nichts explizits drin (vgl
two-wire-interface) ...

Der Controller macht halt im Prinzip nichts anderes als auf die RS232
zu warten und da es sich um ein Batteriebetriebenes Gerät handelt, wäre
schon wünschenswert da Strom zu sparen ...

Weiß da jemand was näheres?
Gast #406789
Lesenswert?
• ▲
▼
Im Datenblatt, Abschnitt "Power Management and Sleep Modes" steht
eigentlich für jeden einzelnen Sleep-Modus, welche Interrupts zum
Aufwecken genutzt werden können. Habe kein Datenblatt vom 169 da, aber
bei anderen AVRs geht das über USART nur im IDLE-Mode und nicht im
Power-Down.
#406790
Lesenswert?
• ▲
▼
Um Daten über UART zu empfangen, muss die CPU-Clock am laufen sein. Das
ist nur im Idle-Mode der Fall.

Es ist denbar, die Pegeländerung am RXD-Pin zum Aufwecken aus tieferen
PWDN-Modi zu benutzen, indem man den UART-Eingang sowohl auf RXD als
auch auf einen INT-Pin legt. Dabei ist aber zu beachten, dass der
Oszillator eine Weile braucht, um anzulaufen. Die ersten paar Bytes
einer Übertragung sind also Schrott. Abhilfe z.B. durch ein erstes
Dummy-Byte zum Aufwecken, dann Pause, dann erst Daten.

Bitte auch den Stromverbrauch der RS232-Treiber beachten. Es gibt
mittlerweile sehr gute Treiber mit PWDN-Möglichkeit, die während dem
PWDN den Zeichenempfang erlauben.

Gruß, Stefan
Gast #406791
Lesenswert?
• ▲
▼
@Stefan:
Richtig, im UART-Mode kann das aus genau dem Grunde nicht
funktionieren. Bei USART wäre das aber zumindest theoretisch möglich,
da bei USART-Operation der Schiebetakt von extern mitgeliefert werden
kann...

Aber wie schon weiter oben gesagt: Alle Theorie nützt nix, wenn die
Praxis dafür nicht vorgesehen ist...
Gast #406793
Lesenswert?
• ▲
▼
>>>
Beim ATmega169 kann der RX-Pin auch als Quelle fuer Pin-Change
Interrupt
genutzt werden. Man benoetigt somit keine externe Verbindung RX zu
INT0.
<<<

Gut das du das erwähnst ... Pin-Change-Interrupts funktionieren auf
meinem MEGA169 nämlich gleich überhaupt nicht ...

Ich wollte PB1 (anderes Problem) als PCInterrupt verwenden und habe
folgendes gemacht:


void PINC_Init(void)
{
// PCINT9 ist PB1
PCMSK1 |= (1<<PCINT9);
// Interrupt enable setzen
EIMSK |= (1<<PCIE1);
sei();
}

SIGNAL (SIG_PIN_CHANGE1)
{
[...]
}

Ich habs tausend mal mit dem Datenblatt gecheckt, aber ich finde den
Fehler nicht und der Interrupt wird einfach nicht ausgeführt ...
Gast #406794
Lesenswert?
• ▲
▼
Die Probleme haben sich jetzt doch endlich in Wohlgefallen aufgelöst
...

Ich verwende jetzt den Idle-Mode und beim anderen PCINT-Problem war der
Fehler natürlich im [...] versteckt ...

Ich glaub ich bin heute schon etwas arg müde und sollte lieber
Feierabend machen :/

Mfg
Thomas

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.