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,
...), 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
						
					
Lesezeichen