Forum: Mikrocontroller und Digitale Elektronik AVR counter im Sleep.Mode


von County (Gast)


Lesenswert?

Hallo Forum,

ich habe ein Taktsignal, das einen Zähler hochzählen soll.
Der Controller ist die meiste Zeil im Sleep-Modus und sollte wenn 
möglich
zum Hochzählen nicht geweckt werden.
Die Frage ist geht das mit einem AVR(Mega328PB) und wenn ja wie?
Ich vermute, ich benötige dazu den Asynchronen Timer?
Welchen Pin kann ich als Zähleingang verwenden?

von Karl M. (Gast)


Lesenswert?

Hallo,

wenn ein Atmel AVR "rechnen" soll oder muss, dann muss er auch "laufen".
D.h. er muss sich außerhalb eines PowerDown Modus befinden.

von Purzel H. (hacky)


Lesenswert?

Es gibt ein Datenblatt, beim Hersteller, das beschreibt in welchem Modus 
welche Einheiten laufen

von Karl M. (Gast)


Lesenswert?

Jetzt ist natürlich die Frage, was bedeutet "einen Zähler hochzählen"?

Ein ext. Taktsignal an einen TimerX legen und diesen zählen lassen, oder 
Timer2 im "asynchronous mode" mit einem 32kHz Quarz betreiben?


Siehe Datenblatt atmega328pb: 15.1. Sleep Modes

Einige TimerX haben auch einen externen Eingang (External clock source) 
Tn Pin, mit n E {0,1,3,4}, über den ein Taktsignal zugeführt werden 
kann.

Dabei muss der AVR im "run" Zustand sein.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Karl M. schrieb:
> wenn ein Atmel AVR "rechnen" soll oder muss

Davon war allerdings nicht die Rede.

County schrieb:
> Ich vermute, ich benötige dazu den Asynchronen Timer?

Das ist der einzige, der keinen weiteren Takt braucht.

> Welchen Pin kann ich als Zähleingang verwenden?

TOSC1

Ist aber nicht ganz ohne: teilweise musst du bis zu zwei Flanken an
TOSC1 haben, bevor Registerwerte im Zähler 2 überhaupt übernommen worden
sind und du ihn schlafen legen darfst.

von County (Gast)


Lesenswert?

Karl M. schrieb:
> Einige TimerX haben auch einen externen Eingang (External clock source)
> Tn Pin, mit n E {0,1,3,4}, über den ein Taktsignal zugeführt werden
> kann.
>
> Dabei muss der AVR im "run" Zustand sein.

das möchte ich nicht, Controller soll in einem SLeep-Modus sein.


Der externe Takt soll einen Counter hochzählen. Ab und zu wacht der uC 
durch einen Interrupt auf und schaut sich den Counter-Zustand an.

Die "normalen" Timer/Counter können das nicht, da sie den Main-Takt zur 
Flankenerkennung benötigen.

Die Frage ist, ob das über den asynchronen Timer/Counter  geht, ich 
möchte damit nicht die CPU takten.

von County (Gast)


Lesenswert?

Jörg W. schrieb:
> Ist aber nicht ganz ohne: teilweise musst du bis zu zwei Flanken an
> TOSC1 haben, bevor Registerwerte im Zähler 2 überhaupt übernommen worden
> sind und du ihn schlafen legen darfst.

ist das irgendwo im Datenblatt beschrieben?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

County schrieb:
> Ab und zu wacht der uC durch einen Interrupt auf und schaut sich den
> Counter-Zustand an.

Durch welchen denn?  Du hast ja alle Clockdomains abgeschaltet außer
der asynchronen.  Diese zählt aber keine Zeit, sondern deine externen
Ereignisse … der einzige weitere mögliche Clock wäre dann der Watchdog
(im Interrupt-Modus), aber der ist natürlich ziemlich ungenau.

County schrieb:
> ist das irgendwo im Datenblatt beschrieben?

Ja, natürlich.  Das Kapitel über den asynchronen Zähler solltest du
dir schon mal durchlesen …

Ich würde wohl eher zu zusätzlicher Hardware greifen dafür.  Ein
ATtiny10 im IDLE sleep braucht nur einige 10 µA und hätte einen
16-Bit-Zähler.  Den wiederum könnte man dann vom Hauptprozessor mit
SPI gelegentlich auslesen.

Ein Hardware-CMOS-Zähler hätte praktisch gar keinen Ruhestrom, aber
man müsste dann entweder noch eine Schieberegister-Logik dranhängen,
um ihn mit SPI auszulesen oder ihn parallel auslesen.

: Bearbeitet durch Moderator
von County (Gast)


Lesenswert?

Jörg W. schrieb:
> Durch welchen denn?  Du hast ja alle Clockdomains abgeschaltet außer
> der asynchronen.  Diese zählt aber keine Zeit, sondern deine externen
> Ereignisse … der einzige weitere mögliche Clock wäre dann der Watchdog
> (im Interrupt-Modus), aber der ist natürlich ziemlich ungenau.

Genau eine Quelle ist zum Wecken ist der WDT, Genauigkeit spiel keine 
spielt keine Rolle, da der Zählerstand gesendet wird und der Empfänger 
eine Uhr hat.

Jörg W. schrieb:
> Ja, natürlich.  Das Kapitel über den asynchronen Zähler solltest du
> dir schon mal durchlesen …

mache ich

Jörg W. schrieb:
> Ich würde wohl eher zu zusätzlicher Hardware greifen dafür.

Darauf wird es wohl hinauslaufen, zumal der Pin TOSC1 auch die 
Verwendung eines Quarzes zum Takten des µC ausschließt.

von Ingo Less (Gast)


Lesenswert?

Ich glaube das geht nicht wie du es willst. Ginge denn ein externer 
Zähler?

von County (Gast)


Lesenswert?

Ingo Less schrieb:
> Ich glaube das geht nicht wie du es willst. Ginge denn ein
> externer
> Zähler?

Das wollte ich eigentlich vermeiden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

County schrieb:
> zumal der Pin TOSC1 auch die Verwendung eines Quarzes zum Takten des µC
> ausschließt.

ATmega8 oder Nachfolger?

Bei allen anderen sind XTAL und TOSC eigentlich getrennt.

von S. Landolt (Gast)


Lesenswert?

Es geht um den ATmega328PB.

Also ad hoc hätte ich gewettet, das geht mit ASSR.EXCLK; lasse mich aber 
gerne eines besseren belehren.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

S. Landolt schrieb:
> Es geht um den ATmega328PB.

Hatte ich übersehen, steht ja oben, stimmt.

> Also ad hoc hätte ich gewettet, das geht mit ASSR.EXCLK

Im Prinzip Ja, aber … was man sich damit an Kompromissen einhandelt, 
wurde schon genannt.

von S. Landolt (Gast)


Lesenswert?

Interessant wäre zu wissen, wie und wie oft der Zählerstand ausgelesen 
wird und um welche Zählfrequenz es geht. Auch was der ATmega328 sonst 
noch machen soll, der wird ja sicher nicht nur zählen.

von Peter D. (peda)


Lesenswert?

Nimm zum Zählen den Pin-Change-Interrupt.

von County (Gast)


Lesenswert?

Peter D. schrieb:
> Nimm zum Zählen den Pin-Change-Interrupt.

mache ich aktuell auch, im Moment kommen die Pulse auch nur alle paar 
Sekunden (Wasseruhr).
Da aber noch einige andere Funktionen und  Interrupts auf dem 
Controller laufen, wollte ich diese simple Zählfunktion an den 
"Maschinenraum" abgeben.

Danke für die Antworten.

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.