Im Simulator macht Timer 0 und Timer 2 Komische probleme.
1 | .include "m16def.inc" |
2 | |
3 | .def SREGbuf = R2 |
4 | .def tempL = R16 |
5 | .def tempH = R17 |
6 | .def PUF0 = R18 |
7 | .def PUF1 = R19 |
8 | .def Spalte = R20 |
9 | .def Zeile = R23 |
10 | .def Flag = R21 |
11 | .def Flag2 = R22 |
12 | .def zaehl = R24 |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | .equ VTimeL = 0xB0 |
20 | .equ VTimeH = 0xB1 |
21 | .equ HTimeL = 0xB2 |
22 | .equ HTimeH = 0xB7 |
23 | .equ VorzeitL = 0xB3 ;ergebniss |
24 | .equ VorzeitH = 0xB4 |
25 | .equ SpaltenzeitL = 0xB5 |
26 | .equ SpaltenzeitH = 0xB6 |
27 | .equ SpaltenzeitL1 = 0xCE |
28 | .equ SpaltenzeitH1 = 0xCF |
29 | .equ zeileL = 0xBA |
30 | .equ zeileH = 0xBB |
31 | .equ Startzeile_HI_0 = 0xBC |
32 | .equ Startzeile_LO_0 = 0xBD |
33 | .equ Startzeile_HI_1 = 0xBE |
34 | .equ Startzeile_LO_1 = 0xBF |
35 | .equ Startzeile_HI_2 = 0xC0 |
36 | .equ Startzeile_LO_2 = 0xC1 |
37 | .equ Startzeile_HI_3 = 0xC2 |
38 | .equ Startzeile_LO_3 = 0xC3 |
39 | .equ Startzeile_HI_4 = 0xC4 |
40 | .equ Startzeile_LO_4 = 0xC5 |
41 | |
42 | |
43 | |
44 | ;********************************************************************* |
45 | |
46 | #define Master_Dimm 255 |
47 | |
48 | /* ****set interrupt-routines */ |
49 | |
50 | .org $0 |
51 | rjmp reset /* reset vector address */ |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | reset: |
59 | |
60 | cli |
61 | |
62 | |
63 | /* ***** set stackpointer */ |
64 | ldi tempL, low(RAMEND) |
65 | ldi tempH, high(RAMEND) |
66 | out SPL,tempL |
67 | out SPH,tempH |
68 | |
69 | |
70 | sei |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | main: |
79 | ldi templ,low(360) |
80 | ldi temph,high(360) |
81 | sts vtimel,templ |
82 | sts vtimeh,temph |
83 | |
84 | VZ: lds tempH,vtimeH |
85 | Ltime1: lds tempL,vtimeL |
86 | vzeit2: out OCR2,templ ;Timer mit Match L Wert laden |
87 | clr templ |
88 | out TCNT2,templ ; |
89 | |
90 | |
91 | wtt: ldi tempL, (0<<CS02)|(0<<CS01)|(1<<CS00) |
92 | out TCCR2, tempL ; Timer Start nach Match wieder von vorn |
93 | vzeit: in templ,TIFR |
94 | andi templ,0b10000000 |
95 | sbrs templ,OCF2 ;OCF0 |
96 | rjmp vzeit |
97 | ori templ,(1<<OCF2) |
98 | out TIFR,templ |
99 | cpi temph,0 |
100 | breq out_tim0 |
101 | ldi templ,0xff |
102 | dec temph |
103 | rjmp vzeit2 |
104 | out_tim0: ldi tempL, (0<<CS02)|(0<<CS01)|(0<<CS00) ; Timer Stop |
105 | out TCCR2, templ |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | rjmp main |
keine Ahnung woran das liegt beim ersten durchlauf ist alles OK aber beim zweiten wird das OCF2 Flag schon bei ca. 10 ausgelöst und nicht bei 255.