- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 10

Thema: "Input" scheint nur beim ersten mal richtig erkannt zu werden?!

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2006
    Beiträge
    151

    "Input" scheint nur beim ersten mal richtig erkannt zu werden?!

    Anzeige

    Praxistest und DIY Projekte
    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?

    Code:
     
    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

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Hallo!


    Wenn du das erste Mal -32766 sendest wird durch
    Code:
    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
    Code:
    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.
    Grüße
    Thomas

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2006
    Beiträge
    151
    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:

    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

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    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
    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?
    Geändert von HeXPloreR (06.06.2013 um 16:01 Uhr)

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    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
    Geändert von for_ro (06.06.2013 um 16:03 Uhr)

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2006
    Beiträge
    151
    @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

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2006
    Beiträge
    151
    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ß

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    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.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2006
    Beiträge
    151
    Danke für dem Tip, aber schon der versuch
    Code:
    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

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Sorry, wer lesen kann ist klar im Vorteil. Es muss natürlich so heißen:
    Config Input = LF, Echo = LF

Ähnliche Themen

  1. Frankreich : Die ersten "Médailles de l’innovation" des CNRS
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 23.05.2011, 11:10
  2. "PCF 8574 P" Problem bei Verwendung als Input
    Von fitec im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 03.03.2009, 21:40
  3. INPUT- Befehl "reagiert" nicht?
    Von Diron im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 01.03.2009, 11:30
  4. "Quad 2 Input 7400" vs "Hex 7404 Inverter&quo
    Von walddax im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 06.12.2005, 11:29
  5. IO-Pins lassen sich nicht richtig mit "bsf"/"
    Von keiang im Forum PIC Controller
    Antworten: 3
    Letzter Beitrag: 21.07.2005, 19:12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests