Forum: Mikrocontroller und Digitale Elektronik Entprellung / Blockieren von Mehrfachinput


von Morg (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe einen Rundenzähler / -timer für meine Carrerabahn geschrieben.

Der CTC-Timer läuft jede Millisekunde und zählt die beiden Rundentimer
hoch (mm:ss.hh).

Die beiden Interrupts sind an die Lichtschranken gekoppelt und sollen im
Grunde die aktuelle Rundenzeit im RAM sichern und danach zurücksetzen.

Dabei findet eine Abfrage statt, ob die aktuelle Rundenzeit schon 2
Sekunden oder mehr beträgt - das geht aber nicht. Ich habe teilweise
Rundenzeiten von nur wenigen Hundertsteln oder 00:00.00.

Irgendwie stehe ich auf dem Schlauch, was das nicht läuft.

Die Interruptroutinen sehen wie folgt aus, den gesamten Code habe ich
angehängt. Vielleicht kann mir einer von euch einen Tipp geben, auf
welchem Schlauch ich stehe?

Gruß
Morg
1
timer1_compare:  ; Timer 1 Output Compare Handler
2
 
3
  push  temp1      ; temp 1 sichern
4
  in  temp1,sreg    ; SREG sichern
5
 
6
  inc  SubCount    ; Wenn dies nicht der 10. Interrupt
7
  cpi  SubCount, 10    ; ist, dann passiert gar nichts
8
  brne  end_isr
9
 
10
  ; Überlauf
11
  clr  SubCount    ; SubCount rücksetzen
12
13
    ; Bahn 1
14
  inc   B1_Split    ; plus 1 1/100-Sekunde
15
  cpi   B1_Split, 100    ; sind 100 1/100-Sekunden vergangen?
16
  brne  B1_Ausgabe    ; wenn nicht kann die Ausgabe schon gemacht werden
17
 
18
  clr   B1_Split    ; 1/10-Sekunden wieder auf 0 und dafür
19
  inc   B1_Second    ; plus 1 Sekunde
20
  cpi   B1_Second, 60    ; sind 60 Sekunden vergangen ?
21
  brne  B1_Ausgabe    ; wenn nicht, -> Ausgabe
22
23
  clr   B1_Second    ; Sekunden wieder auf 0 und dafür
24
  inc   B1_Minute    ; plus 1 Minute
25
  cpi   B1_Minute, 60    ; sind 60 Minuten vergangen ?
26
  brne  B1_Ausgabe    ; wenn nicht, -> Ausgabe
27
 
28
  clr   B1_Minute    ; Minuten zurücksetzen
29
 
30
B1_Ausgabe:
31
  ori  Status, B_TimerFlag  ; Flag setzen, LCD updaten
32
33
  ; Bahn 2
34
  inc   B2_Split    ; plus 1 1/100-Sekunde
35
  cpi   B2_Split, 100    ; sind 100 1/100-Sekunden vergangen?
36
  brne  B2_Ausgabe    ; wenn nicht kann die Ausgabe schon gemacht werden
37
 
38
  clr   B2_Split    ; 1/10-Sekunden wieder auf 0 und dafür
39
  inc   B2_Second    ; plus 1 Sekunde
40
  cpi   B2_Second, 60    ; sind 60 Sekunden vergangen ?
41
  brne  B2_Ausgabe    ; wenn nicht, -> Ausgabe
42
43
  clr   B2_Second    ; Sekunden wieder auf 0 und dafür
44
  inc   B2_Minute    ; plus 1 Minute
45
  cpi   B2_Minute, 60    ; sind 60 Minuten vergangen ?
46
  brne  B2_Ausgabe    ; wenn nicht, -> Ausgabe
47
 
48
  clr   B2_Minute    ; Minuten zurücksetzen
49
 
50
B2_Ausgabe:
51
  ori  Status, B_TimerFlag  ; Flag setzen, LCD updaten
52
 
53
end_isr:
54
 
55
  out   sreg,temp1    ; sreg wieder herstellen
56
  pop   temp1
57
  reti        ; das wars. Interrupt ist fertig
58
59
60
;*
61
;* Interrupt 0 - Bahn 1
62
;*
63
64
int0_handler:
65
66
  push  temp1      ; temp 1 sichern
67
  in    temp1,sreg    ; SREG sichern
68
69
  ; improvisiertes Entprellen bzw. Sperren für 2 Sekunden
70
  cpi  B1_Minute, 0    ; nicht mehr in Minute 0?
71
  brge  int0_ok      ; dann weiter
72
73
  cpi  B1_Second, 2    ; Sekunde größer od. gleich 2?
74
  brge  int0_ok      ; dann weiter
75
76
  rjmp  int0_return    ; sonst raus
77
  
78
int0_ok:  
79
  ; aktuelle Zeit im SRAM speichern
80
  sts  B1_Lap_Split, B1_Split
81
  sts  B1_Lap_Second, B1_Second
82
  sts  B1_Lap_Minute, B1_Minute
83
  
84
  clr  B1_Split
85
  clr  B1_Second
86
  clr  B1_Minute
87
88
  ; TimerFlag, B1_Lap und B1_LapSet setzen
89
  ori  Status, B_TimerFlag | B_B1_Lap | B_B1_LapSet
90
91
  inc  B1_LapCount
92
93
int0_return:
94
  out   sreg,temp1    ; sreg wieder herstellen
95
  pop   temp1
96
  reti
97
98
99
;*
100
;* Interrupt 1 - Bahn 2
101
;*
102
103
int1_handler:
104
105
  push  temp1      ; temp 1 sichern
106
  in    temp1,sreg    ; SREG sichern
107
108
  ; improvisiertes Entprellen bzw. Sperren für 2 Sekunden
109
  cpi  B2_Minute, 0    ; nicht mehr in Minute 0?
110
  brge  int1_ok      ; dann weiter
111
112
  cpi  B2_Second, 2    ; Sekunde größer od. gleich 2?
113
  brge  int1_ok      ; dann weiter
114
115
  rjmp  int1_return    ; sonst raus
116
  
117
int1_ok:  
118
  ; aktuelle Zeit im SRAM speichern
119
  sts  B2_Lap_Split, B2_Split
120
  sts  B2_Lap_Second, B2_Second
121
  sts  B2_Lap_Minute, B2_Minute
122
  
123
  clr  B2_Split
124
  clr  B2_Second
125
  clr  B2_Minute
126
127
  ; TimerFlag, B2_Lap und B2_LapSet setzen
128
  ori  Status, B_TimerFlag | B_B2_Lap | B_B2_LapSet
129
130
  inc  B2_LapCount
131
132
int1_return:
133
  out   sreg,temp1    ; sreg wieder herstellen
134
  pop   temp1
135
  reti

von Karl H. (kbuchegg)


Lesenswert?

1
  ; improvisiertes Entprellen bzw. Sperren für 2 Sekunden
2
  cpi  B2_Minute, 0    ; nicht mehr in Minute 0?
3
  brge  int1_ok      ; dann weiter
4
5
  cpi  B2_Second, 2    ; Sekunde größer od. gleich 2?
6
  brge  int1_ok      ; dann weiter
7
8
  rjmp  int1_return    ; sonst raus

brge ist "branch if greater or equal".
Effektiv sind deine Abfragen dadurch wirkungslos, weil am Anfang in 
Minute 0, die 0 in B2_Minute natürlich equal zu 0 ist.

1
  ; improvisiertes Entprellen bzw. Sperren für 2 Sekunden
2
  cpi  B2_Minute, 1    ; nicht mehr in Minute 0?
3
  brge  int1_ok      ; dann weiter
4
5
  cpi  B2_Second, 3    ; Sekunde größer od. gleich 2?
6
  brge  int1_ok      ; dann weiter
7
8
  rjmp  int1_return    ; sonst raus

von Morg (Gast)


Lesenswert?

Mann... wie kann man denn sooo blind sein...

Vielen Dank, das war wohl fällig :-)

Ich geh's gleich mal ausprobieren...

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.