Forum: Mikrocontroller und Digitale Elektronik Mein Protokoll hat einen Bug! HELP!


von Tobias Schlegel (Gast)


Angehängte Dateien:

Lesenswert?

HI!

Da ich nicht weis, wo ich das hier hinposten soll,
post' ich's einfach mal hier rein, mit der bitte,
es gegebenenfalls zu verschieben!

Ein kleines GROßES Problem:

Ich habe ja ein Protokoll geschrieben,
das funktioniert soweit auch WUNDERBAR!

Es funktioniert so:
Der Masterprozessor ist ein MEGA16, das Slave ein AT90S4433.

Sie sind beide über seriellen UART miteinander verbunden.
Der Slave dient dem Master sozusagen als "Depp vom Dienst",
der einfach dem Motor steuert und Servos ansteuert.

Das Problem ist: Man kann nur ein Befehl geben,
denn das Protokoll stürzt nach dem ersten sozusagen ab.

Die Quellcodes sind beide in BASCOM AVR BASIC geschrieben.
Sie sind beide in dem ZIP-File drin.

UART SPP-Master_TEST.bas ist der Quellcode für den Master
(ist eine einfache Testroutine...),
UART SPP-Slave.bas ist der Quellcode für den Slave.

Wenn ihr irgendwelche Fragen habt... Dateien benötigt... just say!!

Die Files sind beide in den Standardeinstellungen für den
jeweiligen Chip compiliert.

Leute, ich mach da jetzt schon ewig rum...
Aber meist steckt der Teufel ja im Detail...
NEED HELP!!

Liebe Grüße und Danke schonmal!,
Tobi

von Andi (Gast)


Lesenswert?

Na ja, ohne Kommentare kann man als 'fremder' schlecht erkennen, was
was ist.
Und was A, B, C oder D sein soll, weist auch nur Du.

Gruß
Andi

von Christof Krüger (Gast)


Lesenswert?

Hast du eine richtige umfassende Protokollspezifikation geschrieben?
Beschreib bitte mal formal oder in Worten, was das Protokoll leisten
soll.

von Tobias Schlegel (Gast)


Lesenswert?

Hi!

Oops.. Ja Kommentieren hab' ich vergessen SORRY!!

Also das Protokoll soll:
-Die Motoren ansteuern
-Bis zu 10 Servos ansteuern NNR
-Die restlichen IO/Ports ansteuern NNR

NNR: Noch Nicht Realisiert.

Ich habe es speziell für den Einsatz in meinem Roboter 'Meech'
konzipiert und entwickelt.

Der Kommunikationsablauf funktioniert dann so:

Master: mot  //Er will irgendwas mit den Motoren machen.
Slave: o /*oder*/ f //o für okay f für fehler.
Master(bei o): fwd  bcw  stp / trn // In welche Richtung soll
  der/die Motor/en umgeschaltet werden? fwd: Forwärts, bcw: Rückwärts
  stp: Stop, trn: Turn; drehen.
Slave: o /*oder*/ f //o für okay f für fehler.
Usw.

Ich mache morgen eine Verson der Quelltexte mit Komments;
Mama sagt ich muss jetzt ins Bett. Schade.

Ich kann euch auch eine Grafik mit dem Protokollverlauf machen.
Nur wie gesagt... Mama sagt...

Liebe Grüße und Danke soweit!!

Tobi

von Mark Hämmerling (Gast)


Lesenswert?

Salut,

Du sendest immer Strings? Find ich überflüssig kompliziert. Und
human-readable muß das Protokoll doch sicher nicht werden.
Sende doch einfach nur Bytes, ebenso die Antworten - z.B. 0x00 für
Erfolg, alles andere für entsprechende Fehlercodes: "Ungültiger
Befehl", "Wertebereichsüberschreitung", etc...
Das spart ne ganze Menge Arbeit bei der Auswertung der empfangenen
Strings.

Gruß,
Mark

PS: Und viele Grüße an Mama. Sie soll sich der Wissenschaft nicht so in
den Weg stellen. ;)

von crazy horse (Gast)


Lesenswert?

seh ich auch so.
-Eine Startsequenz vereinbaren
-Befehlsbyte (s) senden
-Datenbyte(s) senden
-CRC-Byte

Etwas einfacher wird die Programiererei, wenn man von Anfang an auf
feste Paketlänge setzt.

von Tobias Schlegel (Gast)


Lesenswert?

