Forum: Mikrocontroller und Digitale Elektronik AVR UART Sleep ext. Interrupt


von Felix N. (time2ride)


Lesenswert?

Hi,

ich spiele gerade mit den sleep modes eines Mega128 herum. Für ein 
Projekt bei dem ca. alle 1 Sekunde daten über UART an den uC gesendet 
werden hat der uC dazwischen viel Zeit, in der er nichts macht, daher 
möchte ich ihn in einen sleep mode versetzen. Einfachste Variante ist 
der "Idle"-Mode.
Jetzt möchte ich aber noch mehr Energie sparen und hatte folgende Idee:

uC in den "Standby" Modus versetzen (UART ist da deaktiviert), einen 
ext. Interrupt Pin mit dem UART-Rx Pin verbinden, damit eingehende UART 
Daten erkannt werden können indem der uC durch den ext. Interrupt 
aufwacht, sobald sich was auf der UART Leitung tut.

Hat das schonmal jemand so gemacht, wird das funktionieren? Der uC läuft 
mit 16mHz, braucht aus dem Standby 6 Taktzyklen zum aufwachen. Die UART 
Kommunikation läuft mit 9600bd, evtl auch 57000bd. Meiner Meinung nach 
sollte das reichen um auch das erste Zeichen vom UART noch 
mitzubekommen.
Was meint ihr dazu?

Grüße
Felix

von Falk B. (falk)


Lesenswert?

Kann funktionieren, muss nicht. Probiers aus.

von Purzel H. (hacky)


Lesenswert?

Man kann ja auch 950ms fest schlafen und dann wieder aufwachen ...

von Holger Sch (Gast)


Lesenswert?

Hallo Felix,

mit dem 1. Byte wird's nicht funtionieren denn
DB Atmega128 AVR-07/09 sagt:

"When the clock recovery logic detects a high (idle) to low (start) 
transition on the RxD line, the
start bit detection sequence is initiated."

Dies bekommt der schlafende ATmega nicht mit.

Gruß Holger

von Felix N. (time2ride)


Lesenswert?

Hi,

danke euch allen. Ich hab jetzt mal rumprobiert, und es scheint 
tatsächlich nicht zu gehen.
Der Grund wird vermutlich der sein, dass der UART das Startbit nicht 
mitbekommt, so wie es Holger geschrieben hat.
Die Möglichkeit 950ms zu schlafen und dann durch einen Timer aufzuwachen 
geht nicht, weil die Daten nicht sicher alle 1 Sec. kommen und dann die 
Gefahr zu groß ist Daten zu verlieren.

Fazit: Geht nicht!

von Walter S. (avatar)


Lesenswert?

Felix C. schrieb:
> Fazit: Geht nicht!

oder erst ein Aufwachbyte schicken?

von Felix N. (time2ride)


Lesenswert?

Walter S. schrieb:
> oder erst ein Aufwachbyte schicken?

Wäre eine Möglichkeit aber der Sender ist ein fertiges Modul, dessen 
Kommunikation ich nicht beeinflussen kann.

von MWS (Gast)


Lesenswert?

Entkopple die Original-RxD-Verbindung mit 'nem Widerstand, verbinde 
einen Portpin mit RxD, vor dem Sleep setz' den Pin auf High & Ausgang, 
in der ISR setz' auf Low & Eingang, damit bekommt der UART sein 
Startsignal. Der Ext. Int muss an die andere Seite des Widerstands, an 
TxD des Moduls.

von Michael R. (mr-action)


Lesenswert?

Moin Moin,

hat die Idee von MWS mal jemand ausprobiert? Ich hab grade quasi das 
gleiche Problem, kann den Sender aber nicht beeinflussen (Dummy Byte vor 
weg) und da es über Batterien läuft, möcht ich auch nicht unnötig lange 
wach sein (regelmässig aufwachen und aufs nächste Datenpaket warten)... 
;-)

Alternativ könnte man sonst ja noch mit einem Software UART arbeiten...

Viele Grüße,
der Micha...

: Bearbeitet durch User
von Felix N. (time2ride)


Lesenswert?

Hi,
ich hab es damals nicht ausprobiert. Interessieren würde es mich aber 
immer noch ;). Vor allem ob das mit dem Timing dann noch hinhaut.
Grüße
Felix

von Karl H. (kbuchegg)


Lesenswert?

Felix C. schrieb:
> Hi,
> ich hab es damals nicht ausprobiert. Interessieren würde es mich aber
> immer noch ;). Vor allem ob das mit dem Timing dann noch hinhaut.

Denke schon, dass es dann noch klappen wird.
So lange braucht der AVR ja nicht zum aufwachen.

Was ist denn die Idee hinter der ganzen Aktion. Die Idee ist es ja, die 
erste Flanke einer eingehende UART Übertragung als Interrupt zu 
verwenden und nach dem Aufwachen des µC auf dem eigentlichen UART 
Eingang des µC selbst noch mal eine Flanke zu erzeugen, die die UART 
triggert mit dem Empfang eines Bytes zu beginnen.
In der UART hat man einen gewissen Zeitspielraum. Erfolgt also die per 
Software erzeugte erste Flanke nur ganz kurz hinter der eigentlichen 
ersten Flanke vom Startbit der Gegenstelle, dann hinkt zwar die eigene 
UART im Timing ein klein wenig hinterher, wenn es nicht zu viel ist, 
dann sollte das aber kein Problem sein.

von (prx) A. K. (prx)


Lesenswert?

Karl Heinz schrieb:
> So lange braucht der AVR ja nicht zum aufwachen.

Kommt auf den Sleep-Modus an. Mit laufendem Takt ist er schnell genug. 
Mit schlafendem Takt wäre nur der RC-Oszillator brauchbar, aber der ist 
für UART grenzwertig.

Wobei natürlich auch die Bitrate eine Rolle spielt. In diesem Fall wird 
es ausnahmsweise mit geringer Bitrate besser.

: Bearbeitet durch User
von Michael R. (mr-action)


Lesenswert?

Also ich habs mal eben überschlagen - korrigiert mich, wenn ich mich 
spontan vertan habe... Als µC hab ich jetzt mal den ATMega328P und 
entsprechend die Daten aus seinem Datenblatt angenommen...

9600Baud => 0,1042ms Bitzeit

Dazu ein 16MHz Systemclock...

Bei Verwendung eines normalen Quarz möchte der AVR gerne 16k Takte haben 
- also 1ms... Da ist nicht nur das erste Bit sondern schon das ganze 
erste Byte vorbei...

Das schnellste, was ich spontan gefunden habe, ist der Ceramic 
resonator... Mit ihm will der AVR nur noch 258 Takte und somit 
0,016ms...

Also in Summe dann doch alles etwas knapp - aber sollte tatsächlich 
gehen...

Achja, als Sleep hab ich natürlich Power-down angenommen... Für 
Power-save gilt aber ja das Gleiche - wenn als der Timer2 nicht oder nur 
async läuft...

von Falk B. (falk)


Lesenswert?

@ Michael R. (mr-action)

>9600Baud => 0,1042ms Bitzeit
Sieht so aucs.


>Bei Verwendung eines normalen Quarz möchte der AVR gerne 16k Takte haben
>- also 1ms...

Nö. Das kann man einstellen. Siehe

http://www.mikrocontroller.net/articles/Sleep_Mode#Stand_By

>Da ist nicht nur das erste Bit sondern schon das ganze
>erste Byte vorbei...

Er braucht nur 6 Takte, um aus Standby aufzuwachen. Power Down geht hier 
so oder so nicht. Hat der OP schon geschrieben.

>Das schnellste, was ich spontan gefunden habe, ist der Ceramic
>resonator... Mit ihm will der AVR nur noch 258 Takte und somit
>0,016ms...

Das ist Power Down.

>Also in Summe dann doch alles etwas knapp - aber sollte tatsächlich
>gehen...

Ja, aber nicht wie von dir beschrieben ;-)

von Michael R. (mr-action)


Lesenswert?

@ Falk Brunner (falk)
>>Bei Verwendung eines normalen Quarz möchte der AVR gerne 16k Takte haben
>>- also 1ms...
>
> Nö. Das kann man einstellen. Siehe
>
> http://www.mikrocontroller.net/articles/Sleep_Mode#Stand_By

