Forum: Mikrocontroller und Digitale Elektronik Probleme mit Timer


von unbekannt (Gast)


Lesenswert?

Guten Tag.

Habe eine Frage, habe mir ein kleines Programm gebastelt zum Messen von 
Zeiten zwischen Zwei Interrupts.

Irgendwie steht der Interruptzähler immer anders obwohl ich GENAU alle 
5000Schritte einen Interrupt auf INT0 (Flankenwechsel) ausführe und den 
Timer erst beim nächsten Timerwechsel wieder starte um definierte Start 
und Stop Punkte zu haben ...

Beschreibung ist ein wenig dürftig da nochnicht fertig ^^.
1
;Programm: Tackte zählen Rechnen
2
;40.000.000 / Tackte
3
;Ergebniss in R21R22R23R24
4
5
6
7
.include "m8def.inc"
8
9
10
.def  Zero    = r5
11
.def  MulSav1    = r7
12
.def  MulSav2    = r8
13
.def  MulSav3    = r9
14
.def  MulSav4    = r10
15
.def  MulSav5    = r11
16
.def  MulSav6    = r12
17
.def  MulSav7    = r13
18
.def  MulSav8    = r14
19
.def  Temp    = r16
20
.def  Temp1    = r17
21
.def  Temp2    = r18
22
.def  Temp3    = r19
23
.def  Temp4    = r29
24
.def  Ovf      = r20
25
.def  Mul1    = r21
26
.def  Mul2    = r22
27
.def  Mul3    = r23
28
.def  Mul4    = r24
29
.def  Mul5    = r25
30
.def  Mul6    = r26
31
.def  Mul7    = r27
32
.def  Mul8    = r28
33
34
35
.def  a0      = r24
36
.def  a1      = r23
37
.def  a2      = r22
38
.def  a3      = r21
39
 
40
.def  b0      = r28
41
.def  b1      = r27
42
.def  b2      = r26
43
.def  b3      = r25
44
 
45
.def  t0      = r29
46
.def  t1      = r19
47
.def  t2      = r18
48
.def  t3      = r17
49
.def  t4      = r16
50
51
.org 0x000
52
  rjmp  Init
53
54
.org 0x001
55
  rjmp  Int0handler
56
57
.org 0x008
58
  rjmp  TimerOvf
59
60
61
Init:
62
63
  ldi    Temp,    LOW(RAMEND)
64
  out    SPL,    Temp
65
  ldi    Temp,    HIGH(RAMEND)        ;Stack initialiseren
66
  out    SPH,    Temp
67
68
  ldi    Temp,    (1<<TICIE1) | (1<<TOIE1)  ; Timer konfigurieren aber nicht starten
69
  out    TIMSK,    Temp
70
  ;ldi    Temp,    (1<<CS10)
71
  ;out    TCCR1B,    Temp
72
73
  ldi    Temp,    (1<<ISC00)
74
  out    MCUCR,    Temp
75
  ldi    Temp,    (1<<INT0)          ; Interrupt konfigurieren
76
  out    GICR,    Temp
77
78
79
  ldi    Temp,    0x00
80
  out    DDRD,    Temp
81
  ldi    Temp,    0xFF            ; Eingang Konfigurieren
82
  out    PortD,    Temp
83
84
  clr    Ovf
85
86
  sei
87
88
Loop:
89
  rjmp  Loop                  ; Endlosschleife
90
91
StartTimer:
92
  ldi    Temp,    (1<<CS10)
93
  out    TCCR1B,    Temp            ; Timer Starten um definierte Startzeit zu haben
94
  reti
95
96
Int0handler:
97
  sbis  PinD,    2              ; Je nach Pegel Timer starten oder Rechnen
98
  rjmp  StartTimer
99
  push  Temp
100
  ldi    Temp,    (1<<PSR10)          ; Timer stoppen
101
  out    SFIOR,    Temp
102
  in    Temp,    SREG
103
  push  Temp
104
  push  Temp1                  ; Register sichern
105
  push  Temp2
106
  push  Temp3
107
108
  clr    t0
109
  clr    t1
110
  clr    t2                    ; Temps säubern
111
  clr    t3
112
  clr    t4
113
114
  in    a0,      TCNT1L
115
  in    a1,      TCNT1H
116
  clr    a2                    ; Timerstand kopieren/sichern
117
  out    TCNT1L,    a0
118
  out    TCNT1H,    a0
119
120
  clr    b0
121
  clr    b1
122
  mov    b2,      Ovf              ; Overflowstand errechnen
123
  clr    b3
124
125
  add    b0,      a0
126
  adc    b1,      a1
127
  adc    b2,      Zero            ; Timerstand addieren
128
  adc    b3,      Zero
129
130
  clr    a0
131
  ldi    a1,      $5A
132
  ldi    a2,      $62              ; 40.000.000 in Register laden
133
  ldi    a3,      $02
134
135
  rcall  urdiv32                  ; 32Bit Division aus Forum aufrufen
136
137
  pop    Temp3
138
  pop    Temp2
139
  pop    Temp1                  ; Register zurücksichern
140
  pop    Temp
141
  out    SREG,    Temp
142
  clr    Ovf                    ; Zähler Overflow resetten
143
  pop    Temp
144
  
145
  reti                      ; Zurück
146
147
148
149
150
  
151
152
TimerOvf:
153
  inc    Ovf                    ; overflows erhöhen und zurück
154
  reti
155
156
157
158
urdiv32:
159
  mov  t0, b0    ;T = B
160
  mov  t1, b1
161
  mov  t2, b2
162
  mov  t3, b3
163
  lsr  t3    ;B / 2
164
  ror  t2
165
  ror  t1
166
  ror  t0
167
  add  a0, t0    ;A = A + B / 2
168
  adc  a1, t1
169
  adc  a2, t2
170
  adc  a3, t3
171
 
172
;************************************************************************
173
;*                                                                      *
174
;*                      unsigned division 32 bit                        *
175
;*                                                                      *
176
;************************************************************************
177
 
178
; a3..0 = a3..0 / b3..0
179
; b3..0 = remainde
180
 
181
;cycle: max 684
182
 
183
udiv32:
184
  clr  t0
185
  clr  t1
186
  clr  t2
187
  clr  t3
188
  ldi  t4, 32
189
udi1:  lsl  a0
190
  rol  a1
191
  rol  a2
192
  rol  a3
193
  rol  t0
194
  rol  t1
195
  rol  t2
196
  rol  t3
197
  cp  t0, b0
198
  cpc  t1, b1
199
  cpc  t2, b2
200
  cpc  t3, b3
201
  brcs  udi2
202
  sub  t0, b0
203
  sbc  t1, b1
204
  sbc  t2, b2
205
  sbc  t3, b3
206
  inc  a0
207
udi2:  dec  t4
208
  brne  udi1
209
  mov  b0, t0
210
  mov  b1, t1
211
  mov  b2, t2
212
  mov  b3, t3
213
  ret

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.