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:
Wäre es nicht möglich, dass er nach den "Functions" nicht zurückspringt?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
Die Functions sind dazu da, dass ich nicht im Programm direkt die pins ansprechen muss.
Der quellcode des Masters:
Der Master ist wie immer ein Mega16, der Slave (mit dem längeren Code)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
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







Zitieren

Lesezeichen