PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm funktioniert nur jedes zweite mal



king-sixXx
30.01.2006, 07:32
Hi Leute!

Ich bin mit meinem Programm schon recht zufrieden. Wenn ich einen Befehlsstring an meinen Mega8 sende, werden die Daten korrekt verarbeitet und es funktionert alles so, wie es soll. Dann schicke ich den zweiten Befehl und es tut sich nichts mehr! Die Motoren bleiben stehen und es wird auch nichts mehr an den PC zurückgesendet. Sende ich den dritten Befehl funktioniret es wieder.

Ich denke er bleibt in einer der Schleifen hängen, aber ich finde den Fehler nicht. Bin auch für Verbesserungen aller Art dankbar!

MFG!

Achja ein Befehlsstring sieht so aus: m255-255-1-0000x



$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config Portb = Output

Config Pind.5 = Output 'Motor 1 In1 D5
Motor1_in1 Alias Portd.5
Config Pind.6 = Output 'Motor 1 In2 D6
Motor1_in2 Alias Portd.6
Config Pind.7 = Output 'Motor 2 In1 D7
Motor2_in1 Alias Portd.7
Config Pinb.0 = Output 'Motor 2 In2 B0
Motor2_in2 Alias Portb.0


Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Enable Interrupts



Dim S As String * 1
Dim Befehl As String * 22
Dim X As String * 1
Dim Laenge As Byte
Dim Instring As String * 22
Dim Strings(7) As String * 3
Dim Char As String * 1
Dim Par As Byte
Dim Idx As Byte
Dim Pwms1 As Byte
Dim Pwms2 As Byte
Dim Richtung As Byte


' m255-255-1-0000x

Do
If Ischarwaiting() = 1 Then S = Inkey()

If S = "m" Then
Do
X = Inkey()
Befehl = Befehl + X
Loop Until X = "x"

Laenge = Len(befehl)
Laenge = Laenge - 1

Instring = Left(befehl , Laenge)
Par = 1
For Idx = 1 To Len(instring)
Char = Mid(instring , Idx , 1)
If Char = "-" Then
Incr Par
Else
Strings(par) = Strings(par) + Char
End If
Next

Pwms1 = Val(strings(1))
Pwms2 = Val(strings(2))

Richtung = Val(strings(3))

Print Pwms1
Print Pwms2
Print Richtung

For Par = 1 To 5
Strings(par) = ""
Next

End If

Select Case Richtung

Case 1:
Motor1_in1 = 1
Motor1_in2 = 0
Motor2_in1 = 1
Motor2_in2 = 0

Case 2:
Motor1_in1 = 0
Motor1_in2 = 1
Motor2_in1 = 0
Motor2_in2 = 1

Case 3:
Motor1_in1 = 0
Motor1_in2 = 1
Motor2_in1 = 1
Motor2_in2 = 0

Case 4:
Motor1_in1 = 1
Motor1_in2 = 0
Motor2_in1 = 0
Motor2_in2 = 1

Case Else:
Motor1_in1 = 0
Motor1_in2 = 0
Motor2_in1 = 0
Motor2_in2 = 0

End Select

Compare1a = Pwms1
Compare1b = Pwms2

Loop
End

Guy
30.01.2006, 09:05
Ich habe mir dein Programme jetzt nicht im Detail angeschaut. Aber es gibt nur eine Möglichkeit wo es hängen bleiben kann, und zwar in der DO LOOP
Do
X = Inkey()
Befehl = Befehl + X
Loop Until X = "x"

king-sixXx
30.01.2006, 16:31
OK das kann sein, wenn das "x" nicht richtig ankommt, aber dann sollten doch die Werte für die PWMs nicht geändert werden. Sprich die Motoren drehen mit der gleichen Geschwindigkeit weiter, oder?
Bei mir bleiben die beiden Motoren stehen....

king-sixXx
30.01.2006, 19:24
Problem gelöst:
Ich hab vergessen den String "Befehl" nach einem Aufzeichnungsdurchlauf wieder zu leeren... So hat er immer den neuen Befehl angehängt...

Ratber
30.01.2006, 23:30
@King_Sixxx

Du hast da recht große Schleifen die du vieleicht in Unterroutinen verschieben kannst.
Dann wird es auch einfacher den Fehler zu finden.

zb. den ganzen Passus nach If s= "m" then..... würde ich mal separieren.

Könnte aber auch sein das dein Stack nur zu klein ist.
wie gesagt ist bei dem langen Code schwer was zu lesen.

Vitis
31.01.2006, 07:19
Salut,

wenn ich die eschichte richtig identifiziert habe sendest du den
Zahlenwert dez. 255 z.B. als String "255"?
Warum verwendest Du nicht den ASCII?

king-sixXx
31.01.2006, 17:34
@Ratber
Du meinst ich schriebe die Routine für die Aufzeichnung und den Teil mit der Zerlegung in eine Unterroutine und rufe in der Hauptschleife nur die Unterroutinen auf?
Hat das einen weiteren Vorteil als die Übersichtlichkeit?

@Vitis
Da ich auch Buchstaben versende, dachte ich, dass könne man nur mit einem String. Wie müsste es denn sonst aussehen??

MFG!

Ratber
31.01.2006, 18:10
Du meinst ich schriebe die Routine für die Aufzeichnung und den Teil mit der Zerlegung in eine Unterroutine und rufe in der Hauptschleife nur die Unterroutinen auf?
Hat das einen weiteren Vorteil als die Übersichtlichkeit?

Nicht unbedingt direkt.