Atmega168 Power_down

Gast #4409952
Lesenswert?

Guten Abend,

da ich mir einfach nicht mehr zu helfen weiß, frage ich
jetzt einfach hier mal.
Mein Problem: Da meine Schaltung von einer Batterie versorgt
werden soll, möchte ich bei meinem Atmega168 den Power-Down
Mode verwenden. Da der uC jederzeit über die USART Schnittstelle
Daten empfangen können muss, muss ich auch in der Lage sein
über diese Schnittstelle aufzuwachen. Leider werde ich aus dem
Datenblatt nicht schlau.
Quellen, die den uC aus dem Power-Down Mode aufwecken können,
sind:

1.) INT1, INT0 (only level interrupt)
2.) TWI address match
3.) WDT

Was genau versteht man unter einem Level Interrupt? Wäre es
möglich, die USART Pins vor dem Übergang in den Power-Down
mode so umzukonfigurieren, dass am RX Pin ein Pin change
registriert werden könnte? Es wäre kein Problem über USART
zunächst eine Art Wakeup Pattern zu senden und erst nach dem
Aufwachen die eigentlichen Nutzdaten.
Was meint ihr? Gibt es eine Möglichkeit den uC via USART aus
dem Power Down zu holen?
Ich danke euch schon mal im Voraus.
Angehängte Dateien:
(Firma: matzetronics) #4409979
Lesenswert?

Sabse schrieb:
> Quellen, die den uC aus dem Power-Down Mode aufwecken können,
> sind:
>
> 1.) INT1, INT0 (only level interrupt)
> 2.) TWI address match
> 3.) WDT

Nicht nur, da steht auch Pinchange. Während die INT0 und INT1 keinen auf 
Flanken getriggerten IRQ erlauben, weil die Logik nicht aktiv ist, gilt 
das aber nicht für Pinchange Interrupts. D.h. ein Flankenwechsel bei 
aktivierten PC Interrupt weckt den MC.
Es ist also möglich, z.B. auf den RXD Pin einen Pinchange Interrupt zu 
legen, dieser wird den MC auch aus Powerdown aufwecken.
(Firma: matzetronics) #4410097
Lesenswert?

Das ist die wirklich interessante Frage - erkennt das USART noch dieses 
Startbit und kann seine Abtastung drauf einrasten oder nicht. Ich habs 
noch nicht ausprobiert, kann mir aber vorstellen, das die Dauer des 
Oszillatorstart sowie die Taktfrequenz darauf Einfluss haben.
Eine langsame Baudrate könnte auch nützlich sein.
#4410102
Lesenswert?

Falk B. schrieb:
>>'wake-up-pattern' 0xFF verwenden.
>
> Das ist vollkommen schnuppe, denn es gibt so oder so einen Pinwechsel
> vom Dauerstop (= High) zum Startbit (low).

Das Pattern ist nicht ganz unwichtig, wenn die UART-Logik des AVR auch 
erst zusammen mit dem Wakeup aufwacht. Die damit in Verbindung stehende 
Verzögerung kann zu Datenschrott führen. Beim Pattern 0xFF, ggf. 
zusammen mit einer zum Taktgenerator passenden Wartezeit, ist nach dem 
Startbit nie low auf der Leitung. Folglich wird entweder überhaupt 
nichts erkannt, oder 0xFF. Aber kein Schrott.
#4410181
Lesenswert?

@A. K. (prx)

>> Das ist vollkommen schnuppe, denn es gibt so oder so einen Pinwechsel
>> vom Dauerstop (= High) zum Startbit (low).

>Das Pattern ist nicht ganz unwichtig, wenn die UART-Logik des AVR auch
>erst zusammen mit dem Wakeup aufwacht.

Jain.

>Die damit in Verbindung stehende
>Verzögerung kann zu Datenschrott führen.

Dagegen muss eine STABILE UART-verbindung so oder so ausgelegt sein und 
sich nich einfach mal so aus dem Tritt bringen lassen.

>Beim Pattern 0xFF, ggf.
>zusammen mit einer zum Taktgenerator passenden Wartezeit, ist nach dem
>Startbit nie low auf der Leitung. Folglich wird entweder überhaupt
>nichts erkannt, oder 0xFF. Aber kein Schrott.

Der Ozillator braucht nach einem Power-Down sowieso ein gehörige Zeit 
zum Anlaufen. Und selbst wenn es schnell geht (RCO, externer Takt), kann 
man schlicht eine Zeichen-Zeit mit busy wait vertrödeln. So what!
#4410199
Lesenswert?

@ S. Landolt (Gast)

>Mir ist nach wie vor unklar, wie Sie das Ende eines beliebigen
>Aufwach-Musters erkennen, besonders bei Verwendung eines Quarzes mit
>seiner längeren Anlaufzeit.

???
Man wartet direkt nach dem Aufwachen im Interrupt einfach eine komplette 
Zeichenzeit (=10 Bit) und schaltet dann erst den UART RX Teil ein. Da 
ist man so oder so auf der sicheren Seite. Wo liegt das Problem?
#4410214
Lesenswert?

@ S. Landolt (Gast)

>> Wo liegt das Problem?
>Dass der Quarz zu Beginn nicht stabil läuft, die Messung der Byte-Zeit
>also ungenau wird;

Quark. Solange der Quarz noch anläuft, läuft die CPU so oder so nicht.

https://www.mikrocontroller.net/articles/Sleep_Mode#Morgenmuffel

Und selbst wenn der Quarz noch nicht "perfekt" eingeschwungen ist, ist 
dessen Frequenzfehler kleiner 1 Promille und damit für diese 
Zeitverzögerung mehr als genau genug.

> bei Verwendung des RC-Oszillators geht das, aber ganz
>einfach wird es ohne diese Zeitmessung unter Ausnutzung von 0xFF,
>insofern betrachte ich es nicht als 'schnuppe'.

Ich schon. Man kann auch 0x00 nehmen, dann ist der Puls breiter, aber 
ohne 2. fallende Flanke (welche der UART als STOP-START Übergang 
identifizieren würde). Oder 0x0F, 0x7F oder, oder oder. Wollen wir 
weiter philosophieren?
Gast #4410220
Lesenswert?

Als "philosophieren" würde ich es nicht bezeichnen, es geht schließlich 
um eine handfeste technische Lösung. Aber vermutlich würden Sie es mit 
den unterschiedlichen Mustern auch zum Laufen bringen, so wie ich es mit 
dem 0xFF erreichte. Und da sich offenbar der ursprüngliche Fragesteller 
bereits verabschiedet hat, mache das gleiche.
Gast #4420688
Lesenswert?

Einen schönen guten Morgen und ein gutes neues Jahr Euch allen!!

Der Urlaub ist zu Ende und ich freue mich über all die Antworten von 
Euch. Vielen Dank.
Ich bin gerade an der Implementierung und wollte euch fragen, was ihr 
davon haltet:

Bevor ich in den Power Down Mode gehe rufe ich folgende Funktion auf:
1
void USART_WAKE_UP_MODE(void)
2
{
3
  //The uC have to wake up from Power Down by PCINT16 (RX)
4
  
5
  //Disable USART RX
6
  UCSR0B &= ~(1<<RXEN0);
7
  
8
  //Disable RX Complete Interrupt
9
  UCSR0B &= ~(1<<RXCIE0);
10
  
11
  //Enable PCIE2 --> PCINT23...16
12
  PCICR = (1<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
13
  
14
  //Enable PCINT16 in mask
15
  PCMSK2 = (1<<PCINT16);
16
}

Das sollte mich im Moment des Aufwachens zu folgendem Interrupt führen:
1
ISR (PCINT2)
2
{
3
  //Change RX Pin to USART Mode
4
  USART_NORMAL_MODE();
5
}
6
[/code]
7

8
[c]
9
void USART_NORMAL_MODE(void)
10
{
11
  //Disable Pin Change interrupt
12
  PCICR &= ~(1<<PCIE2);
13
  PCMSK2 &= ~(1<<PCINT16);
14
    
15
  //Enable USART RX
16
  UCSR0B |= (1<<RXEN0);
17
    
18
  //Enable RX Complete Interrupt
19
  UCSR0B |= (1<<RXCIE0);
20
}

In der Theorie müsste er nun im USART Interrupt etwas empfangen:
1
ISR (USART_RX_vect)
2
{
3
  //USART Receive Handler
4
  unsigned char c;
5
  
6
  c = USART_Getc(); /* get received byte  */
7
  //Do something.
8
  
9
  
10
  //USART RX PIN back to Pin Change Interrupt
11
  USART_WAKE_UP_MODE();
12
}

Nachdem ich etwas empfangen habe, sollte der RX Pin wieder in den Pin 
Change mode gehen.
Was haltet ihr davon? Kann es leider noch nicht testen, da die Hardware 
noch fehlt.

Schöne Grüße,
Sabine.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren