-
        
+ Antworten
Ergebnis 1 bis 9 von 9

Thema: Mein Protokoll spinnt......

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    26
    Beiträge
    1.461

    Mein Protokoll spinnt......

    HI

    Kaum aus dem Urlaub zurück; schon das erste Problem:
    Mein Protokoll hat einen großen Bug:

    Wie sicher inzwischen jeder weis(......), arbeite ich an einem Protokoll,
    das dem Hauptprozessor ermöglicht, Befehle an den Slave zu senden.
    Das funktioniert auch sehr GUT. Das Problem ist, dass es nur
    ein mal funktioniert. Sprich: Der Prozessor gibt einen Befehl, der
    wird auch ausgeführt, er gibt einen 2ten, der wird aber nicht mehr ausgeführt.

    Also muss der Slave IRGENDWO im Programmablauf stehen bleiben,
    und nichtmehr zur Anfangsmarke "Begin" zurückspringen.

    Hier der Quellcode des Slaves:
    Code:
    '*******************************************************************
    '*                  Meech Slave (1) Mainprogramm                   *
    '*                       SPP Protocol SLAVE                        *
    '*                         AVR: AT90S4433                          *
    '*                          Version: 0.2                           *
    '*                                                                 *
    '*      Copyright: Tobias Schlegel, 2004; all rights reserved      *
    '*                    www.drschlegel.de/tobias                     *
    '*******************************************************************
    'Compilerconfiguration
    $baud = 9600
    $crystal = 8000000
    
    'Configuration of Pinadjustments
    Config Pind.2 = Output                                      'H-Brücke PN. d.2(Mot1.a) (Rechts)
    Config Pind.3 = Output                                      'H-Brücke PN. d.3(Mot1.b) (Rechts)
    Config Pind.4 = Output                                      'H-Brücke PN. d.4(Mot1.E) (Enable)
    
    Config Pind.5 = Output                                      'H-Brücke PN. d.5(Mot2.a) (Links)
    Config Pind.6 = Output                                      'H-Brücke PN. d.6(Mot2.b) (Links)
    Config Pind.7 = Output                                      'H-Brücke PN. d.7(Mot2.E) (Enable)
                                                                  ' A = rechter Motor (in Fahrtrichtung)
                                                                  ' B = linker Motor (in Fahrtrichtung)
    'Declaration of the subroutines and functions.
    Declare Sub Enablea(a As Byte)
    Declare Sub Denablea(a As Byte)
    Declare Sub Avor(a As Byte)
    Declare Sub Arueck(a As Byte)
    Declare Sub Astop(a As Byte)
    
    Declare Sub Enableb(a As Byte)
    Declare Sub Denableb(a As Byte)
    Declare Sub Bvor(a As Byte)
    Declare Sub Brueck(a As Byte)
    Declare Sub Bstop(a As Byte)
    
    Declare Sub Enablez(a As Byte)
    Declare Sub Zvor(a As Byte)
    Declare Sub Zrueck(a As Byte)
    Declare Sub Zstop(a As Byte)
    Declare Sub Zlinks(msec As Byte)
    Declare Sub Zrechts(msec As Byte)
    
    Declare Function Getparabyte() As Byte
    Declare Function Getparastring() As String
    
    'Variables
    Dim Tmp As Byte
    Dim Tmp2 As Byte
    Dim Befehl As String * 10
    Dim Param1 As String * 10
    Dim Param2 As String * 10
    Dim Param3 As String * 10
    Dim Param4 As String * 10
    Dim Zeichen As Byte
    Dim O As Byte
    Dim F As Byte
    Dim D As Byte
    Dim A As Byte
    
    O = Asc( "o")
    F = Asc( "f")
    D = Asc( "d")
    
    Begin:
    
    Zeichen = 0
    Tmp = 0
    Tmp2 = 0
    Befehl = ""
    Param1 = ""
    Param2 = ""
    Param3 = ""
    Param4 = ""
    
                                                        'Begin of the Mainprogramm and order-preprocessing.
    
    Zeichen = 0
    
    A = Enablez()
    
    Do
       Tmp = Inkey()
    
       If Tmp = 0 Then
       Else
          Befehl = Befehl + Chr(tmp)
          Tmp = 0
          Zeichen = Zeichen + 1
       End If
    Loop Until Zeichen = 3
    Zeichen = 0
    
    Select Case Befehl
    Case "mot":
       Goto Mot
    
    Case "ser":
       Goto Ser
    
    Case "prt":
       Goto Prt
    
    Case "stp":
       Goto Stp
    
    Case Else
         Printbin F
         Goto Begin
    End Select
    
    Goto Begin
    'End of order-preprocesing and beginning of the order-operations
    
    
    
    Mot:                                                        'Motor befehl
       Printbin O
       Param1 = ""
    
        Do                                                      'Parameter abrufen
          Tmp = Inkey()
    
          If Tmp = 0 Then
          Else
             Param1 = Param1 + Chr(tmp)
             Tmp = 0
             Zeichen = Zeichen + 1
          End If
       Loop Until Zeichen = 3                                   'Ende der parameterholen-Schleife
       Zeichen = 0
    
       Select Case Param1                                       'Auswertung der Paramater
    
       Case "fwd":                                              'Anweisung "fwd" = Vorwärts
          Printbin O
          Param2 = ""
    
          Do                                                    'Moteor abholen
             Tmp = Inkey()
    
             If Tmp = 0 Then
             Else
                Param2 = Param2 + Chr(tmp)
               Tmp = 0
               Zeichen = Zeichen + 1
             End If
          Loop Until Zeichen = 3
          Zeichen = 0
    
             Select Case Param2
             Case "rgt":                                        '"rgt" für Rechts
                Printbin O
                   A = Avor()
                Printbin D
                Goto Begin
    
             Case "lft":                                        '"lft" für Links
                Printbin O
                   A = Bvor()
                Printbin D
                Goto Begin
    
             Case "bot":                                        '"bot" für beide
                Printbin O
                   A = Zvor()
                Printbin D
                Goto Begin
    
             Case Else
                 Printbin F
                 Goto Begin
             End Select
    
          Goto Begin
    
    
    
       Case "bcw":                                              'Anweisung "bcw" = Rückwärts
          Printbin O
          Param3 = ""
    
          Do
             Tmp = Inkey()
    
             If Tmp = 0 Then
             Else
                Param3 = Param3 + Chr(tmp)
               Tmp = 0
               Zeichen = Zeichen + 1
             End If
          Loop Until Zeichen = 3                                'Motor holen
          Zeichen = 0
    
             Select Case Param3
             Case "rgt":                                        '"rgt" für rechts
                Printbin O
                   A = Arueck()
                Printbin D
                Goto Begin
    
             Case "lft":                                        '"lft" für links
                Printbin O
                   A = Brueck()
                Printbin D
                Goto Begin
    
             Case "bot":                                        '"bot" für beide
                Printbin O
                   A = Zrueck()
                Printbin D
                Goto Begin
    
             Case Else
                 Printbin F
                 Goto Begin
             End Select
    
          Goto Begin
    
    
    
       Case "stp":                                              'Anweisung "stp" = Stop
          Printbin O
          Param4 = ""
    
          Do
             Tmp = Inkey()
    
             If Tmp = 0 Then
             Else
                Param4 = Param4 + Chr(tmp)
               Tmp = 0
               Zeichen = Zeichen + 1
             End If
          Loop Until Zeichen = 3
          Zeichen = 0
    
             Select Case Param4
             Case "rgt":
                Printbin O
                   A = Astop()
                Printbin D
                Goto Begin
    
             Case "lft":
                Printbin O
                   A = Bstop()
                Printbin D
                Goto Begin
    
             Case "bot":
                Printbin O
                   A = Zstop()
                Printbin D
                Goto Begin
    
             Case Else
                 Printbin F
                 Goto Begin
             End Select
    
          Goto Begin
    
    
    
       Case "trn":
          Printbin O
          Param1 = ""
    
          Do
             Tmp = Inkey()
    
             If Tmp = 0 Then
             Else
                Param1 = Param1 + Chr(tmp)
               Tmp = 0
               Zeichen = Zeichen + 1
             End If
          Loop Until Zeichen = 3
          Zeichen = 0
    
             Select Case Param1
             Case "rgt":
                Printbin O
                   A = Zrechts()
                Printbin D
                Goto Begin
    
             Case "lft":
                Printbin O
                   A = Zlinks()
                Printbin D
                Goto Begin
    
             Case Else
                Printbin F
                Goto Begin
             End Select
    
    
       Case Else
           Printbin F
           Goto Begin
       End Select
    
    Goto Begin
    
    
    
    Ser:
       Printbin O
    
    Goto Begin
    
    
    Prt:
       Printbin O
    
    Goto Begin
    
    
    Stp:
       Printbin O
          A = Zstop()
       Printbin D
    
    Goto Begin
    
    
    End
    
    
    'Subroutines and Functions
    
    Sub Enablea(a As Byte)
        Portd.4 = 1
    End Sub
    
    Sub Denablea(a As Byte)
        Portd.4 = 0
    End Sub
    
    Sub Avor(a As Byte)
       Portd.2 = 1
       Portd.3 = 0
    End Sub
    
    Sub Arueck(a As Byte)
       Portd.2 = 0
       Portd.3 = 1
    End Sub
    
    Sub Astop(a As Byte)
       Portd.2 = 0
       Portd.3 = 0
    End Sub
    
    
    
    Sub Enableb(a As Byte)
        Portd.7 = 1
    End Sub
    
    Sub Denableb(a As Byte)
        Portd.7 = 0
    End Sub
    
    Sub Bvor(a As Byte)
       Portd.5 = 1
       Portd.6 = 0
    End Sub
    
    Sub Brueck(a As Byte)
       Portd.5 = 0
       Portd.6 = 1
    End Sub
    
    Sub Bstop(a As Byte)
       Portd.5 = 0
       Portd.6 = 0
    End Sub
    
    
    
    
    Sub Enablez(a As Byte)
       A = Enablea()
       A = Enableb()
    End Sub
    
    Sub Zvor(a As Byte)
       A = Avor()
       A = Bvor()
    End Sub
    
    Sub Zrueck(a As Byte)
       A = Arueck()
       A = Brueck()
    End Sub
    
    Sub Zstop(a As Byte)
       A = Astop()
       A = Bstop()
    End Sub
    
    Sub Zlinks(a As Byte)
       A = Avor()
       A = Brueck()
    End Sub
    
    Sub Zrechts(a As Byte)
       A = Arueck()
       A = Bvor()
    End Sub
    
    
    
    Function Getparabyte()
    
    Do
       Tmp2 = Inkey()
    Loop Until Tmp2 <> 0
    
    Getparabyte = Tmp2
    
    End Function
    
    
    Function Getparastring()
    
    Do
       Tmp2 = Inkey()
    Loop Until Tmp2 <> 0
    
    Getparastring = Chr(tmp2)
    
    End Function
    Wäre es nicht möglich, dass er nach den "Functions" nicht zurückspringt?
    Die Functions sind dazu da, dass ich nicht im Programm direkt die pins ansprechen muss.


    Der quellcode des Masters:
    Code:
    Dim C As Byte
    Dim D As String * 5
    Dim A As Byte
    Dim B As String * 5
    Dim L As Bit
    
    $baud = 9600
    
    A = 0
    B = ""
    L = 0
    
    Wait 1
    
    Begin:
    
    Sound Portd.2 , 100 , 500
    
       C = Asc( "m")
       Printbin C
       Waitms 1
    
       C = Asc( "o")
       Printbin C
       Waitms 1
    
       C = Asc( "t")
       Printbin C
       Waitms 1
    
       Do
          A = Inkey()
    
          If A = 0 Then
          Else
             B = Chr(a)
             L = 1
          End If
       Loop Until L = 1
       A = 0
       L = 0
    
    
       If B = "o" Then
    
          C = Asc( "f")
          Printbin C
          Waitms 1
    
          C = Asc( "w")
          Printbin C
          Waitms 1
    
          C = Asc( "d")
          Printbin C
          Waitms 1
    
          B = ""
    
           Do
             A = Inkey()
    
             If A = 0 Then
             Else
                B = Chr(a)
                L = 1
             End If
          Loop Until L = 1
          A = 0
          L = 0
    
    
          If B = "f" Then
               Sound Portd.2 , 1000 , 3500
          End If
    
    
          If B = "o" Then
    
             Waitms 10
    
             C = Asc( "b")
             Printbin C
             Waitms 1
    
             C = Asc( "o")
             Printbin C
             Waitms 1
    
             C = Asc( "t")
             Printbin C
             Waitms 1
    
             B = ""
    
             Do
                A = Inkey()
    
                If A = 0 Then
                Else
                   B = Chr(a)
                   L = 1
                End If
             Loop Until L = 1
             A = 0
             L = 0
    
    
             If B = "o" Then
    
                Do
                A = Inkey()
    
                If A = 0 Then
                Else
                   B = Chr(a)
                   L = 1
                End If
                Loop Until L = 1
                A = 0
                L = 0
    
                If B = "d" Then
                   Sound Portd.2 , 1000 , 550
                   End
                End If
                                                            'end program
             Else
                Sound Portd.2 , 10000 , 3500
             End If
    
             End If
    
             End If
    
    
    
             Wait 2     'Hier geht der 2te Befehl loß.
    
    
    
       C = Asc( "m")
       Printbin C
       Waitms 1
    
       C = Asc( "o")
       Printbin C
       Waitms 1
    
       C = Asc( "t")
       Printbin C
       Waitms 1
    
       Do
          A = Inkey()
    
          If A = 0 Then
          Else
             B = Chr(a)
             L = 1
          End If
       Loop Until L = 1
       A = 0
       L = 0
    
    
       If B = "o" Then
    
          C = Asc( "b")
          Printbin C
          Waitms 1
    
          C = Asc( "c")
          Printbin C
          Waitms 1
    
          C = Asc( "w")
          Printbin C
          Waitms 1
    
          B = ""
    
           Do
             A = Inkey()
    
             If A = 0 Then
             Else
                B = Chr(a)
                L = 1
             End If
          Loop Until L = 1
          A = 0
          L = 0
    
    
          If B = "f" Then
               Sound Portd.2 , 1000 , 3500
          End If
    
    
          If B = "o" Then
    
             Waitms 10
    
             C = Asc( "b")
             Printbin C
             Waitms 1
    
             C = Asc( "o")
             Printbin C
             Waitms 1
    
             C = Asc( "t")
             Printbin C
             Waitms 1
    
             B = ""
    
             Do
                A = Inkey()
    
                If A = 0 Then
                Else
                   B = Chr(a)
                   L = 1
                End If
             Loop Until L = 1
             A = 0
             L = 0
    
    
             If B = "o" Then
    
                Do
                A = Inkey()
    
                If A = 0 Then
                Else
                   B = Chr(a)
                   L = 1
                End If
                Loop Until L = 1
                A = 0
                L = 0
    
                If B = "d" Then
                   Sound Portd.2 , 100000 , 750
                   End
                End If
                                                            'end program
             Else
                'Sound Portd.2 , 10000 , 3500
             End If
    
             End If
    
             End If
    
    End
    Der Master ist wie immer ein Mega16, der Slave (mit dem längeren Code)
    ein AT90S4433.

    Ich hoffe ihr versteht die Quellcodes! Die beiden Prozessoren sind über UART miteinander verbunden.

    Wie gesagt beim 1. Befehl funktioniert es WUNDERBAR!

    Hab ich irgendwas vergessen???

    Ich weis, der Quelltext ist ein bisschen lang... ging nicht anders...
    Ich wär euch echt SUPER dankbar, wenn ihr dieses Prob lösen könntet...

    Also schonmal DANKE!!

    Liebe Grüße, Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  2. #2
    Gast
    Dumme Frage, aber wie groß hast du den Stack in den Compileroptionen eingestellt? Wenn Stack oder Frame zu klein sind, kann das die verrücktesten Auswirkungen haben

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    26
    Beiträge
    1.461
    HI

    Meinst du den Inputbuffer?

    Der ist auf der Standardeinstellung - 1Byte.
    Wenn er größer eingestellt wird, funktioniert es nicht mehr.
    Hab ich schon getestet.

    Liebe Grüße, Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  4. #4
    Gast
    Nein, ich meine Stack- und den Framegröße
    Bei einem Aufruf einer Unterfunktion landen alle Prozessorregister auf dem Stack und Alle lokalen und übergebenen Variablem auf dem Frame
    Wenn der Stack ond/oder der Frame zu klein sind, kann es sein, dass sie sich gegenseitig überschreiben => danach steht dann statt der Rücksprungadresse halt irgend ein Müll in den entsprechenden Speicherstellen. Die Einstellungen findest du unter options->compiler->chip
    Am besten einfach mal doppelte Werte in HW-Stack und Frame ausprobieren

  5. #5
    Gast
    HI!

    Aha. Klingt gut!

    Werd ich mal testen...

    Liebe Grüße, und DANKE schonmal,

    Tobi

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    26
    Beiträge
    1.461
    HI

    also wie versprochen mal getestet.
    Der Compiler meckert.
    Ist halt mur ein 4433.
    Muss also woanders liegen. Oder doch nicht?

    Liebe Grüße, Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    26
    Beiträge
    1.461
    Hi Leute!

    Weis denn niemand was?
    Ich weis nicht mal annäherungsweise, wo ich den Fehler suchen muss!

    Mensch mit diesem Bascom bist du manchmal echt aufgeschmissen!
    Nichts jetzt gegen euch!!!!!! Ihr seid SPITZE!!

    Liebe Grüße,
    euer (fast schon verzweifeleter),

    Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2004
    Beiträge
    29
    Falls der Chip zu wenig RAM hat, kann man mal das 1,5-fache probieren.
    Ich schau mir jedenfalls deinen Code nochmal genau an

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2004
    Beiträge
    29
    Wird wohl wirklich am Stack und Frame liegen...
    Der Code sieht jedenfalls mal sauber aus.

    Der Mega8 ist mit dem 90S4433 pinkompatibel. Beim Mega8 würde es mit jeweils doppelten Werten reinpassen. Der Mega8 kostet ungefähr 4 Euro...
    Ansonsten könnte man vielleicht auch am Code was ändern, aber übersichtlicher wirds beim optimieren sicherlich nicht .

+ Antworten

Berechtigungen

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