Mikrocontroller und Digitale Elektronik
›
Thread
Timer 0 und 2 machen komische sachen Mega 16
R
René
Gast
02.06.2008 14:43
#884312
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.
M
Martin
Gast
02.06.2008 18:24
#884550
also bei mir funktioniert die simulation. versuch mal, dein programm
etwas zu stukturieren, dann kannste eventuelle Fehler leichter finden.
O
Otto
Gast
02.06.2008 18:28
#884553
Die Interruptvektoren fehlen.....
Gruss Otto
AK
Andreas K.
(a-k)
02.06.2008 18:31
#884557
Wenn er keine Interrupts verwendet, braucht er auch keine Vektoren.
O
Otto
Gast
02.06.2008 18:33
#884561
ach - und deshalb auch das "sei"....
Gruss Otto
RS
R--- S.
(rene66)
03.06.2008 17:47
#885735
ori templ,(1<<OCF2)
out TIFR,templ
ich glaube das war das Problem da ich auch noch den Timer 1 mit nutze
und ich das register anspreche ohne mir vorher TIFR zu maskieren.
also
in templ,TIFR
ori templ,(1<<OCF2)
out TIFR,templ
sollte besser sein.
Oder Nicht?
René Schink wrote:
> in templ,TIFR
> ori templ,(1<<OCF2)
> out TIFR,templ
>
> sollte besser sein.
> Oder Nicht?
Nein! Interrupt-Flags werden nicht mit Read-Modify-Write gelöscht,
sondern im direkten Zugriff. Einfach 1 ldi temp, (1 << OCF2)
2 out TIFR, temp
Wenn Du maskierst, werden alle anderen Flags, die beim Lesen von TIFR
gesetzt sind, gelöscht. Und genau das will man eigentlich normalerweise
nicht. Interrupt-Flags immer direkt schreiben. Eine Null hat schließlich
keinen Einfluss auf den Zustand des Flags.
↑ Nach oben
← Zurück zu Mikrocontroller und Digitale Elektronik
Antwort schreiben