Forum: Mikrocontroller und Digitale Elektronik Nicht auffindbarer Fehler in Code für Roboter (Bascom)


von David .. (david1)


Angehängte Dateien:

Lesenswert?

Moin,

Ich bin zurzeit dabei meinen ersten Bot aufzubauen und versuch grad den 
Fahralgorithmus zu schreiben.

Also theoretisch sollte das so funktionieren.

Ich hab eine Sub in die ich 4 Werte übergeb:
direc_l (Richtung für linke Raupe, 0 = rückwärts, 1 = vorwärts)
pwm_l (Pwm für linke Raupe, 3 stelliger Wert)
direc_r (Richtung für rechte Raupe, 0 = rückwärts, 1 = vorwärts)
pwm_r (Pwm für rechte Raupe, 3 stelliger Wert)

Soweit die Theorie, nur die Praxis sieht anders aus.

Das ganze möchte ich nun über den Uart Steuern, also hab ich mir 
folgendes "Protokoll" überlegt:
Drive:dirc_l-pwm_l-direc_r-pwm_r

Das kann ich auch Problemlos splitten und bekomm dann die Werte die ich 
brauch. Abr jetz fangen die Probleme an, die verschiedenen Variablen 
Typen, hier der Code:
1
$regfile = "m16def.dat"
2
$crystal = 16000000
3
$baud = 9600
4
5
6
Config Serialin = Buffered , Size = 30 , Bytematch = 13
7
Declare Sub Serial0charmatch()
8
9
10
11
'Config Outputs
12
13
14
   Config Portc.4 = Output                                  'M_left1a
15
   M_left1a Alias Portc.4
16
   Config Portc.5 = Output                                  'M_left2a
17
   M_left2a Alias Portc.5
18
   Config Portc.6 = Output                                  'M_left3a
19
   M_left3a Alias Portc.6
20
   Config Portc.7 = Output                                  'M_left4a
21
   M_left4a Alias Portc.7
22
23
24
   'Declare Motor-PWM
25
   Config Portb.0 = Output                                  'm-left-enable
26
   M_left_e Alias Portb.0
27
   Config Portb.1 = Output                                  'm-right-enable
28
   M_right_e Alias Portb.1
29
30
31
'Config Inputs
32
   Config Portd.2 = Input                                   'emergency-out
33
   Em_out Alias Portc.0
34
   Em_out = 1                                               'enable pullup
35
36
37
Enable Interrupts
38
39
40
'Config Var's
41
Dim Tmp As Byte
42
Dim New_command As String * 30
43
Dim Incoming_array(5) As String * 30
44
Dim Command_array(5) As String * 30
45
Dim New_status As Bit
46
47
Dim Pwm_1 As Integer
48
Dim Pwm_2 As Integer
49
50
51
Dim Drive_command(4) As String * 15
52
53
54
55
Declare Sub Exc_drive(byval Direc__l As String , Byval Pwm__l As String , Direc__r As String , Byval Pwm__r As String)
56
57
58
59
Do
60
61
62
63
   If New_command <> "" Then
64
65
      New_command = Ucase(new_command)
66
67
      'Anweisung aufteilen
68
      Tmp = Split(new_command , Incoming_array(1) , ":")
69
70
      Select Case Incoming_array(1)
71
         Case "DRIVE"
72
         Tmp = Split(incoming_array(2) , Command_array(1) , "-")
73
74
75
             Call Exc_drive(command_array(1) , Command_array(2) , Command_array(3) , Command_array(4))
76
      
77
         Case Else
78
            Print "ERROR: unknown command"
79
      End Select
80
81
   New_command = ""
82
   End If
83
84
85
Loop
86
End
87
88
89
90
Sub Serial0charmatch()
91
92
   Input New_command Noecho
93
   Print New_command
94
95
End Sub
96
97
98
99
100
101
Sub Exc_drive(byval Direc_l As Integer , Byval Pwm_l As String * 3 , Direc_r As String * 1 , Byval Pwm_r As String * 3)
102
103
E   If Direc_l = "1" Then Gosub Forward_left                 'drive forward
104
E   If Direc_l = "0" Then Gosub Backward_left                'drive backward
105
106
   If Direc_r = "1" Then Gosub Forward_right                'drive forward
107
   If Direc_r = "0" Then Gosub Backward_right               'drive backward
108
109
   Pwm_1 = Val(pwm_l)
110
   Pwm_2 = Val(pwm_r)
111
112
   Pwm1a = Pwm_1
113
   Pwm1b = Pwm_2
114
115
   'Print Direc__l ; " " ; Pwm__l ; " " ; Direc__r ; " " ; Pwm__r
116
   'Print Pwm_l
117
118
End Sub
119
120
121
122
123
Forward_left:
124
   M_left1a = 1
125
   M_left2a = 0
126
Return
127
128
129
Backward_left:
130
   M_left1a = 0
131
   M_left2a = 1
132
Return
133
134
135
Forward_right:
136
   M_left4a = 1
137
   M_left3a = 0
