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
Man kann ja auch 950ms fest schlafen und dann wieder aufwachen ...
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
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!
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.
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.
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
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
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.
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
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...
@ 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 ;-)
@ 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... :-)
@ 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.
Ok, mir geht es um den niedrigsten... ;-) Aber gut, das wir uns dann in Summe doch einig sind... :-)
Der Worte sind genug gewechselt, Laßt mich auch endlich Taten sehn! Indes ihr Komplimente drechselt, Kann etwas Nützliches geschehn.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.