Servus,
der interne RTC des ATtiny (betrieben vom 32kHz Ultra Low Power Crystal)
bringt mir auf 60 Sekunden ca 1 Sekunde Abweichung. Laut Spezifikation
im Datenblatt ist das aber total ok.
Um genauer zu werden habe ich eine 32kHz Quarz an TOSC1/TOSC2 mit 2x
22nF Caps gepackt.
Konfiguriert wurde wie folgt:
1
voidinitRtcClock(void)
2
{
3
uint8_ttemp;
4
5
/* Initialize 32.768kHz Oscillator: */
6
/* Disable oscillator: */
7
temp=CLKCTRL.XOSC32KCTRLA;
8
temp&=~CLKCTRL_ENABLE_bm;
9
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA,temp);
10
11
while(CLKCTRL.MCLKSTATUS&CLKCTRL_XOSC32KS_bm)
12
{
13
;/* Wait until XOSC32KS becomes 0 */
14
}
15
16
/* SEL = 0 (Use External Crystal): */
17
temp=CLKCTRL.XOSC32KCTRLA;
18
temp&=~CLKCTRL_SEL_bm;
19
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA,temp);
20
21
/* Enable oscillator: */
22
temp=CLKCTRL.XOSC32KCTRLA;
23
temp|=CLKCTRL_ENABLE_bm;
24
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA,temp);
25
26
while(RTC.STATUS>0)
27
{
28
;
29
}
30
31
RTC.CLKSEL=RTC_CLKSEL_TOSC32K_gc;
32
RTC.PITINTCTRL=RTC_PI_bm;
33
RTC.PITCTRLA=RTC_PERIOD_CYC32768_gc|RTC_PITEN_bm;
34
RTC.DBGCTRL=RTC_DBGRUN_bm;
35
}
Setup des XOSC32KCTRLA habe ich aus dem Beispiel von dem
tinyAVR1-RTC-example von Microchip entnommen.
Das Programm rennt und wenn ich den Quarz abziehe steht das Programm.
Scheint also über den externen Quarz zu laufen. (Hab leider kein Oszi)
Nur habe ich keinerlei Verbesserung der Genauigkeit. Auf 60 Sekunden
gesehen verschiebt sich der Tick wieder um 1 Sekunde. Sollte beim
externen Quarz doch genauer sein? Übersehe ich hier etwas?
_justified schrieb:> der interne RTC des ATtiny (betrieben vom 32kHz Ultra Low Power Crystal)> bringt mir auf 60 Sekunden ca 1 Sekunde Abweichung. Laut Spezifikation> im Datenblatt ist das aber total ok.
Nö, mit Quarz muß das viel genauer sein (wenige s je Tag).
1,7% schafft ja schon der RC-Oszillator.
_justified schrieb:> Um genauer zu werden habe ich eine 32kHz Quarz an TOSC1/TOSC2 mit 2x> 22nF Caps gepackt.
Das ist um den Faktor 1000 falsch.
Stefan ⛄ F. schrieb:> _justified schrieb:>> auf 60 Sekunden ca 1 Sekunde Abweichung>> Das wären ja 12 Minuten pro Monat! Ich wäre damit höchst unzufrieden.
Rechnen kannst du also auch nicht.
Für welche Lastkapazität ist denn dieser
> 32kHz Quarz an mit 2x 22nF Caps
vorgesehen? Und wie sieht der Aufbau aus, mit welchen parasitären
Kapazitäten ist dort zu rechnen?
Peter D. schrieb:> Das ist um den Faktor 1000 falsch.
Sorry habe mich vertippt. Das sind natürlich pF.
Stefan ⛄ F. schrieb:> Für welche Lastkapazität ist denn dieser>> 32kHz Quarz an mit 2x 22nF Caps> vorgesehen? Und wie sieht der Aufbau aus, mit welchen parasitären> Kapazitäten ist dort zu rechnen?
Verwendet wird in der Schaltung:
2x 22pF Keramikkondensator
1x AB26T Quarz (https://www.mouser.de/datasheet/2/3/AB26T-39673.pdf)
Aufgebaut ist das wie folgt:
Zwischen TOSC1 und TOSC2 hängt der Quarz. Zusätzlich an jedem Beinchen
vom Quarz noch ein 22pF Kondensator auf Ground.
Hallo,
also 32kHz Quarze gibts i.d.R. mit 6pF oder 12.5pF (bei deinem 12.5) da
sind die 22pF extern viel zu groß. Meist ist die interne Kapazität und
die der Leiterbahn so groß das überhaupt kein Kondensator extern
angeschlossen wird.
Die 22pF sind für Quarze im MHz Bereich.
Sascha
> Auf 60 Sekunden gesehen verschiebt sich der Tick wieder um 1 Sekunde.
Wie wird das festgestellt? Oder anders gefragt, liegt vielleicht
schlicht ein Additions- oder Rechenfehler vor?
Teo D. schrieb:> Scheint immer noch 2-4x zu hoch zu sein1Sascha W. schrieb:> also 32kHz Quarze gibts i.d.R. mit 6pF oder 12.5pF (bei deinem 12.5) da> sind die 22pF extern viel zu groß. Meist ist die interne Kapazität und> die der Leiterbahn so groß das überhaupt kein Kondensator extern> angeschlossen wird.> Die 22pF sind für Quarze im MHz Bereich.
Danke, das werde ich heute mal versuchen!
S. Landolt schrieb:> Wie wird das festgestellt? Oder anders gefragt, liegt vielleicht> schlicht ein Additions- oder Rechenfehler vor?
Ich nutze den PIT um eine LED blinken zu lassen. Der verwendet den 32kHz
Oszi und ist auf 32k Clock-Cycles eingestellt = 1s. In der Routine zähle
ich eine Variable bis 60 hoch und toggle die LED. Ein Rechenfehler ist
hier leider ausgeschlossen.
_justified schrieb:> Der verwendet den 32kHz> Oszi und ist auf 32k Clock-Cycles eingestellt = 1s.
Mit welchem Takt Du den Timer laufen läßt, sehe ich jetzt nicht. Sicher
ist jedoch, daß mit ext. Quarz der Teiler auf 32768 eingestellt werden
muß, um 1 s Intervalle zu erhalten.
Wenn Du die genaue Zeit haben willst, mußt Du auch mit genauen
Zahlenangaben arbeiten.
m.n. schrieb:> Mit welchem Takt Du den Timer laufen läßt, sehe ich jetzt nicht. Sicher> ist jedoch, daß mit ext. Quarz der Teiler auf 32768 eingestellt werden> muß, um 1 s Intervalle zu erhalten.
Das ist hier ersichtlich:
_justified schrieb:> RTC.CLKSEL = RTC_CLKSEL_TOSC32K_gc;> RTC.PITINTCTRL = RTC_PI_bm;> RTC.PITCTRLA = RTC_PERIOD_CYC32768_gc | RTC_PITEN_bm;> RTC.DBGCTRL = RTC_DBGRUN_bm;
Über CLKSEL wird der externe 32.768kHz Quarz selektiert. Mit
RTC_PERIOD_CYC32768 wird der Teiler auf exakt die Quarzgeschwindigkeit
gestellt. Das "sollte" so auf 1s herauslaufen.
S. Landolt schrieb:> Ein Quarzoszillator, der aufgrund der Kapazitäten um 1.7 % danebenliegt?> Kann ich mir nur schwer vorstellen.
Gibt es noch andere Gründe warum der dann so viel danebenliegt?
> Gibt es noch andere Gründe ...
Ich glaube nicht, dass es am Quarz liegt. Vielleicht ein
Konfigurationsfehler, aber ich kenne diese ATtiny-Reihe leider nicht.
_justified schrieb:> auf 60 Sekunden ca 1 Sekunde Abweichung
32000/32768*60 = 58.59 #in jeder Minute mehr als eine Sekunde
Zufall?
Oder hast du (Umkehrfall) einen Quarz mit 32000 Hz am Start?
Du könntest über 10 (100) Minuten messen, um die Nachkommastellen zu
überprüfen.
_justified schrieb:>> Für welche Lastkapazität ist denn dieser vorgesehen?> Verwendet wird in der Schaltung https://www.mouser.de/datasheet/2/3/AB26T-39673.pdf
Dann mache die Kondensatoren mal etwas kleiner. Wenn du die parasitären
Kapazitäten der Schaltung nicht kennst, versuche es mal mit 2x 12pF.
Wenn du ohnehin einkaufen musst, bestelle gleich noch 2x 4,7pF dazu.
Stefan ⛄ F. schrieb:> Dann mache die Kondensatoren mal etwas kleiner. Wenn du die parasitären> Kapazitäten der Schaltung nicht kennst, versuche es mal mit 2x 12pF.> Wenn du ohnehin einkaufen musst, bestelle gleich noch 2x 4,7pF dazu.
Die Kondensatoren sind zunächst völlig wurscht.
Beim ATtiny817 Xplained Board habe ich einfach einen Quarz an PB2 und
PB3 gesteckt - ganz ohne Cs. Als Ausgangsfrequenz nach Teilung erhalte
ich 0,9999977 mHz. Die 2,3 ppm Abweichung zu 1 Hz könnte ich durch
Abgleich noch reduzieren ;-)
@TO: Deine Initialisierung funktioniert.
_justified schrieb:> Ich nutze den PIT um eine LED blinken zu lassen. Der verwendet den 32kHz> Oszi und ist auf 32k Clock-Cycles eingestellt = 1s. In der Routine zähle> ich eine Variable bis 60 hoch und toggle die LED.
Ooch nöö, Code in Prosa!
_justified schrieb:> Ein Rechenfehler ist> hier leider ausgeschlossen.
Na wenn Du das sagst.
> Mit Garantie aber ohne Interrupt ;-)
dann viel besser :)
> CCP = CCP_IOREG_gc; // IO Register Protection
kannte ich noch nicht , ersetzt den aufruf von _PROTECTED_WRITE ?!
- muss mal im DB blättern war mir nicht bewust das dieses für die RTC
notwendig ist
mfg