Naja, dann nehmen wir die Werte im Datenblatt als die, die man nutzen 
sollte... Trotzdem sind die Werte ähnlich den Werten von deinem Link 
unter Power-down / Power-save... Es geht ja letztendlich um den 
niedrigsten Stromverbrauch - den schaffen wir aber ja nicht mit dem 
Standby...

>
>>Da ist nicht nur das erste Bit sondern schon das ganze
>>erste Byte vorbei...
>
> Er braucht nur 6 Takte, um aus Standby aufzuwachen. Power Down geht hier
> so oder so nicht. Hat der OP schon geschrieben.

Ja - im Standby... Nicht aber in Power-down bzw. Power-save, wenn der 
Clock steht...

>>Das schnellste, was ich spontan gefunden habe, ist der Ceramic
>>resonator... Mit ihm will der AVR nur noch 258 Takte und somit
>>0,016ms...
>
> Das ist Power Down.

Jop

>>Also in Summe dann doch alles etwas knapp - aber sollte tatsächlich
>>gehen...
>
> Ja, aber nicht wie von dir beschrieben ;-)

Naja, mit nem Resonator könnte es knapp werden aber klappen - 
spätestens, wenn man dann das erste Byte per Software UART empfängt und 
danach den Hardware UART Arbeiten lässt, sollte es aber wirklich klappen 
- früh genug wach wäre man dann ja, auch wenn es unschön ist... Aber ich 
habe halt auch keine Lust alle 2 Wochen die Batterien zu tauschen, wenn 
ich es auch alle 4 Wochen machen könnte... :-)

von Falk B. (falk)


Lesenswert?

@ Michael R. (mr-action)

>sollte... Trotzdem sind die Werte ähnlich den Werten von deinem Link
>unter Power-down / Power-save...

Das hat auch keiner bestritten.

> Es geht ja letztendlich um den
>niedrigsten Stromverbrauch -

Nö, um NIEDRIGEN, nicht den NIEDRIGSTEN.

von Michael R. (mr-action)


Lesenswert?

Ok, mir geht es um den niedrigsten... ;-)

Aber gut, das wir uns dann in Summe doch einig sind... :-)

von der alte Hanns (Gast)


Lesenswert?

Der Worte sind genug gewechselt,
Laßt mich auch endlich Taten sehn!
Indes ihr Komplimente drechselt,
Kann etwas Nützliches geschehn.

von c-hater (Gast)


Lesenswert?

Felix C. schrieb:

> Der Grund wird vermutlich der sein, dass der UART das Startbit nicht
> mitbekommt, so wie es Holger geschrieben hat.

Sicher. Aber natürlich kann man tricksen, wenn man ohnehin einen zweiten 
Pin am Signal hat. Und das hast du, nämlich deinen Aufwach-Pin.

> Fazit: Geht nicht!

"Geht nicht", glaube ich erst, wenn ich es selbst durchdacht habe.

Hier ist die Sache praktisch sofort klar: es muß gehen.

Der Trick ist ganz einfach: nach dem Aufwachen gleich als erstes (noch 
in der ISR) den Aufwach-Pin auf Ausgang mit High-Pegel schalten, für 
einen Takt(*) auf diesem Pegel lassen und dann wieder auf Eingang 
schalten.
Natürlich müssen die dann kurzzeitig "gegeneinander" arbeitenden 
Ausgänge von UART-Pegelwandler und Aufwach-Pin hinreichend durch einen 
Widerstand entkoppelt sein. Also etwa sowas:

 --------        ------
| MAX232 |------|  1k  |------*----RxD
 --------        ------       |
                               ----(PC)INTx


(*) Die Frage ist hier, ob ein MCU-Takt reicht, oder ob es ein UART-Takt 
sein muß. Aber das kann man ja leicht ausprobieren. Vermutlich reicht 
ein MCU-Takt. Wenn nicht, ist die UART beschissen designed.

Und natürlich wird die UART das Signal in der Folge nicht zum optimalen 
Zeitpunkt sampeln, sondern verspätet. D.h.: zumindest wird auf jeden 
Fall die Chance steigen, daß das erste Byte fehlerhaft empfangen wird. 
Wenn für das Pseudo-Stopbit ein MCU-Takt genügt, sollte das aber 
vernachlässigbar sein, wenn es ein ganzer UART-Takt sein muß, dann 
allerdings nicht mehr.

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.