PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mein Protokoll spinnt......



tobimc
21.08.2004, 21:21
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:


'************************************************* ******************
'* 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:


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

22.08.2004, 05:54
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

tobimc
22.08.2004, 08:43
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

22.08.2004, 15:29
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

22.08.2004, 18:24
HI!

Aha. Klingt gut!

Werd ich mal testen...

Liebe Grüße, und DANKE schonmal,

Tobi

tobimc
22.08.2004, 21:26
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

tobimc
23.08.2004, 23:17
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 :(

andi84
24.08.2004, 00:36
Falls der Chip zu wenig RAM hat, kann man mal das 1,5-fache probieren.
Ich schau mir jedenfalls deinen Code nochmal genau an

andi84
24.08.2004, 00:43
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 :(.