PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Input" scheint nur beim ersten mal richtig erkannt zu werden?!



Testus2K
06.06.2013, 00:21
Hi,
Eigentlich sollte mein Programm so funktionieren, dass ich bestimmte Zahlen sende und er entsprechend dem Code drauf reagiert.

Das Programm startet mit der Variable Modus=0.
Nur wenn es "-32766" empfängt, soll Modus=1 werden und alles was dann Empfangen wird in ein Array geschrieben werden, bis es "-32768" Empfängt.

Ich habe Ausgaben im Programm die mir anzeigen, wenn "-32766" korrekt empfangen wurde und wenn das geklappt hat soll es jedes Mal ausgeben, wenn es etwas anderes als "-32768" Empfängt.

Wenn ich nach dem Reset als erstes "-32766" sende, dann erkennt er das auch und zeigt mir das an. Egal, was ich dann sende, schreibt er mir raus, dass es <> "-32768" ist. Sollte ich nach dem Reset etwas anderes als "-32766" senden, erkennt er diese auch nicht mehr.

Kurzgesagt der erste Empfang klappt, alles andere wird danach nicht mehr erkannt. Kann mir einer sagen, wo der Fehler liegt?



Dim Empfangen As String * 8

Do
Input Empfangen
If Modus=1 Then 'array befüllen
If Empfangen<> "-32768" Then 'Befehl, das array fertig
print "anders als 68"
Incr Befehlsindex
Befehlsarray(Befehlsindex)=Val(Empfangen)
Else
Modus=2
i=0
while i< Befehlsindex
incr i
Print Befehlsarray(i)
Wend
End If
ElseIf Modus=2 Then
If Empfangen="-32767" Then 'Befehl, Programm starten
gosub run
End If
ElseIf Modus=0 Then
If Empfangen="-32766" Then 'Befehl, das array zu befüllen
Modus=1
Befehlsindex=0
print "66 erkannt"
End If
End If

Loop

Thomas E.
06.06.2013, 03:55
Hallo!


Wenn du das erste Mal -32766 sendest wird durch

ElseIf Modus=0 Then
If Empfangen="-32766" Then 'Befehl, das array zu befüllen
Modus=1
Befehlsindex=0
print "66 erkannt"
Modus zu 1.

Anschließend wird jeder empfangener String, der nicht -32768 lautet durch

If Empfangen<> "-32768" Then 'Befehl, das array fertig
print "anders als 68"
Incr Befehlsindex
Befehlsarray(Befehlsindex)=Val(Empfangen)

als nicht -32768 interpretiert.

Das deckt sich mit deiner Aussage:


Wenn ich nach dem Reset als erstes "-32766" sende, dann erkennt er das auch und zeigt mir das an. Egal, was ich dann sende, schreibt er mir raus, dass es <> "-32768" ist. Sollte ich nach dem Reset etwas anderes als "-32766" senden, erkennt er diese auch nicht mehr.

Also was genau jetzt das Problem ist, wurde mir nicht wirklich klar. Vielleicht solltest du beschreiben, was genau du für ein Verhalten erwartest.

Übrigens: Das nächste Mal bitte den gesamten Quelltext posten, hier fehlt einiges an Variablendimensionierungen.

Testus2K
06.06.2013, 15:14
Ich muss zugeben, das war wohl nicht ganz eindeutig formuliert :).

Ich sende folgende Daten:
-32766
-11111

Ausgegeben wird dann:
66 erkannt
anders als 68

Das ist korrekt.

Sende ich:
-32766
-32768

Wird genau das gleiche ausgegeben, obwohl ich als zweites die "68" gesendet habe.

Und wenn ich folgendes sende:
-11111
-32766

bekomme ich garkeine Ausgabe. Die -11111 wird also korrekterweise als "nicht 66" erkannt, die 66 danach allerdings dann nicht als die gesuchte 66.
Es scheint also so zu sein, das das erste, was ich sende richtig erkannt wird und danach nichts mehr.

Ich arbeite unter Linux und sende die entsprechenden Zeichen mit:
echo -e "-32768\r" > /dev/ttyUSB0

hier der Komplette Code:


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

$baud = 9600

Config Timer1 = Timer , Prescale = 8 'Konfiguriere Timer0
Disable Timer1 'schalte Den Timer0 Overflow -interrupt Ein
On Timer1 Schritt
Enable Interrupts


Config Pind.5 = Output 'LEDs
Config Pind.6 = Output
Led1 Alias Portd.5
Led2 Alias Portd.6
Config Pina.0 = Output 'Motorx pins
Config Pina.1 = Output
Config Pina.2 = Output
Config Pina.3 = Output
X1 Alias Porta.0
X2 Alias Porta.1
X3 Alias Porta.2
X4 Alias Porta.3
Dim Empfangen As String * 8
Dim Modus As Byte
Modus=0

Dim Befehlsarray(20) As Integer
Dim Befehlsindex as Integer
Dim i as Integer

Dim Schrittarray(8) As Byte

