Forum: Mikrocontroller und Digitale Elektronik Serielle Daten auswerten (Bascom 2.0.7.1)


von dj (Gast)


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!

von Paul B. (paul_baumann)


Lesenswert?

Ist bei "Config SerialIn" der Puffer mit "Size=15" nicht zu klein?

MfG Paul

von dj (Gast)


Lesenswert?

Wir hatten das auch schon auf 25 erweitert. Hat leider nichts gebracht.
Und nach dem Datenblatt 
(http://www.ic-fortune.com/upload/Download/FS9922-DMM3-DS-10_EN.pdf) 
reicht das

von MWS (Gast)


Lesenswert?

When using the BYTEMATCH option, you must preserve the registers you 
alter. If you do not know which one, use PUSHALL and POPALL.

von dj (Gast)


Lesenswert?

Wo sollte das am besten hin ?

von dj (Gast)


Lesenswert?

1
Serial0charmatch:                                           ' Wartet auf den Dezimapwert 13 für Serielle Eingabe
2
3
Pushall
4
5
   Input D
6
                                                     ' schreibe den Input in D
7
Popall

Das hilft leider auch nicht weiter...

von Ohm (Gast)


Lesenswert?

Das ist nicht gut durchdacht.

Deine zeitkritischen Anforderungen liegen beim UART Empfang und der 
sollte dann auch mittels Interrupt sauber aufgesetzt werden.

Displayausgaben sind "sekundär".

Schau Dir dazu mal Kapitel 6 an.

http://www.rowalt.de/mc/index.htm

von dj (Gast)


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.

von dj (Gast)


Lesenswert?

Ich habe nun mal



Src:                                                        ' Wartet auf 
den Dezimalwert 13 für Serielle Eingabe

Pushall
 If Udr = 43 Or Udr = 45 Then
   Input D
 End If                                                     ' schreibe 
den Input in D
Popall

Return

von Ohm (Gast)


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

von dj (Gast)


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 -.-

von dj (Gast)


Lesenswert?

In die Loop gepackt flackerts schon mal nicht mehr.

von dj (Gast)


Lesenswert?

...nimmt aber keine Werte mehr an.

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.