Serielle Daten auswerten (Bascom 2.0.7.1)

Gast #2982705
Lesenswert?

Hallo,
folgendes Programm (Teile davon habe ich mal weggelassen, da die 
funktionieren) lässt den Prozessor bei einem bestimmten empfangenen 
Zeichen 14 Bytes mittels UART einlesen.
Diese Zeichenkette wird anschließend zerlegt, das klappt leider nur 
teilweise.
Aus irgend einem Grund ist der Inhalt von Sb3 und Sb4 immer 0, auch wenn 
der UART etwas anderes zu sehen bekommt.
Sb1 und Sb2 lassen sich problemlos auslesen.
Dem Stck habe ich mal sicherheitshalber so viel Platz zugewiesen, aber 
das ändert nichts an dem Fehler.
1
$regfile = "m16def.dat"                                     ' Atmega 16
2
$crystal = 8000000                                          ' 8 MHz Takt
3
$hwstack = 165                                              'Stackdimensionierung
4
$swstack = 150
5
$framesize = 150
6

7
$baud = 2400                                                ' 2400 Baud
8

9
'Watchdog
10

11
Config Watchdog = 2048                                      ' watchdog auf 2048 mSec setzten
12
                                                              ' Watchdog starten
13
Start Watchdog
14

15
Config Serialin = Buffered , Size = 15 , Bytematch = 013    'Serielles Input
16
' Variablen
17
Dim Zifptr As Byte                                          'Ziffer-Pointer
18
Dim Bcd_aus As Byte                                         'enthält den Wert der dez zahl die ausgegeben werden soll
19

20
Dim Ausgang As Byte                                         'Segmentfolge die Ausgegeben wird aus Segmentcode - Tabelle
21

22
Dim Z1 As Byte                                              'Anzeigevariablen
23
Dim Z2 As Byte
24
Dim Z3 As Byte
25
Dim Z4 As Byte
26
Dim Z5 As Byte
27
Dim Z6 As Byte
28
Dim Z11 As String * 3
29
Dim Z11_h As Byte
30
Dim Z12 As String * 3
31
Dim Z13 As String * 3
32
Dim Z14 As String * 3
33
Dim Z15 As String * 3
34
Dim Z16 As String * 3
35

36
Dim Sb1 As Byte
37
Dim Sb2 As Byte
38
Dim Sb3 As Byte
39
Dim Sb4 As Byte
40

41
Dim Ssb1 As String * 1
42
Dim Ssb2 As String * 1
43
Dim Ssb3 As String * 1
44
Dim Ssb4 As String * 1
45

46
Dim D As String * 15                                        ' Serielles Input
47
Dim A As Bit                                                ' Meßeinstellungen
48
Dim V As Bit
49
Dim M As Bit
50
Dim K As Bit
51
Dim Mi As Bit
52
Dim R As Bit
53

54
' Ein-/Ausgänge
55
Config Portc = Output                                       'Port B als Ausgang
56
Config Porta = Output                                       '1 Ausgang, 0 Eingang
57

58

59
'Ausgänge:
60
Segment_a Alias Portc.7
61
Segment_b Alias Portc.6
62
Segment_c Alias Portc.5
63
Segment_d Alias Portc.4
64
Segment_e Alias Portc.3
65
Segment_f Alias Portc.2
66
Segment_g Alias Portc.1
67

68
Dp Alias Portc.0
69

70
Ziffer_6 Alias Porta.0
71
Ziffer_5 Alias Porta.1
72
Ziffer_4 Alias Porta.2
73
Ziffer_3 Alias Porta.3
74
Ziffer_2 Alias Porta.4
75
Ziffer_1 Alias Porta.5
76

77
Dim Dp1 As Bit
78
Dim Dp2 As Bit
79
Dim Dp3 As Bit
80
Dim Dp4 As Bit
81
Dim Dezpkt As Byte
82

83

84

85
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
86
' Timer0 für Multiplexausgabe
87
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
88

89
On Timer0 7segment                                          'Interrupt-Routine für Timer0-Overflow
90
Config Timer0 = Timer , Prescale = 64                       'Takt: Quarz/Prescale  (möglich: 1, 8, 64, 256, 1024)
91
Enable Timer0                                               'Timer0-Overflow-Interrupt einschalten
92
Enable Interrupts
93

94

95
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
96
' Hauptprogramm
97
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
98