Schrittarray(1).1 = 0 '##### Tabelle mit dem Steuermuster #####
Schrittarray(1).2 = 1
Schrittarray(1).3 = 0
Schrittarray(1).4 = 1

Schrittarray(2).1 = 0
Schrittarray(2).2 = 1
Schrittarray(2).3 = 0
Schrittarray(2).4 = 0

Schrittarray(3).1 = 0
Schrittarray(3).2 = 1
Schrittarray(3).3 = 1
Schrittarray(3).4 = 0

Schrittarray(4).1 = 0
Schrittarray(4).2 = 0
Schrittarray(4).3 = 1
Schrittarray(4).4 = 0

Schrittarray(5).1 = 1
Schrittarray(5).2 = 0
Schrittarray(5).3 = 1
Schrittarray(5).4 = 0

Schrittarray(6).1 = 1
Schrittarray(6).2 = 0
Schrittarray(6).3 = 0
Schrittarray(6).4 = 0

Schrittarray(7).1 = 1
Schrittarray(7).2 = 0
Schrittarray(7).3 = 0
Schrittarray(7).4 = 1

Schrittarray(8).1 = 0
Schrittarray(8).2 = 0
Schrittarray(8).3 = 0
Schrittarray(8).4 = 1

Print "gestartet"

Declare Sub run

Do
Input Empfangen
If Modus=1 Then 'array befüllen
If Empfangen<> "-32768" Then 'Befehl, das array fertig
print "anders als 68"
Incr Befehlsindex
Befehlsarray(Befehlsindex)=Val(Empfangen)
Else
Modus=2
i=0
while i< Befehlsindex
incr i
Print Befehlsarray(i)
Wend
End If
ElseIf Modus=2 Then
If Empfangen="-32767" Then 'Befehl, Programm starten
gosub run
End If
ElseIf Modus=0 Then
If Empfangen="-32766" Then 'Befehl, das array zu befüllen
Modus=1
Befehlsindex=0
print "66 erkannt"
End If
End If

Loop

sub run
print "run"
End sub

Schritt:
print "schritt"
Return

HeXPloreR
06.06.2013, 16:51
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

$baud = 9600

Config Timer1 = Timer , Prescale = 8 'Konfiguriere Timer0
Disable Timer1 'schalte Den Timer0 Overflow -interrupt Ein
On Timer1 Schritt
Enable Interrupts


Config Pind.5 = Output 'LEDs
Config Pind.6 = Output
Led1 Alias Portd.5
Led2 Alias Portd.6
Config Pina.0 = Output 'Motorx pins
Config Pina.1 = Output
Config Pina.2 = Output
Config Pina.3 = Output
X1 Alias Porta.0
X2 Alias Porta.1
X3 Alias Porta.2
X4 Alias Porta.3
Dim Empfangen As String * 8
Dim Modus As Byte
Modus=0

Dim Befehlsarray(20) As Integer
Dim Befehlsindex as Integer
Dim i as Integer

Dim Schrittarray(8) As Byte

Schrittarray(1).1 = 0 '##### Tabelle mit dem Steuermuster #####
Schrittarray(1).2 = 1
Schrittarray(1).3 = 0
Schrittarray(1).4 = 1

Schrittarray(2).1 = 0
Schrittarray(2).2 = 1
Schrittarray(2).3 = 0
Schrittarray(2).4 = 0

Schrittarray(3).1 = 0
Schrittarray(3).2 = 1
Schrittarray(3).3 = 1
Schrittarray(3).4 = 0

Schrittarray(4).1 = 0
Schrittarray(4).2 = 0
Schrittarray(4).3 = 1
Schrittarray(4).4 = 0

Schrittarray(5).1 = 1
Schrittarray(5).2 = 0
Schrittarray(5).3 = 1
Schrittarray(5).4 = 0

Schrittarray(6).1 = 1
Schrittarray(6).2 = 0
Schrittarray(6).3 = 0
Schrittarray(6).4 = 0

Schrittarray(7).1 = 1
Schrittarray(7).2 = 0
Schrittarray(7).3 = 0
Schrittarray(7).4 = 1

Schrittarray(8).1 = 0
Schrittarray(8).2 = 0
Schrittarray(8).3 = 0
Schrittarray(8).4 = 1

Print "gestartet"

Declare Sub run

Do
Input Empfangen
If Modus=1 Then 'array befüllen
If Empfangen<> "-32768" Then 'Befehl, das array fertig
print "anders als 68"
Incr Befehlsindex
Befehlsarray(Befehlsindex)=Val(Empfangen)
Else
Modus=2
i=0
while i< Befehlsindex
incr i
Print Befehlsarray(i)
Wend
End If
ElseIf Modus=2 Then
If Empfangen="-32767" Then 'Befehl, Programm starten
gosub run
End If
ElseIf Modus=0 Then
If Empfangen="-32766" Then 'Befehl, das array zu befüllen
Modus=1
Befehlsindex=0
print "66 erkannt"
End If
End If

Loop

sub run
print "run"
End sub

Schritt:
print "schritt"
Return

Timer ist aus(rot makiert) und macht anscheinend mal abgesehen davon das er ja aus ist - nichts; outputs nicht richtig konfiguriert (rot markiert) , die Pins (sollten Ports sein) für den Motor habe ich nur nicht rot markiert (orange) weil ich es auch schon so laufen gesehen habe. Warum weiß der Oberallgeier ;)
Hat es guten Grund warum Du mit integer im minus arbeitest? Man könnte ja auch einfach das Ding als byte oder word dimensionieren und dann z.B. "66" direkt eingeben und senden.
Welche Aufgabe sollen die ganzen Schrittarrays haben? Bze wie und wo wird das dann benutzt?
Die LED' sind unbenutzt.

Die while - wend Schleife würde ich mir nochmal überdenken.

END Befehl?

Allerdings muss ich zugeben viel sagt mir das Programm nicht. Das Programm scheint unnötig kompliziert gemacht zu sein. Warum lässt man die if's anschliessend ausführen obwohl das vorher garnicht die Bedingung war und sie quasi erst in einer anderen if-Bedingung geändert wird und dann im zweiten durchlauf auf die andere if-Bedingung passt, wobei man wieder prüft ob es ungleich "68" ist? Das kann man sicher anders und leserlicher schreiben.

Sorry, aber ich bin auch Anfänger.

Sag mal was das genau werden soll?

for_ro
06.06.2013, 16:58
Hallo Testus2K,
eine mögliche Erklärung könnte sein, dass du ein anderes Zeilenende (CR/LF) erwartest als gesendet wird.
Wenn du direkt mit -32766 anfängst hat das noch keine Auswirkungen und danach fragst du nur ungleich -32768 ab, da kann also stehen was will.
Fängst du mit -11111 dann bleibt da ein Rest in der Übertragung und danach steht eben nicht mehr -32766 drin sondern etwa \n-32766.
Dafür spricht auch, dass er die -32768 nach der -32766 nicht erkannt hat.
Um das zu testen könntest du mal den Befehl
Config Input = CRLF einfügen

Testus2K
06.06.2013, 17:53
@for_ro: Danke, werd das mal probieren.

@HeXPloreR: Das Programm soll schrittmotoren steuern. Der Timer ist aus, weil bei jedem timer überlauf ein schritt gegangen werden soll, aber natürlich erst, wenn ich entsprechende daten übergeben hab. Im Timer steht nichts drin, weil das Programm noch nicht fertig ist ;).
Die LED's funktionieren so, wie ich die hier anspreche, das hab ich aus dem Code jopiert, den ich vorher auf dem Atmega hatte.
Das Schrittarray entält die Informationen welche Pinne aktiv sein müssen, um den Motor jeweils einen halbschritt weiter gehen zu lassen.

Die Idee ist, das ich Ein Befehl gebe, dass alles, was als nächstes kommt in ein array geschrieben wird. Das was dann ins array geschrieben wird sind je nach wert entweder angaben, wie weit nach +x -x +y oder -y sich der Motor bewegen soll, oder andere komandos, wie "Laser einschalten" (ist für einen Laserplotter).
Nach dem passenden Befehl sendet der mir, was im array steht, damit ich übertragungsfehler ausschließen kann und dann sende ich den Befehl zum starten.

Da ich eh keine 32000 Schritte in eine richtung (+ oder -) gehen brauche, nutze ich das Ende des Integer berreichs für zusätzliche funktionen, die den Laser zu steuern und anderes. Und da ich eh viel mit diesen Integer Werten als Befehl arbeite, nutze ich diese ganz einfach auch am Anfang um das befüllen des arrays zu steuern.

Was stört dich an meiner While Schleife, hätest du da einen besseren Vorschag?

Danke für's Interesse :)

Testus2K
06.06.2013, 20:31
Ah okay, es lag daran, das mein Rechner meinem Befehl noch etwas hinterherschickt, was dann als anfang des nächsten Integers interpritiert wurde.
Musste dafür nur meine ausgabe in:

echo -n -e "-32767\r" > /dev/ttyUSB0
ändern.

@for_ro: Danke für den Denkanstoß

for_ro
06.06.2013, 21:40
Um weniger zu tippen kannst du es auch so eingeben:
echo -e "-32767" > /dev/ttyUSB0
also nur newline am Ende.
In Bascom schreibst du dann
Config Input=LF
damit das Program auf newline reagiert.

Testus2K
06.06.2013, 21:53
Danke für dem Tip, aber schon der versuch

Config Input = CRLF
einzufügen ist an einer Fehlermeldung gescheitert, dass ein "=" vermisst würde.
Aber ich werde das als nächstes eh in ein Python Programm auslagern, da wird mich dass dann auch nicht weiter stören :)

for_ro
06.06.2013, 23:09
Sorry, wer lesen kann ist klar im Vorteil. Es muss natürlich so heißen:
Config Input = LF, Echo = LF