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?
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.
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.
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.
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?
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.
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.
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.
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.
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.
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.