Hallo Forum,
ich arbeite zz.t an einem ATmega128RFR2 und möchte den Symbolcounter
dazu verwenden den Power-Down-Sleep nach festgelegter Zeit zu beenden.
Ich habe festgestellt, dass der Zähler gerade im Sleep nicht lief.
1 | ASSR |= (1<<AS2);
|
2 | /*
|
3 | ... Wartezeit bis Quarz läuft
|
4 | */
|
5 | SCCSR = 0;
|
6 |
|
7 | SCCNTHH = 0;
|
8 | SCCNTHL = 0;
|
9 | SCCNTLH = 0;
|
10 | SCCNTLL = 0; /*zähler auf 0*/
|
11 |
|
12 | SCOCR1HH = 0;
|
13 | SCOCR1HL = 0x05;
|
14 | SCOCR1LH = 0;
|
15 | SCOCR1LL = 0; /*Compareregister*/
|
16 |
|
17 | SCCR1 = (1<<SCBTSM); /*Symbol Counter Beacon Timestamp Mask Register*/
|
18 | /*This bit must be set to disable automatic beacon timestamping.*/
|
19 | SCIRQM = (1<<IRQMCP1); /*Symbol Counter Compare Match 1 IRQ enable*/
|
20 | SCCR0 = ((1<<SCEN)|(1<<SCCKSEL)); /*Symbol Counter enable + Symbol Counter Clock Source select */
|
21 | PRR0 = 0xFF;
|
22 | PRR1 = 0xFF;
|
23 | SMCR = 0x05; /*Power Down + Sleep Enable*/
|
24 | asm volatile(" sleep");
|
Wenn ich anstelle des 'asm volatile(" sleep")' ein 'while(1)' einbaue
läuft der Symbolcounter und nach meiner eingestellten Zeit wird die ISR
augerufen.
Wenn ich sleep verwende geht der 32KHz Quarz aus und der Zähler steht.
Durch ausprobieren bin ich darauf gekommen, dass SCCKSEL das Problem
ist. Wenn dieses Bit nicht gesetzt wird, läuft der Quarz und der Zähler.
Das widerspricht aber scheinbar der Doku:
"With this bit the clock source for the symbol counter can be selected.
If the bit is one, the RTC clock from TOSC1 is selected, otherwise the
symbol counter operates with the clock from XTAL1. During transceiver
sleep modes the clock falls back to the RTC clock source, regardless of
the selected clock. After wakeup, it switches back to the previosly
selected clock source."
Was soll das?