Hallo,
ich habe ein kurzes Programm, was aber nicht richtig funktioniert. Ich
kann den Fehler nicht finden.
Stoppuhr wird jede Millisekunde aufgerufen. Alle 40ms wird der "action"
Flag gesetzt. Falls dieser gesetzt ist, wird in der Main-Loop eine
Ausgabe generiert. Nach 4 "action"-Blöcken wird eine weitere Aktion
gestartet ("runnr").
Es scheint Probleme mit dem Stack zu geben, die Ausgabe zeigt schon mal
Werte > 1000, was eigentlich nicht möglich ist. Oder es kommen wirre
Zeichen, oder das ganze hängt sich auf und der µC startet neu.
Hilfe!
1 | $regfile = "m644pdef.dat"
|
2 | $crystal = 16000000
|
3 | $hwstack = 100
|
4 | $swstack = 700
|
5 | $framesize = 100
|
6 | $baud = 38400
|
7 | $baud1 = 9600
|
8 | '$sim
|
9 |
|
10 | Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , _
|
11 | Db7 = Portb.2 , E = Portb.1 , Rs = Portb.0
|
12 | Config Lcd = 16 * 2 , Chipset = Dogm162v5
|
13 |
|
14 |
|
15 | ' ************* Stoppuhr - TEIL ********************
|
16 | Config Timer0 = Timer , Prescale = 64
|
17 | Timer0 = 6
|
18 |
|
19 | On Timer0 Stoppuhr
|
20 | Enable Timer0
|
21 | Start Timer0
|
22 |
|
23 | Dim Millisekunden As Integer
|
24 | Dim Sekunden As Integer
|
25 | Dim Minuten As Integer
|
26 |
|
27 | Dim Lminuten As Integer
|
28 | Dim Lsekunden As Integer
|
29 | Dim Lmillisekunden As Integer
|
30 |
|
31 |
|
32 | Open "COM2:" For Binary As #2
|
33 |
|
34 |
|
35 | Config Timer1 = Timer , Capture Edge = Falling , Prescale = 1
|
36 | Start Timer1
|
37 |
|
38 |
|
39 | Dim Runcounter As Byte
|
40 | Runcounter = 0
|
41 | Dim Runnr As Byte
|
42 | Runnr = 1
|
43 | Dim Action As Byte
|
44 | Action = 0
|
45 |
|
46 | Wait 5
|
47 |
|
48 | Enable Interrupts
|
49 |
|
50 |
|
51 | Cls
|
52 |
|
53 |
|
54 | Do
|
55 | If Action = 1 Then
|
56 | Runnr = Runnr + 1
|
57 |
|
58 |
|
59 | Print #2 , Millisekunden
|
60 | Action = 0
|
61 |
|
62 | If Runnr = 4 Then
|
63 | 'sonstige aktion
|
64 | Runnr = 0
|
65 | End If
|
66 |
|
67 | End If
|
68 |
|
69 | Loop
|
70 |
|
71 | End
|
72 |
|
73 |
|
74 | 'stoppuhr
|
75 | Stoppuhr:
|
76 | Timer0 = 6
|
77 |
|
78 | Millisekunden = Millisekunden + 1
|
79 | Lmillisekunden = Lmillisekunden + 1
|
80 |
|
81 | If Runcounter = 40 And Action = 0 Then
|
82 | Action = 1
|
83 | Runcounter = 0
|
84 | End If
|
85 |
|
86 | If Millisekunden = 1000 Then
|
87 | Incr Sekunden
|
88 | Incr Lsekunden
|
89 | Millisekunden = 0
|
90 | Lmillisekunden = 0
|
91 | End If
|
92 |
|
93 | If Sekunden = 60 Then
|
94 | Incr Minuten
|
95 | Incr Lminuten
|
96 | Sekunden = 0
|
97 | Lsekunden = 0
|
98 | End If
|
99 |
|
100 | Runcounter = Runcounter + 1
|
101 |
|
102 | Return
|