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 | void initRtcClock(void)
|
2 | {
|
3 | uint8_t temp;
|
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?