Christoph2
24.06.2010, 23:55
Hi,
ich will meinem Roboter ein uATX Board spendieren, auf dem LabView laufen soll. Das Labview Programm soll die eigentliche Steuerung des Roboters übernehmen, als Schnittstelle zu den Motoren, Servos, Sensoren, etc. verwende ich ein RNBFRA Board.
Der PC sendet also Steuerbefehle an das RNBFRA Board und das RNBFRA sendet Sensorwerte an den PC.
Die serielle Kommunikation funktioniert schon, also ich kann z.B. einen String zum AVR schicken, und der schickt ihn wieder zurück.
Mein Problem ist aber die Erstellung eines möglichst einfachen Protokolles.
Ich habe mir das so gedacht, dass immer 3 Byte übertragen werden:
----------------------------------------
1. Byte: Befehls-ID
z.b.
0000 0001 Motordrehzahl rechts
0000 0010 Motordrehzahl links
0000 0011 Servo 1 Position
0000 0100 Servo 2 Position
0000 0101 Schrittmotor Position
...
2. Byte: Wert (low-Byte)
3. Byte: Wert (high-Byte)
----------------------------------------
Meine erste Frage ist, ob ihr Verbesserungsvorschläge habt.
Die zweite ist die Programmierung des AVRs, damit er das Protokoll versteht.
Damit ich einen Befehl verarbeiten kann, muss ich ja erstmal die 3 einzelnen Bytes "sammeln" und in einen string aus 3 Zeichen schreiben.
So einen Buffer habe ich jetzt schon programmiert, er wartet einfach bis er drei Zeichen empfangen hat und speichert die in einem String. Für die weitere Verarbeitung, bzw. Befehlsinterprätation ist es aber unbedingt nötig, dass das Befehls-Byte an erster Stelle steht.
Aber wie verdammt erkenne ich das Befehls-Byte???
Meine erste Idee war, das ich nach dem dritten Byte noch ein Byte einfüge, dass mir anzeigt, dass der Befehl zu Ende ist und ein neuer beginnt. Aber das geht auch nicht wirklich gut, wenn ich z.B. 1111 1111 als Befehl-Ende Sequenz nehme, darf ich sie ja sonst nirgends verwenden.
Beim Befehl wäre das ja nicht so schlimm, dann kann ich eben nur 255 Befehle verwenden, aber da ich aber mit Byte 2 und Byte 3 auch (auf 2*8Bit gesplittete) 16 Bit Variablen übertragen will, ist das ein großes Problem...
Könnt ihr mir irgendwie weiterhelfen?
lg Christoph
ich will meinem Roboter ein uATX Board spendieren, auf dem LabView laufen soll. Das Labview Programm soll die eigentliche Steuerung des Roboters übernehmen, als Schnittstelle zu den Motoren, Servos, Sensoren, etc. verwende ich ein RNBFRA Board.
Der PC sendet also Steuerbefehle an das RNBFRA Board und das RNBFRA sendet Sensorwerte an den PC.
Die serielle Kommunikation funktioniert schon, also ich kann z.B. einen String zum AVR schicken, und der schickt ihn wieder zurück.
Mein Problem ist aber die Erstellung eines möglichst einfachen Protokolles.
Ich habe mir das so gedacht, dass immer 3 Byte übertragen werden:
----------------------------------------
1. Byte: Befehls-ID
z.b.
0000 0001 Motordrehzahl rechts
0000 0010 Motordrehzahl links
0000 0011 Servo 1 Position
0000 0100 Servo 2 Position
0000 0101 Schrittmotor Position
...
2. Byte: Wert (low-Byte)
3. Byte: Wert (high-Byte)
----------------------------------------
Meine erste Frage ist, ob ihr Verbesserungsvorschläge habt.
Die zweite ist die Programmierung des AVRs, damit er das Protokoll versteht.
Damit ich einen Befehl verarbeiten kann, muss ich ja erstmal die 3 einzelnen Bytes "sammeln" und in einen string aus 3 Zeichen schreiben.
So einen Buffer habe ich jetzt schon programmiert, er wartet einfach bis er drei Zeichen empfangen hat und speichert die in einem String. Für die weitere Verarbeitung, bzw. Befehlsinterprätation ist es aber unbedingt nötig, dass das Befehls-Byte an erster Stelle steht.
Aber wie verdammt erkenne ich das Befehls-Byte???
Meine erste Idee war, das ich nach dem dritten Byte noch ein Byte einfüge, dass mir anzeigt, dass der Befehl zu Ende ist und ein neuer beginnt. Aber das geht auch nicht wirklich gut, wenn ich z.B. 1111 1111 als Befehl-Ende Sequenz nehme, darf ich sie ja sonst nirgends verwenden.
Beim Befehl wäre das ja nicht so schlimm, dann kann ich eben nur 255 Befehle verwenden, aber da ich aber mit Byte 2 und Byte 3 auch (auf 2*8Bit gesplittete) 16 Bit Variablen übertragen will, ist das ein großes Problem...
Könnt ihr mir irgendwie weiterhelfen?
lg Christoph