Hi
mein Robbi macht seine erste Fahrt durchs Wohnzimmer. Er ist mit dem RNBFRA1.2, 2 Getriebemotoren und einem Sharp Entfernungssensor ausgestattet, der durch ein Servo auf 11 verschiedene Positionen zur Messung gebracht wird. Also so eine Art Radar. Momentan fährt er einfach geradeaus und weicht bei einem Hindernis nach rechts aus. Mein Problem ist jetzt, das alles sequentiell abläuft, also die nächste Servoposition zur nächsten Entfernungsmessung erst gemacht wird, nachdem er mit dem Ausweichen fertig ist. Ich würde das Programm also gerne "parallelisieren". Kann mir jemand weiterhelfen? An welcher Stelle müsste man eine Interruptsteuerung einbauen?

Über etwas Hilfe würde ich mich sehr freuen

Gruß
daiyama

Code:
$regfile = "m32def.dat"

Const Posdelta = 25                                         '11 Schritte von 0° - 180°


Declare Sub Rnb_servob(byval Servonummer As Byte , Byval Position As Byte)
Declare Sub Scandistance
Declare Sub Nextscanpos
Declare Sub Initscanpos
Declare Sub Forward
Declare Sub Backward
Declare Sub Leftdir
Declare Sub Rightdir
Declare Sub Halt

Dim I As Word
Dim Arraywert As Byte
Dim Scanpos As Byte                                         'aktuelle Messposition
Dim Scandir As Bit                                          'Rechts herum = 1, Links herum = 0
Dim Scanpositions(11) As Byte                               'Array mit Winkelpositionen

Dim Port As Byte
Dim Distance As Single                                      'Gemessene Entfernung
Dim Delta As Single                                         'Korrekturwert
Dim Adcoutput As Integer                                    'Ausgabewert des Sensors
Dim Vleft As Word                                           'V linker Motor
Dim Vright As Word                                          'V rechter Motor

Const B = 16.025                                            'Offset der Kurve GP2D12
Const A = 5233.5                                            'Steigung der Kurve GP2D12
Const Emin = 500
Const Emax = 80
Const Gmax = 400                                            'Max Geschwindigkeit für Geradeausfahrt
Const Kmax = 200                                            'Max Geschwindigkeit für Kurvenfahrt

$crystal = 8000000
$baud = 9600


Config Adc = Single , Prescaler = Auto

'Ports für linken Motor
Config Pinc.6 = Output                                      'Linker Motor Kanal 1
Config Pinc.7 = Output                                      'Linker Motor Kanal 2
Config Pind.4 = Output                                      'Linker Motor PWM

'Ports für rechten Motor
Config Pinb.0 = Output                                      'Rechter Motor Kanal 1
Config Pinb.1 = Output                                      'Rechter Motor Kanal 2
Config Pind.5 = Output                                      'Rechter Motor PWM

Config Scl = Portc.0                                        'Ports fuer IIC-Bus
Config Sda = Portc.1

Enable Interrupts                                           'Interrupts aktivieren
Enable Adc
Start Adc                                                   'Die ADC's starten

I2cinit
I2cstart
I2cwbyte &H74                                               'Schreibbefehl an PCF3 schicken
' Led´s ein ,Motorendstufen ein, Port-Peripherie ein, RBN-Bus Sleep Modus aus (also Peripherie aktiv)
I2cwbyte &B00000010                                         'Datenbyte an PCF3
I2cstop
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down

Tccr1b = Tccr1b Or &H02                                     'Prescaler = 8



Call Initscanpos                                            'Array mit Winkelpos. füllen...
Call Forward                                                'Vorwärts fahren
Do
  Arraywert = ScanPositions(scanpos)
  Call Rnb_servob(1 , Arraywert)                            'Sensor-Servo auf Position bringen
  Call Scandistance                                         'Entfernung messen
  If Distance < 30 Then                                     'Hindernis in 30 cm...
    Call Halt                                               'anhalten
    Call Backward                                           'ein Stück zurück...
    Call Leftdir                                            'etwas links drehen
    Call Halt                                               'anhalten
    Call Forward                                            'weiter fahren...
  End If
  Call Nextscanpos                                          'nächste Servopos.
  Waitms 100
Loop



