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