Hallo,
ich erfasse mit Timer0 die Zeit zwischen zwei High Flanken mit einem
Interrupt der dann bei Timer0überlauf eine Varable hochzält.
Der wert aus dem Timer Register und der Variablen ergeben dann das
Ergebniss.
Dann muß ich aber in einem anderen Interrupt genau diese Zeit
"wiedergeben"
Port C1 an Zeit Port C1 aus das aber auch mit Timer0 ohne Interrupt und
als 16 Bit Wert und das möglichst ganau. Momantan habe ich bei 16Mhz
Taktfrequenz eine Abweichung von ca. 15 uS zum geforderten wert die
Abweichung wird umso grösser je grösser der am anfang erfasste Wert ist.
Was sollte ich anders machen?
hier der betreffende Code:
1 | VZ: lds tempH,vorzeitH
|
2 | Ltime13: lds tempL,vorzeitL
|
3 | vzeit23: out OCR2,templ ;Timer mit Match L Wert laden
|
4 | clr templ
|
5 | out TCNT2,templ ;
|
6 |
|
7 |
|
8 | wtt: ldi tempL, (0<<CS22)|(0<<CS21)|(1<<CS20)
|
9 | out TCCR2, tempL ; Timer Start nach Match wieder von vorn
|
10 | vzeit33: in templ,TIFR
|
11 | andi templ,0b10000000
|
12 | sbrs templ,OCF2 ;OCF0
|
13 | rjmp vzeit33
|
14 | ori templ,(1<<OCF2)
|
15 | out TIFR,templ
|
16 | cpi temph,0
|
17 | breq out_tim03
|
18 | ldi templ,0xff
|
19 | dec temph
|
20 | rjmp vzeit23
|
21 | out_tim03: ldi tempL, (0<<CS22)|(0<<CS21)|(0<<CS20) ; Timer Stop
|
22 | out TCCR2, templ
|
Mfg
René