HI!

Im Grunde genommen SIND das ja Bytes, die ich versende.
Es sind halt nur drei hintereinander und sie stehen stellvertretend für
Zeichen.
Ich wollte, dass das Befehlsversenden im Master etwas einfacher wird,
mit 1x47 könnte Motor rechts nach links drehen oder Motor links nach
Rechts drehen heißen. Und nach ein paar Tagen versteh ich das Protokoll
selber nicht mehr.

Klar, man könnte einen (Dreistelligen String-)Befehl für eine Operation
machen.Wäre eigentlich gar keine schlechte Idee.
Dann wäre der Code kürzer und der Master Slave Dialog kürzer und somit
das Protokoll schneller. Das werde ich mir durch den Kopf gehen
lassen!! Auf jeden Fall!

Aber OK. Die Kommentierte Version ist in Arbeit.

Selbst WENN ich nur einzelne Bytes versenden WÜRDE.
Würde das Protokoll warscheinlich auch abstürzen.

Ich weis nicht mal, wo ich nach dem Fehler suchen soll!


Aber Trozden DANKE schonmal bis hier!!

Liebe Grüße,
Tobi

von Tobi (Gast)


Lesenswert?

man kann sich konstanten anlegen und die stellvertretend für die zahlen
nehmen. dann kann man anständige name nehmen, nicht nur 3 zeichen und
ist übersichtlicher und schneller weil keine strings

von Joline (Gast)


Lesenswert?

Hi,

kann sein, dass das jetzt etwas am Thema vorbeischlittert, weil Du ja
sicher schon eine Menge Zeit investiert hast. ;o)

Ohne mir den Code jetzt angesehen zu haben, nur aus den Kommentaren der
anderen schliesse ich, dass Du Dir ein Protokoll selber ausgedacht hast.
Aber warum sollte man nicht ein funktionierendes und weit verbreitetes
Protokoll einsetzen. Spontan fällt mir da der Modbus ein. Ist ziemlich
einfach zu implementieren, in der Industrie sehr verbreitet (deshalb
auch erprobt) und kann das abdecken, was Du machen willst.

Schau Dir dazu mal das hier an:

Modicon Modbus Protocol Reference Guide
   http://www.modicon.com/techpubs/TechPubNew/PI_MBUS_300.pdf

und

Demo mit Bascom
   www.mcselec.com/modbus.htm

Ich hoffe, das hilft.

Joline

von Tobias Schlegel (Gast)


Lesenswert?

HI

Der /die /das Modbus-Protokoll ist sicher nicht schlecht.
Aber auf der MCS Seite habe ich den Slave dazu gesehen.
Ich habe in meinem Roboter leider nur wenig Platz,
Sodass ich nicht noch riesige Slaves einbauen kann.
Trozdem gute Idee! Danke!

Mein Protokoll soll von Atmel zu Atmel mit 2 Drähten
funktionieren. Es soll auch möglichst einfach sein.

DESHALB habe ich mich entschlossen, das Protokoll so umzubauen,
dass es immer EINEN Befehl für EINE Operation gibt.
Der Befehl wird wie immer 3Zeichen lang sein.
Dadurch wird das Ganze etwas übersichtlicher.

wie crazy horse geschrieben hat
wird dass dann so funktionieren:

-Initialisierungsbyte (Ein Byte mit der "IP" des Slave)
  Dann kann man mehrere Slaves an einen UART bus hängen,
  und es gibt noch tolle initialisierungsmöglichkeiten...
-Der angesprochene Slave antwortet mit seiner eigenen IP.(1Byte)
-Befehl 3 String Zeichen...
-Antwort: Ok-Byte bzw. Fehlercode (1 Byte)
-Eventuelle Parameter z.B. bei Servos den neuen Wert, wieder
  als 1 Byte.
-Antwort: Done-Byte bzw. Fehlercode (1 Byte)

Das ist viel einfacher.

Einigen wir uns Darauf: Ich schreibe das Protokoll um und teste es
dann ausführlichst. Wenn der Fehler wieder auftritt, werde ich diesen
Thread weiterschreiben...

OK?

Liebe Grüße,
Tobi

von Tobi (Gast)


Lesenswert?

wenn du schonmal umbaust lass doch auch die 3 zeichn für den befehl weg.
ein zeichen/byte reicht und mit dem was ich oben geschrieben hatte nimmt
die übersichtlichkeit auch zu

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.