138
Return
139
140
141
Backward_right:
142
   M_left4a = 0
143
   M_left3a = 1
144
Return
145
146
147
Stop_drive:
148
149
Return

Im Anhang die Fehler, und im Code sind die zwei entsprechenden zeilen 
mit "E" markiert.

Aber auch wenn ich
If Direc_l = "1" Then Gosub Forward_left gegen
If Direc_l = 1 Then Gosub Forward_left
tausche ändert sich nix.

Hat jemand ne Idee wie ich das in den Griff bekomm?

David

von XXX (Gast)


Lesenswert?

Hallo

Direc_l ist ein Integer, der mit einem String verglichen wird!
ist das so gewünscht??

Gruß
XXX

von Micha C. (Gast)


Lesenswert?

Hallo David,

ich kann zwar kein Basic programmieren, aber die Deklaration und die 
Definition Deiner Exc_drive-Methode unterscheiden sich im Typ des ersten 
Parameters (direc_l).


Declare Sub Exc_drive(byval Direc__l As String , Byval Pwm__l As String 
, Direc__r As String , Byval Pwm__r As String)

Sub Exc_drive(byval Direc_l As Integer , Byval Pwm_l As String * 3 , 
Direc_r As String * 1 , Byval Pwm_r As String * 3)


Ist das vielleicht der gesuchte Fehler?

Ausserdem ist der String-Vergleich mit einem Integer in den mit E 
markierten Zeilen eventuell falsch.


Gruss

   Micha

von David .. (david1)


Lesenswert?

Danke für eure Antworten, habs jetzt geändert so dass unten String * 1 
anstatt Integer steht.

Aber der Fehler bleibt bestehen.

von skua (Gast)


Lesenswert?

In der Deklaration benutzt du Doppelunterstriche.

von David .. (david1)


Lesenswert?

Jesus!

Danke skua, da wär ich im leben nich draufgekommen, und schon garnich 
das sowas nen Error mit Invalid Datatype verursacht ...

Vielen vielen dank!

Gruß
David

von David .. (david1)


Lesenswert?

So, jetz taucht aber das nächste Problem auf, und zwar schick ich an 
Uart


1
'Uart Protokoll:
2
'Drive : R_l -pwm_l -r_r -pwm_r
3
'drive:1-120-1-130
4
5
6
$regfile = "m16def.dat"
7
$crystal = 16000000
8
$baud = 9600
9
10
$include "sub.bas"
11
12
13
Config Serialin = Buffered , Size = 30 , Bytematch = 13
14
Declare Sub Serial0charmatch()
15
16
17
18
'Config Outputs
19
20
21
   Config Portc.4 = Output                                  'M_left1a
22
   M_left1a Alias Portc.4
23
   Config Portc.5 = Output                                  'M_left2a
24
   M_left2a Alias Portc.5
25
   Config Portc.6 = Output                                  'M_left3a
26
   M_right3a Alias Portc.6
27
   Config Portc.7 = Output                                  'M_left4a
28
   M_right4a Alias Portc.7
29
30
31
   'Declare Motor-PWM
32
   Config Portb.0 = Output                                  'm-left-enable
33
   M_left_e Alias Portb.0
34
   Config Portb.1 = Output                                  'm-right-enable
35
   M_right_e Alias Portb.1
36
37
38
'Config Inputs
39
   Config Portd.2 = Input                                   'emergency-out
40
   Em_out Alias Portc.0
41
   Em_out = 1                                               'enable pullup
42
43
44
'Config Interrupts
45
'   Config Int0 = Falling                                    'fallende Flanke
46
'   On Int0 On_em_out
47
'   Enable Int0
48
49
50
Enable Interrupts
51
52
53
'Config Var's
54
Dim Tmp As Byte
55
Dim New_command As String * 30
56
Dim Incoming_array(5) As String * 30
57
Dim Command_array(5) As String * 10
58
59
60
Dim Pwm_1 As Integer
61
Dim Pwm_2 As Integer
62
63
64
'Dim Direc_l As String * 1
65
'Dim Pwm_l As String * 3
66
'Dim Direc_r As String * 1
67
'Dim Pwm_r As String * 3
68
69
70
Dim Drive_command(4) As String * 15
71
72
73
74
Declare Sub Exc_drive(byval Direc_l As String , Byval Pwm_l As String , Direc_r As String , Byval Pwm_r As String)
75
76
77
78
Do
79
80
81
82
   If New_command <> "" Then
83
84
      New_command = Ucase(new_command)
85
86
      'Anweisung aufteilen
87
      Tmp = Split(new_command , Incoming_array(1) , ":")
88
89
      Select Case Incoming_array(1)
90
         Case "DRIVE"
91
         Tmp = Split(incoming_array(2) , Command_array(1) , "-")
92
'             Drive_command(1) = Command_array(1)
93
'             Drive_command(2) = Command_array(2)
94
'             Drive_command(3) = Command_array(3)
95
'             Drive_command(4) = Command_array(4)
96
97
98
             'Direc_l  = Command_array(1)
