Forum: Mikrocontroller und Digitale Elektronik Fehlersuche Bascom Interrupts


von int (Gast)


Lesenswert?

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

von screwdriver (Gast)


Lesenswert?

Hallo!

Zuerst mal ein Lob dafür, dass du gleich deinen Code gepostet hast. Ist 
ja eher eine Seltenheit.

Dein Quellcode sollte im Prinzip in Ordnung sein. Aufgefallen ist mir 
folgendes Interrupt-Problem:

Während Bascom intern damit beschäftigt ist die Variable "Millisekunden" 
per USART auszugeben, bzw. deren Ausgabe vorzubereiten, kann der 
Timer0-Interrupt zuschlagen und kann in der ISR selbst die Variable 
"Millisekunden" ändern. Dies erzeugt sogenannte Seiteneffekte.

Versuch mal während der Print-Ausgabe die Interrupts zu sperren.

Disable Interrupts
Print #2 , Millisekunden
Enable Interrupts

screwdriver

von int (Gast)


Lesenswert?

Vielen Dank für den Tipp! Werde ich gleich heute abend 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.