99
Z1 = 0
100
Z2 = 0
101
Z3 = 0
102
Z4 = 0
103
Z5 = 0
104
Z6 = 0
105

106

107
Do                                                          'Start Hauptschleife
108

109

110
Z11 = Mid(d , 2 , 1)
111
Z12 = Mid(d , 3 , 1)
112
Z13 = Mid(d , 4 , 1)
113
Z14 = Mid(d , 5 , 1)
114
Z15 = Mid(d , 6 , 1)
115
Z16 = Mid(d , 8 , 1)
116

117
Ssb1 = Mid(d , 9 , 1)
118
Ssb2 = Mid(d , 10 , 1)
119
Ssb3 = Mid(d , 11 , 1)
120
Ssb4 = Mid(d , 12 , 1)
121

122
Sb1 = Ssb1
123
Sb2 = Ssb2
124
Sb3 = Ssb3
125
Sb4 = Ssb4
126

127

128

129
'Ergebniss setzen
130
Z11_h = Z11
131
'AC / DC                                                 'neg Vorzeichen
132
If Sb1.4 = 1 And Z11_h = 45 Then
133
         Z1 = 44                                            'DC-neg
134
Elseif Sb1.4 = 1 Then
135
         Z1 = 46                                            'DC-pos
136
Elseif Sb1.3 = 1 Then
137
         Z1 = 47                                            'AC
138
'Ohm
139
Elseif Sb4.5 = 1 Then
140
         Z1 = 48                                            'Ohm
141
'Z3 -> EF
142
Elseif Sb2.0 = 1 Then
143
         Z1 = 49                                            'ef
144
Else
145
   Z1 = Z11
146
End If
147

148
'Z2 = Sb4.3
149
'Z3 = Sb4.2
150
'Z4 = Sb4.1
151
'Z5 = Sb4.0
152

153

154

155
Z2 = Val(z12)                                               ' Messwerte ausgeben
156
Z3 = Val(z13)
157
Z4 = Val(z14)
158
Z5 = Val(z15 )
159
Z6 = Dp4 And &B10000000H
160

161
Dezpkt = Val(z16)
162

163

164

165

166

167
Reset Watchdog
168

169
Loop                                                        'Ende Hauptschleife
170

171
End                                                         'Programm Ende
172

173
Serial0charmatch:                                           ' Wartet auf den Dezimapwert 13 für Serielle Eingabe
174
Input D                                                     ' schreibe den Input in D
175
Return
Weiß jemand weiter?
Danke im Voraus!
Gast #2983260
Lesenswert?

Da sieht man wieder, wie lange ich nicht mehr mit Bascom gearbeitet habe 
;)
Ich wollte die UART-Geschichte interruptgesteuert ablaufen lassen und 
dachte, Bytematch würde eben einen sowas nutzen.
Wieder was gelernt^^
Die Displayausgabe würde ich gerne weiterhin interruptgesteuert arbeiten 
lassen, ich weiß nicht wie sich das sonst auf das Aussehen der geMUXten 
Siebensegmetanzeigen auswirken würde.
Ich sollte vielleicht noch erwähnen, dass die Datenpakete immer gleich 
lang sind und dazwischen immer eine Pause von knapp einer Sekunde ist.
Nur in extrem seltenen Fällen kann diese Pause kürzer sein, dann ist 
aber keine kontinuierliche Anzeige nötig und der Watchdogreset aus 
Nutzersicht okay.
Gast #2983327
Lesenswert?

Da wird sich überhaupt nichts auf Deine Muxerei auswirken.

Die ISR wird in ein paar us abgearbeitet.

Lass die Displayroutine einfach permanent im Hauptprogramm per do loop 
laufen.

In der ISR nur das Nötigste machen und fertig.

DS
Gast #2983333
Lesenswert?

^Das war wohl nix -.-
Das da oben führt der Controller aus, wenn ein Zeichen empfangen wurde.
Lässt die Anzeige aber übelst flackern, die Werte stimmen nicht mehr 
(okay, er fängt ja auch woanders an)
Die 13 steht weiter hinten im String, ist aber konstant, im Gegensatz zu 
dessen Anfang, an dem 45 oder 43 steht.
arbeite ich damit, fehlt natürlich immer der Rest vom Paket, der vom 
nächsten nachgeholt werden muss.
Das führt zu einer periodisch für locker ne Sekunde einfrierenden 
Anzeige.
Jetzt lassen sich die Interrupts ja anscheinend nicht priorisieren... 
verdammt -.-

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren