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
Lesezeichen