www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Nicht auffindbarer Fehler in Code für Roboter (Bascom)


Autor: David .. (david1)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Ich bin zurzeit dabei meinen ersten Bot aufzubauen und versuch grad den 
Fahralgorithmus zu schreiben.

Also theoretisch sollte das so funktionieren.

Ich hab eine Sub in die ich 4 Werte übergeb:
direc_l (Richtung für linke Raupe, 0 = rückwärts, 1 = vorwärts)
pwm_l (Pwm für linke Raupe, 3 stelliger Wert)
direc_r (Richtung für rechte Raupe, 0 = rückwärts, 1 = vorwärts)
pwm_r (Pwm für rechte Raupe, 3 stelliger Wert)

Soweit die Theorie, nur die Praxis sieht anders aus.

Das ganze möchte ich nun über den Uart Steuern, also hab ich mir 
folgendes "Protokoll" überlegt:
Drive:dirc_l-pwm_l-direc_r-pwm_r

Das kann ich auch Problemlos splitten und bekomm dann die Werte die ich 
brauch. Abr jetz fangen die Probleme an, die verschiedenen Variablen 
Typen, hier der Code:
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 9600


Config Serialin = Buffered , Size = 30 , Bytematch = 13
Declare Sub Serial0charmatch()



'Config Outputs


   Config Portc.4 = Output                                  'M_left1a
   M_left1a Alias Portc.4
   Config Portc.5 = Output                                  'M_left2a
   M_left2a Alias Portc.5
   Config Portc.6 = Output                                  'M_left3a
   M_left3a Alias Portc.6
   Config Portc.7 = Output                                  'M_left4a
   M_left4a Alias Portc.7


   'Declare Motor-PWM
   Config Portb.0 = Output                                  'm-left-enable
   M_left_e Alias Portb.0
   Config Portb.1 = Output                                  'm-right-enable
   M_right_e Alias Portb.1


'Config Inputs
   Config Portd.2 = Input                                   'emergency-out
   Em_out Alias Portc.0
   Em_out = 1                                               'enable pullup


Enable Interrupts


'Config Var's
Dim Tmp As Byte
Dim New_command As String * 30
Dim Incoming_array(5) As String * 30
Dim Command_array(5) As String * 30
Dim New_status As Bit

Dim Pwm_1 As Integer
Dim Pwm_2 As Integer


Dim Drive_command(4) As String * 15



Declare Sub Exc_drive(byval Direc__l As String , Byval Pwm__l As String , Direc__r As String , Byval Pwm__r As String)



Do



   If New_command <> "" Then

      New_command = Ucase(new_command)

      'Anweisung aufteilen
      Tmp = Split(new_command , Incoming_array(1) , ":")

      Select Case Incoming_array(1)
         Case "DRIVE"
         Tmp = Split(incoming_array(2) , Command_array(1) , "-")


             Call Exc_drive(command_array(1) , Command_array(2) , Command_array(3) , Command_array(4))
      
         Case Else
            Print "ERROR: unknown command"
      End Select

   New_command = ""
   End If


Loop
End



Sub Serial0charmatch()

   Input New_command Noecho
   Print New_command

End Sub





Sub Exc_drive(byval Direc_l As Integer , Byval Pwm_l As String * 3 , Direc_r As String * 1 , Byval Pwm_r As String * 3)

E   If Direc_l = "1" Then Gosub Forward_left                 'drive forward
E   If Direc_l = "0" Then Gosub Backward_left                'drive backward

   If Direc_r = "1" Then Gosub Forward_right                'drive forward
   If Direc_r = "0" Then Gosub Backward_right               'drive backward

   Pwm_1 = Val(pwm_l)
   Pwm_2 = Val(pwm_r)

   Pwm1a = Pwm_1
   Pwm1b = Pwm_2

   'Print Direc__l ; " " ; Pwm__l ; " " ; Direc__r ; " " ; Pwm__r
   'Print Pwm_l

End Sub




Forward_left:
   M_left1a = 1
   M_left2a = 0
Return


Backward_left:
   M_left1a = 0
   M_left2a = 1
Return


Forward_right:
   M_left4a = 1
   M_left3a = 0
Return


Backward_right:
   M_left4a = 0
   M_left3a = 1
Return


Stop_drive:

Return

Im Anhang die Fehler, und im Code sind die zwei entsprechenden zeilen 
mit "E" markiert.

Aber auch wenn ich
If Direc_l = "1" Then Gosub Forward_left gegen
If Direc_l = 1 Then Gosub Forward_left
tausche ändert sich nix.

Hat jemand ne Idee wie ich das in den Griff bekomm?

David

Autor: XXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Direc_l ist ein Integer, der mit einem String verglichen wird!
ist das so gewünscht??

Gruß
XXX

Autor: Micha C. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo David,

ich kann zwar kein Basic programmieren, aber die Deklaration und die 
Definition Deiner Exc_drive-Methode unterscheiden sich im Typ des ersten 
Parameters (direc_l).


Declare Sub Exc_drive(byval Direc__l As String , Byval Pwm__l As String 
, Direc__r As String , Byval Pwm__r As String)

Sub Exc_drive(byval Direc_l As Integer , Byval Pwm_l As String * 3 , 
Direc_r As String * 1 , Byval Pwm_r As String * 3)


Ist das vielleicht der gesuchte Fehler?

Ausserdem ist der String-Vergleich mit einem Integer in den mit E 
markierten Zeilen eventuell falsch.


Gruss

   Micha

Autor: David .. (david1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Antworten, habs jetzt geändert so dass unten String * 1 
anstatt Integer steht.

Aber der Fehler bleibt bestehen.

Autor: skua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Deklaration benutzt du Doppelunterstriche.

Autor: David .. (david1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jesus!

Danke skua, da wär ich im leben nich draufgekommen, und schon garnich 
das sowas nen Error mit Invalid Datatype verursacht ...

Vielen vielen dank!

Gruß
David

Autor: David .. (david1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, jetz taucht aber das nächste Problem auf, und zwar schick ich an 
Uart


'Uart Protokoll:
'Drive : R_l -pwm_l -r_r -pwm_r
'drive:1-120-1-130


$regfile = "m16def.dat"
$crystal = 16000000
$baud = 9600

$include "sub.bas"


Config Serialin = Buffered , Size = 30 , Bytematch = 13
Declare Sub Serial0charmatch()



'Config Outputs


   Config Portc.4 = Output                                  'M_left1a
   M_left1a Alias Portc.4
   Config Portc.5 = Output                                  'M_left2a
   M_left2a Alias Portc.5
   Config Portc.6 = Output                                  'M_left3a
   M_right3a Alias Portc.6
   Config Portc.7 = Output                                  'M_left4a
   M_right4a Alias Portc.7


   'Declare Motor-PWM
   Config Portb.0 = Output                                  'm-left-enable
   M_left_e Alias Portb.0
   Config Portb.1 = Output                                  'm-right-enable
   M_right_e Alias Portb.1


'Config Inputs
   Config Portd.2 = Input                                   'emergency-out
   Em_out Alias Portc.0
   Em_out = 1                                               'enable pullup


'Config Interrupts
'   Config Int0 = Falling                                    'fallende Flanke
'   On Int0 On_em_out
'   Enable Int0


Enable Interrupts


'Config Var's
Dim Tmp As Byte
Dim New_command As String * 30
Dim Incoming_array(5) As String * 30
Dim Command_array(5) As String * 10


Dim Pwm_1 As Integer
Dim Pwm_2 As Integer


'Dim Direc_l As String * 1
'Dim Pwm_l As String * 3
'Dim Direc_r As String * 1
'Dim Pwm_r As String * 3


Dim Drive_command(4) As String * 15



Declare Sub Exc_drive(byval Direc_l As String , Byval Pwm_l As String , Direc_r As String , Byval Pwm_r As String)



Do



   If New_command <> "" Then

      New_command = Ucase(new_command)

      'Anweisung aufteilen
      Tmp = Split(new_command , Incoming_array(1) , ":")

      Select Case Incoming_array(1)
         Case "DRIVE"
         Tmp = Split(incoming_array(2) , Command_array(1) , "-")
'             Drive_command(1) = Command_array(1)
'             Drive_command(2) = Command_array(2)
'             Drive_command(3) = Command_array(3)
'             Drive_command(4) = Command_array(4)


             'Direc_l  = Command_array(1)
'             Pwm_l = Command_array(2)
'             Direc_r = Command_array(3)
'             Pwm_r = Command_array(4)

               'Print Command_array(1) ; " " ; Command_array(2) ; " " ; Command_array(3) ; " " ; Command_array(4)

'             Gosub Exc_drive
            Print Command_array(1) ; " "
            Print Command_array(2) ; " "
            Print Command_array(3) ; " "
            Print Command_array(4) ; " "

            Call Exc_drive(command_array(1) , Command_array(2) , Command_array(3) , Command_array(4))


         Case Else
            Print "ERROR: unknown command"
      End Select

   New_command = ""
   End If


'Wait 100


'Call Exc_drive( "1" , "120" , "1" , "130")


Loop
End



Sub Serial0charmatch()

   Input New_command Noecho
   Print New_command

End Sub




'Exc_drive:
'   If Drive_command(1) = "1" Then Gosub Forward_left        'drive forward
'   If Drive_command(1) = "0" Then Gosub Backward_left       'drive backward

'   If Drive_command(3) = "1" Then Gosub Forward_right       'drive forward
'   If Drive_command(3) = "0" Then Gosub Backward_right      'drive backward

'   Pwm_1 = Val(drive_command(2))
'   Pwm_2 = Val(drive_command(4))

'   Pwm1a = Pwm_1
'   Pwm1b = Pwm_2

'   Print Pwm_1 ; " " ; Pwm_2

'Return





Sub Exc_drive(byval Direc_l As String * 1 , Byval Pwm_l As String * 3 , Direc_r As String * 1 , Byval Pwm_r As String * 3)

   Print Direc_l ; " "
   Print Pwm_l ; " "
   Print Direc_r ; " "
   Print Pwm_r ; " "


   If Direc_l = "1" Then Gosub Forward_left                 'drive forward
   If Direc_l = "0" Then Gosub Backward_left                'drive backward

   If Direc_r = "1" Then Gosub Forward_right                'drive forward
   If Direc_r = "0" Then Gosub Backward_right               'drive backward

   Pwm_1 = Val(pwm_l)
   Pwm_2 = Val(pwm_r)

   Pwm1a = Pwm_1
   Pwm1b = Pwm_2

   'Print Pwm_1 ; " " ; Pwm__l ; " " ; Direc__r ; " " ; Pwm__r


End Sub




Forward_left:
   M_left1a = 1
   M_left2a = 0
Return


Backward_left:
   M_left1a = 0
   M_left2a = 1
Return


Forward_right:
   M_right4a = 1
   M_right3a = 0
Return


Backward_right:
   M_right4a = 0
   M_right3a = 1
Return


Stop_drive:

   Pwm1a = 0
   Pwm1b = 0

   M_left1a = 0
   M_left2a = 0

   M_right4a = 0
   M_right3a = 0

Return



geb ich dann im Simulator folgendes ein:
drive:1-120-1-130

erhalt ich wie gewünscht die Ausgabe:
drive:1-120-1-130

1
120
1
130

D98
120
1
130

Die erste Zeile gibt einfach das zurück was empfangen wurde, dann kommt 
die erste Print-Reihe bevor die Sub Exc_drive aufgerufen wird, da 
stimmen noch alle Werte, die zweite Print-Reihe erfolgt in der Sub und 
gibt die 4 Empfangenen Variablen aus.

Nur bei der ersten (Dirc_l) läuft irgendwas schief und es kommt nur 
Müll.


Sieht hier vlt jemand vlt den Fehler?

Also ich nicht, und auch meinem Dad gehts genauso, wir sehen einfach vor 
lauter Bäumen den Wald nichmehr ...

Autor: mü-C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahrscheinlich ist der $FrameSize zu klein.
Bei so langen Strings wirst du mehr brauchen.
Ich würde die Werte auch in dein Programm schreiben, damit sind sie 
klar.

Autor: David .. (david1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen vielen dank für die Antwort, hat mir weitergeholfen!

Also als erstes hab ich Framesize mal auf 40 gesetzt, keine Veränderung.
Dann bin ich mit HW-Stack auf 45 und mit dem SW-Stack auf 16.

Und Tada, läuft wunderbard, wieder was dazugelernt :)

Vielen vielen dank, somit steht morgen einer ersten Testfahrt mit meinem 
Bot nichts mehr im weg :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.