Hallo,
danke für deinen Tipp - löst aber nicht das Problem. Im Endeffekt hab
ich es so wie schon diskutiert mit etwas Jitter und mehr Code gelöst
gehabt. Deine Version ist eleganter keien Frage. Dennoch hab ich noch
das Problem dass z.B. bei 2ms Delay 65ms Berechnet werden:
g_n_dbg_duration:0x0107
g_n_begin_tick:0x2700
g_n_end_tick:0x2807
das ist der Tickstamp, also der 16bit Timerwert. ich sag mal das ist
hier ein schönes beispiel ich glaub das g_n_begin_tick 0x2800 sein
sollte.
Hier mal mein Codeteil von dir übernommen:
1 | uint16_t RTC_GetTickStamp(void)
|
2 | {
|
3 | uint8_t tmp_sreg;
|
4 | uint16_t retval = 0;
|
5 | uint8_t irq_happend = 0;
|
6 | tmp_sreg = SREG;
|
7 | cli();
|
8 | retval = g_nOverflow_cnt + TCNT2;
|
9 | irq_happend = TIFR2;
|
10 | SREG = tmp_sreg;
|
11 |
|
12 | if((irq_happend & _BV(TOV2)) && !(retval&0x80))
|
13 | {
|
14 | retval += 256;
|
15 | }
|
16 |
|
17 | return retval;
|
18 | }
|
So hab ich es jetzt cli/sreg hab ich etwas umgeschrieben weil es bei mir
vorkommen kann das das GIE Flag gelöscht ist.
Also ich hab auch in meinem Codeteil keinen Fehler gefunden und deiner
scheint auch sehr schlüßig zu sein, die Frage ist nun für mich warum
funktioniert es bei mir trotzdem nicht?
Etwas mehr Hintergrundinfos von meinem Projekt:
Ich lege den Controller auch immer Schlafen fast immer in PWR_SAVE und
manchmal IDLE. Könnte es event. damit zu tun haben?
1 | void sch_go_into_sleep_mode(void)
|
2 | {
|
3 | // sleep
|
4 | RTC_Wait();
|
5 | set_sleep_mode(_sleep_mode);
|
6 | cli();
|
7 | sleep_enable();
|
8 | sei();
|
9 | sleep_cpu();
|
10 | sleep_disable();
|
11 | }
|
12 |
|
13 | void RTC_Wait(void)
|
14 | {
|
15 | OCR2A = OCR2A; //dummy write neccassary if awake time is less then 30us.
|
16 | while(ASSR & (_BV(OCR2AUB)));
|
17 | }
|
_sleep_mode ist entweder PWR_SAVE oder IDLE je nach Betriebszustand von
mir (UART aktiv IDLE, ansonsten PWR_SAVE). Ich mess aber dzt. zu 99% nur
im PWR_SAVE zustand.
Hast du vielleicht eine Idee woran es sonst liegen könnte bzw. Tipp?
Danke!