99
'             Pwm_l = Command_array(2)
100
'             Direc_r = Command_array(3)
101
'             Pwm_r = Command_array(4)
102
103
               'Print Command_array(1) ; " " ; Command_array(2) ; " " ; Command_array(3) ; " " ; Command_array(4)
104
105
'             Gosub Exc_drive
106
            Print Command_array(1) ; " "
107
            Print Command_array(2) ; " "
108
            Print Command_array(3) ; " "
109
            Print Command_array(4) ; " "
110
111
            Call Exc_drive(command_array(1) , Command_array(2) , Command_array(3) , Command_array(4))
112
113
114
         Case Else
115
            Print "ERROR: unknown command"
116
      End Select
117
118
   New_command = ""
119
   End If
120
121
122
'Wait 100
123
124
125
'Call Exc_drive( "1" , "120" , "1" , "130")
126
127
128
Loop
129
End
130
131
132
133
Sub Serial0charmatch()
134
135
   Input New_command Noecho
136
   Print New_command
137
138
End Sub
139
140
141
142
143
'Exc_drive:
144
'   If Drive_command(1) = "1" Then Gosub Forward_left        'drive forward
145
'   If Drive_command(1) = "0" Then Gosub Backward_left       'drive backward
146
147
'   If Drive_command(3) = "1" Then Gosub Forward_right       'drive forward
148
'   If Drive_command(3) = "0" Then Gosub Backward_right      'drive backward
149
150
'   Pwm_1 = Val(drive_command(2))
151
'   Pwm_2 = Val(drive_command(4))
152
153
'   Pwm1a = Pwm_1
154
'   Pwm1b = Pwm_2
155
156
'   Print Pwm_1 ; " " ; Pwm_2
157
158
'Return
159
160
161
162
163
164
Sub Exc_drive(byval Direc_l As String * 1 , Byval Pwm_l As String * 3 , Direc_r As String * 1 , Byval Pwm_r As String * 3)
165
166
   Print Direc_l ; " "
167
   Print Pwm_l ; " "
168
   Print Direc_r ; " "
169
   Print Pwm_r ; " "
170
171
172
   If Direc_l = "1" Then Gosub Forward_left                 'drive forward
173
   If Direc_l = "0" Then Gosub Backward_left                'drive backward
174
175
   If Direc_r = "1" Then Gosub Forward_right                'drive forward
176
   If Direc_r = "0" Then Gosub Backward_right               'drive backward
177
178
   Pwm_1 = Val(pwm_l)
179
   Pwm_2 = Val(pwm_r)
180
181
   Pwm1a = Pwm_1
182
   Pwm1b = Pwm_2
183
184
   'Print Pwm_1 ; " " ; Pwm__l ; " " ; Direc__r ; " " ; Pwm__r
185
186
187
End Sub
188
189
190
191
192
Forward_left:
193
   M_left1a = 1
194
   M_left2a = 0
195
Return
196
197
198
Backward_left:
199
   M_left1a = 0
200
   M_left2a = 1
201
Return
202
203
204
Forward_right:
205
   M_right4a = 1
206
   M_right3a = 0
207
Return
208
209
210
Backward_right:
211
   M_right4a = 0
212
   M_right3a = 1
213
Return
214
215
216
Stop_drive:
217
218
   Pwm1a = 0
219
   Pwm1b = 0
220
221
   M_left1a = 0
222
   M_left2a = 0
223
224
   M_right4a = 0
225
   M_right3a = 0
226
227
Return


geb ich dann im Simulator folgendes ein:
drive:1-120-1-130

erhalt ich wie gewünscht die Ausgabe:
drive:1-120-1-130

1
120
1
130

D98
120
1
130

Die erste Zeile gibt einfach das zurück was empfangen wurde, dann kommt 
die erste Print-Reihe bevor die Sub Exc_drive aufgerufen wird, da 
stimmen noch alle Werte, die zweite Print-Reihe erfolgt in der Sub und 
gibt die 4 Empfangenen Variablen aus.

Nur bei der ersten (Dirc_l) läuft irgendwas schief und es kommt nur 
Müll.


Sieht hier vlt jemand vlt den Fehler?

Also ich nicht, und auch meinem Dad gehts genauso, wir sehen einfach vor 
lauter Bäumen den Wald nichmehr ...

von mü-C (Gast)


Lesenswert?

Wahrscheinlich ist der $FrameSize zu klein.
Bei so langen Strings wirst du mehr brauchen.
Ich würde die Werte auch in dein Programm schreiben, damit sind sie 
klar.

von David .. (david1)


Lesenswert?

Vielen vielen dank für die Antwort, hat mir weitergeholfen!

Also als erstes hab ich Framesize mal auf 40 gesetzt, keine Veränderung.
Dann bin ich mit HW-Stack auf 45 und mit dem SW-Stack auf 16.

Und Tada, läuft wunderbard, wieder was dazugelernt :)

Vielen vielen dank, somit steht morgen einer ersten Testfahrt mit meinem 
Bot nichts mehr im weg :)

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.