-         

Ergebnis 1 bis 7 von 7

Thema: Kommunikation zwischen 2 kontrolern(brauche hilfe)

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2004
    Beiträge
    451

    Kommunikation zwischen 2 kontrolern(brauche hilfe)

    Anzeige

    ich habe zwei mega8 und will diese mit einander kommunitzieren lassen, da ich für den bot viele Servos benötige. der erste mega8 wertet die Sensoren aus und gibt dem anderen die bewegungs befehle (vor, zurück, rechts, links,...).

    jedoch bekomme ich die Befehlsübertragung nicht zum laufen. zur kommunikatien dient der komplette c-Port und dann die restlichen entweder für Sensoren oder servos.
    Da dies jedoch nur ein versuchsaufbau ist steuer ich zurzeit nur LED'S an und hatte vor später auf Servos umzusteigen.

    Hier der Empfängerservokontroler)


    $regfile = "m8def.dat"
    $crystal = 3686400

    '-------------------------------------------------------------------------------
    'BEWEGUNGS-BUS
    Config Portc.0 = Output

    Config Portc.1 = Input
    Config Portc.2 = Input
    Config Portc.3 = Input
    Config Portc.4 = Input

    Config Portc.5 = Input

    'BEINE RECHTS
    'Config Portb.0 = Output
    'Config Portb.1 = Output
    'Config Portb.2 = Output
    'Config Portb.3 = Output
    'Config Portb.4 = Output
    'Config Portb.5 = Output
    'BEINE LINKS
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portd.4 = Output
    Config Portd.5 = Output
    'Config Portd.6 = Output
    'Config Portd.7 = Output

    Declare Sub Grund '0000
    Declare Sub Vor '0001
    Declare Sub Rueck '0010
    Declare Sub Rdreh '0011
    Declare Sub Ldreh '0100
    '================================================= ==============================

    Portc.0 = 1
    Bitwait Pinc.5 , Set
    Waitms 100
    Portc.0 = 0

    Do
    Bitwait Pinc.5 , Set

    If Pinc.4 = 1 Then
    If Pinc.3 = 1 Then
    If Pinc.2 = 1 Then
    If Pinc.1 = 1 Then
    Call 15 '1111
    Else
    Call 14 '1110
    End If
    Else
    If Pinc.1 = 1 Then
    Call 13 '1101
    Else
    Call 12 '1100
    End If
    End If
    Else
    If Pinc.2 = 1 Then
    If Pinc.1 = 1 Then
    Call 11 '1011
    Else
    Call 10 '1010
    End If
    Else
    If Pinc.1 = 1 Then
    Call 9 '1001
    Else
    Call 8 '1000
    End If
    End If
    End If
    Else
    If Pinc.3 = 1 Then
    If Pinc.2 = 1 Then
    If Pinc.1 = 1 Then
    Call 7 '0111
    Else
    Call 6 '0110
    End If
    Else
    If Pinc.1 = 1 Then
    Call 5 '0101
    Else
    Call Ldreh '0100
    End If
    End If
    Else
    If Pinc.2 = 1 Then
    If Pinc.1 = 1 Then
    Call Rdreh '0011
    Else
    Call Rueck '0010
    End If
    Else
    If Pinc.1 = 1 Then
    Call Vor '0001
    Else
    Call Grund '0000
    End If
    End If
    End If
    End If


    Waitms 200
    Bitwait Pinc.5 , Set
    Loop
    End
    '================================================= ==============================
    Sub Grund
    Portd.2 = 1
    Portd.3 = 1
    Portd.4 = 1
    Portd.5 = 1

    Wait 2
    Portd.2 = 0
    Portd.3 = 0
    Portd.4 = 0
    Portd.5 = 0
    End Sub
    '-------------------------------------------------------------------------------
    Sub Vor
    Portd.2 = 1
    Wait 2
    Portd.2 = 0
    End Sub
    '-------------------------------------------------------------------------------
    Sub Rueck
    Portd.3 = 1
    Wait 2
    Portd.3 = 0

    End Sub
    '-------------------------------------------------------------------------------
    Sub Rdreh
    Portd.4 = 1
    Wait 2
    Portd.4 = 0
    End Sub
    '-------------------------------------------------------------------------------
    Sub Ldreh
    Portd.5 = 1
    Wait 2

    End Sub

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2004
    Beiträge
    451
    Und hier ist das SEnderProgramm:
    Portd2 und 3 simulieren zwei Abstandssensoren, die später folgen sollen

    $regfile = "m8def.dat"
    $crystal = 3686400

    '-------------------------------------------------------------------------------
    'BEWEGUNGS-BUS
    Config Portc.0 = Input 'weitersignal

    Config Portc.1 = Output 'Bewegungsrichtung
    Config Portc.2 = Output
    Config Portc.3 = Output
    Config Portc.4 = Output

    Config Portc.5 = Output 'signal start

    Config Portd.2 = Input 'sensor rechts
    Config Portd.3 = Input 'sensor links

    Declare Sub Grund '0000
    Declare Sub Vor '0001
    Declare Sub Rueck '0010
    Declare Sub Rdreh '0011
    Declare Sub Ldreh '0100

    '------------------------------------------------
    Portc.5 = 1
    Bitwait Pinc.0 , Set
    Waitms 200
    Portc.5 = 0

    Do
    If Pind.2 = 1 And Pind.3 = 1 Then
    Call Rueck
    End If
    If Pind.2 = 1 And Pind.3 = 0 Then
    Call Ldreh
    End If
    If Pind.2 = 0 And Pind.3 = 1 Then
    Call Rdreh
    End If
    If Pind.2 = 0 And Pind.3 = 0 Then
    Call Vor
    End If


    Waitms 200
    Bitwait Pinc.0 , Set
    Loop
    End
    '================================================= ==============================
    Sub Grund

    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 0
    Portc.4 = 0
    Portc.5 = 1
    Wait 1
    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 0
    Portc.4 = 0
    Portc.5 = 0
    End Sub
    '-------------------------------------------------------------------------------
    Sub Vor

    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 0
    Portc.4 = 1
    Portc.5 = 1
    Wait 1
    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 0
    Portc.4 = 0
    Portc.5 = 0

    End Sub
    '-------------------------------------------------------------------------------
    Sub Rueck

    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 1
    Portc.4 = 0
    Portc.5 = 1
    Wait 1
    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 0
    Portc.4 = 0
    Portc.5 = 0

    End Sub
    '-------------------------------------------------------------------------------
    Sub Rdreh

    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 1
    Portc.4 = 1
    Portc.5 = 1
    Wait 1
    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 0
    Portc.4 = 0
    Portc.5 = 0

    End Sub
    '-------------------------------------------------------------------------------
    Sub Ldreh

    Portc.1 = 0
    Portc.2 = 1
    Portc.3 = 0
    Portc.4 = 0
    Portc.5 = 1
    Wait 1
    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 0
    Portc.4 = 0
    Portc.5 = 0

    End Sub
    '-------------------------------------------------------------------------------

    Mein Problem ist, dass die beiden Programme nicht mirt einander arbeiten (es kommt nicht über die start sequenz hinaus)

    könnte es an dem Befehl bitwait liegen, dad ich ihn zum ersten mal verwende und aus dem Handbuch diese Funktion entnommen habe?
    schon jetzt danke für eure hilfe
    mfg robin

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Wenn du den ganzen PortC für die Übertragung zwischen den AVRs hast, kann doch gleich einer alles machen.
    Benutze doch ein vorhandenes Kommunikationsprotokoll. RS232, I²C oder so.

    Du kannst ja Wörter wie "vor", "links", usw schicken und benötigst im Prinzip max. 2 Leitungen.

    Dein Wait 2 wird dir aber noch Probleme bereiten.
    Überlege mal, wieviel Meter deine Mutter in 2 Sekunden mit dem Staubsauger zurücklegt. Wenn dein Roboter grade nach vorne geht und sie ankommt, wartet dein Programm wirklich erstmal zwei Sekunden, bis der nächste Schritt ausgeführt wird.
    Der Sensor-AVR hat zwar schon Alarm geschlagen, das von vorne was kommt, aber der Servo-AVR geht munter weiter. Über den RX-INT weiss der Servo-AVR zwar schon, das Gefahr in Vollzug ist, aber er kann nicht handeln. Er wird gezungen 2 Sekunden zu warten. Zzgl der Zeit, die das bewegen der Beine benötigt.

    Selbst eine Alarmsequenz die alles anhält und zurückgeht muss gut überlegt sein. Weil evtl ist grade ein Bein in der Luft.
    Mit RS232 kannst du dir das Bitwait dann auch sparen.
    Zumindest wenn ich das Programm auf dem ersten Blick richtig deute. Was wo angeschlossen ist, hast du ja nicht erwähnt. Und Kommentare sind im Code auch kaum vorhanden. Zumindest nicht da, wo es wichtig wäre.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2004
    Beiträge
    451
    "Wenn du den ganzen PortC für die Übertragung zwischen den AVRs hast, kann doch gleich einer alles machen."
    Ich plane später och den bot durch allerlei Sensoren (LDR, Batterietester,... ) zu erweitern, weswegen mir die sechs pins von portc ein bischen wenig vorkamen.


    "Dein Wait 2 wird dir aber noch Probleme bereiten."

    der Wait befehl würde später durch den fertigen bewegungsablauf ersetzt werden hier dient er nur um das LED länger leuchten zu lassen, das den bewegungsablauf darstellt.

    I2C besitzen meine Boards leider nicht aber die serielle schnittstelle gibt es irgendwo brauchbare anleitungen für die kommunikation mit rs232?

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2006
    Ort
    Biberach
    Alter
    27
    Beiträge
    485
    Ein Mega8 unterstützt sehr wohl I2C. http://www.roboternetz.de/wissen/index.php/I2C

    Und hier noch ein Artikel zum RS232:
    http://www.roboternetz.de/wissen/index.php/RS232

    MfG

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    gibt es irgendwo brauchbare anleitungen für die kommunikation mit rs232?
    Hier im Forum z.B. mit der Suche. In der Bascom-Hilfe. In den Samples von Bascom oder http://www.rowalt.de/mc/index.htm

    zu erweitern, weswegen mir die sechs pins von portc ein bischen wenig vorkamen.
    Das ist ja auch Sinn der Sache eines Bus. Damit du für jeden Sensor nicht den Status über einen Pin übertragen musst. Dann könnte gleich ein Controller alle Aufgaben übernehmen.
    Wie z.B. im Internet. Da hat man auch nicht für jede Seite die es im WWW gibt eine eigene Leitung nach Hause um auf die Seite zugreifen zu können.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2004
    Beiträge
    451
    habe das problem in den grif bekommen:

    habe alle subs durch den Befehl goto ersetzt ich denke mal der chip hat sich irgendwo bei den if'verfangen, da ich ihn jetzt nach dem beenden eines bewegungsablaufes hinter die if schleifen schicke.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •