PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kommunikation zwischen 2 kontrolern(brauche hilfe)



robin
05.11.2006, 10:44
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änger:(servokontroler)


$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

robin
05.11.2006, 10:47
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

Marco78
05.11.2006, 11:28
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.

robin
05.11.2006, 12:32
"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?

coCo
05.11.2006, 12:51
Ein Mega8 unterstützt sehr wohl I2C. https://www.roboternetz.de/wissen/index.php/I2C

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

MfG

Marco78
05.11.2006, 13:28
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.

robin
05.11.2006, 14:59
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.