Sub Forward
  Vleft = 0
  Vright = 0
  'Linker Motor ein
  Portc.6 = 0                                               'bestimmt Richtung linker Motor
  Portc.7 = 1                                               'bestimmt Richtung linker Motor
  Portd.4 = 1                                               'Linker Motor EIN
  'Rechter Motor ein
  Portb.0 = 1                                               'bestimmt Richtung rechter Motor
  Portb.1 = 0                                               'bestimmt Richtung rechter Motor
  Portd.5 = 1                                               'rechter Motor EIN

  I = 0                                                     'Langsam anfahren...
  Do
    Vleft = I
    Vright = I
    Pwm1a = Vright
    Pwm1b = Vleft
    Waitms 50
    I = I + 5
  Loop Until I > Gmax
End Sub


Sub Backward
  Vleft = 0
  Vright = 0
  'Linker Motor ein
  Portc.6 = 1                                               'bestimmt Richtung linker Motor
  Portc.7 = 0                                               'bestimmt Richtung linker Motor
  Portd.4 = 1                                               'Linker Motor EIN
  'Rechter Motor ein
  Portb.0 = 0                                               'bestimmt Richtung rechter Motor
  Portb.1 = 1                                               'bestimmt Richtung rechter Motor
  Portd.5 = 1                                               'rechter Motor EIN

  I = 0                                                     'Langsam anfahren...
  Do
    Vleft = I
    Vright = I
    Pwm1a = Vright
    Pwm1b = Vleft
    Waitms 50
    I = I + 10
  Loop Until I > Gmax
End Sub


Sub Leftdir
  Vleft = 0
  Vright = 0
  'Linker Motor ein
  Portc.6 = 0                                               'bestimmt Richtung linker Motor
  Portc.7 = 1                                               'bestimmt Richtung linker Motor
  Portd.4 = 1                                               'Linker Motor EIN
  'Rechter Motor ein
  Portb.0 = 0                                               'bestimmt Richtung rechter Motor
  Portb.1 = 1                                               'bestimmt Richtung rechter Motor
  Portd.5 = 1                                               'rechter Motor EIN

  I = 0                                                     'Langsam anfahren...
  Do
    Vleft = I
    Vright = I
    Pwm1a = Vright
    Pwm1b = Vleft
    Waitms 50
    I = I + 10
  Loop Until I > Kmax
End Sub


Sub Rightdir
  Vleft = 0
  Vright = 0
  'Linker Motor ein
  Portc.6 = 1                                               'bestimmt Richtung linker Motor
  Portc.7 = 0                                               'bestimmt Richtung linker Motor
  Portd.4 = 1                                               'Linker Motor EIN
  'Rechter Motor ein
  Portb.0 = 1                                               'bestimmt Richtung rechter Motor
  Portb.1 = 0                                               'bestimmt Richtung rechter Motor
  Portd.5 = 1                                               'rechter Motor EIN

  I = 0                                                     'Langsam anfahren...
  Do
    Vleft = I
    Vright = I
    Pwm1a = Vright
    Pwm1b = Vleft
    Waitms 50
    I = I + 10
  Loop Until I > Kmax
End Sub

Sub Halt
  Pwm1a = 0                                                 'Linker Motor aus
  Pwm1b = 0                                                 'rechter Motor aus
End Sub


Sub ScanDistance
  Adcoutput = Getadc(0)
  If Adcoutput > Emin Then
    Adcoutput = Emin
  End If
  If Adcoutput < Emax Then
    Adcoutput = Emax
  End If
  Delta = Adcoutput - B
  Distance = A / Delta
  Distance = Round(Distance)
End Sub


Sub Initscanpos
  ScanPositions(1) = 3
  For Scanpos = 2 To 11
    ScanPositions(scanpos) = ScanPositions(scanpos - 1) + Posdelta
  Next Scanpos
  Scanpos = 1                                               'Position für erste Messung
  ScanDir = 1                                          'Rechts herum

  For I = 1 To 50                                           'Bildschirm leer machen
    Print
  Next I

  For I = 1 To 11
  Next I
End Sub


Sub Nextscanpos
  If ScanDir = 1 Then                                  'ScanDir = 1
    If Scanpos < 11 Then
      Scanpos = Scanpos + 1
    Else
      ScanDir = 0                                      'ScanDir umkehren
      Scanpos = Scanpos - 1
    End If
  Else                                                      'ScanDir = 0
    If Scanpos > 1 Then
      Scanpos = Scanpos - 1
    Else
      ScanDir = 1                                      'ScanDir umkehren
      Scanpos = Scanpos + 1
    End If
  End If
End Sub

Sub Rnb_servob(byval Servonummer As Byte , Byval Position As Byte)
  Open "comd.7:9600,8,n,1" For Output As #2
  Print #2 , "#s" ; Chr(servonummer) ; Chr(position)
  Close #2
End Sub



End>