Forum: Mikrocontroller und Digitale Elektronik Protokoll-Design


von Ricki B. (Gast)


Lesenswert?

Ahoi,

ich möchte gerne ein Protokoll zur seriellen Kommunikation zwischen zwei 
uC erstellen.

Ein Datenpaket soll dabei Status- und Messwerte enthalten.
Wichtig ist, dass ein bereits festgelegtes Start- und Endebyte 
eingehalten wird, da die Kommunikation von einem dritten Gerät überwacht 
wird.
Letzteres interessiert sich allerdings nicht für die Nutzdaten, sondern 
nur für Start und Endezeichen.

Das Zeichen für Start ist 0xE0,
Zeichen für das Telegramende ist 0xFA

Die Messwerte, die übertragen werden, haben einen Höchstwert von 16000 
und werden zur Übertragung in High und Low Byte aufgeteilt.

Meine Herausforderung ist nun sicherzustellen, dass die Start o. 
Endezeichen
keinesfalls in den Nutzdaten auftauchen.

Da ich einen Wert von 16000 noch mit 14 Bit abbilden kann, habe ich mir 
überlegt, dass man ja bei der Aufteilung in Hi/Lo Byte nur mit ersten 7 
Bit eines jeden Nutzbytes arbeiten könnte und das MSB immer auf 0 zu 
halten.

Da Start und Ende nämlich jeweils das MSB auf 1 haben, wäre so doch 
eigentlich schon sichergestellt, dass es nicht zu Fehlinterpretationen 
kommen kann.

Oder binär gesprochen:
1
Start: 0xE0 = 11100000
2
Ende:  0xFA = 11111010
3
4
Nutzdaten-Beispielwert: dec. 12500
5
Wäre eigentlich Hi=00110000 Lo=11010100
6
7
Geht man nun davon aus, dass man pro Nutzbyte aber nur 7 Bit nutzen darf,
8
würde die 1 aus dem MSB des Low-Bytes in das LSB des High-Bytes verschoben... und mit ihr natürlich der Inhalt des High-Bytes um eine Stelle nach links.
9
10
So käme dann folgendes heraus:
11
12
Hi=[0]1100001 Lo=[0]1010100

Soweit die Idee.

Nur wie rechne ich einen Integer in High/Low Byte um, ohne das MSB dabei 
anzufassen... und wie rechne ich es wieder zurück in ein Int?

Kann mir da jemand helfen?

Vielen Dank, Rick

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Geht man nun davon aus, dass man pro Nutzbyte aber nur 7 Bit nutzen
> darf,
> würde die 1 aus dem MSB des Low-Bytes in das LSB des High-Bytes
> verschoben... und mit ihr natürlich der Inhalt des High-Bytes um eine
> Stelle nach links.

Und? Wo ist das Problem?

Wenn der zu transportierende Wert definitiv ein 14-Bit-Wert ist, dann 
kannst Du den immer in zwei 7-Bit-Werte zerlegen, und die wiederum 
jeweils in einem 8-Bit-Wert verpacken; das oberste Bit des 8-Bit-Werts 
bleibt immer Null.

von Ricki B. (Gast)


Lesenswert?

Naja, das WIE ist mein Problem.

Wie zerlege ich ein 16 Bit int, von dem nur 14 Bit genutzt werden, in 
zwei Mal 7 Bit? Und wie rechne ich das wieder zurück in ein 16 Bit int?

von Marian (phiarc) Benutzerseite


Lesenswert?

Bitshift und Masken. (Das lower byte bekommst du allein durch Maskieren, 
das upper byte, indem du deinen 14 Bit Wert um 7 Bit shiftest und 
nochmal maskierst. Die letzte Maske ersetzt ein if(wert >= 1600))

: Bearbeitet durch User
von Clemens L. (c_l)


Lesenswert?

1
Lo = Wert & 0x7f;
2
Hi = Wert >> 7;
3
4
Wert = Lo | (Hi << 7);

von Axel S. (a-za-z0-9)


Lesenswert?

Ricki B. schrieb:
> ... das WIE ist mein Problem.
>
> Wie zerlege ich ein 16 Bit int, von dem nur 14 Bit genutzt werden, in
> zwei Mal 7 Bit? Und wie rechne ich das wieder zurück in ein 16 Bit int?

Weil man solche (eigentlich) Trivialitäten den Anfängern heutzutage 
immer wieder erklären muß, hat ein freundlicher Mensch den Artikel 
Bitmanipulation in das hiesige Wiki getan. Lesen mußt du ihn aber 
schon selber ...

von Carsten M. (ccp1con)


Lesenswert?

Ein bisschen mehr Verständnis - Du hast auch mal angefangen!

von Pandur S. (jetztnicht)


Lesenswert?

7 bit ist etwas unhandlich. Mach ASCII Hex (2byte->4 char), BCD(14bit->5 
char), oder binaer (16bit->2 byte).

von yesitsme (Gast)


Lesenswert?

> oder binaer (16bit->2 byte)

Unter Berücksichtigung der Spezialbytes... wie?

von Pandur S. (jetztnicht)


Lesenswert?

nee. Big endian oder little endian.

von yesitsme (Gast)


Lesenswert?

BTW.: man könnte auch ein "escape-Byte" einfügen

Der Code zum senden könnte so aussehen:
1
wenn d in (0xf0, 0xe0, 0xfa)
2
  sende(0xf0)
3
  sende(d & 0x7f) // msb auf 0 setzen
4
sonst
5
 * sende(b)


Und zum empfangen so:
1
d = lese()
2
wenn d == 0xf0
3
  d = lese()
4
  d = d | 0x80

von Sepp aus Hintertupfing (Gast)


Lesenswert?

Carsten M. schrieb:
> Ein bisschen mehr Verständnis - Du hast auch mal angefangen!

Nicht unbedingt!

Es kann wohl nicht zu viel verlangt sein, dass man sich zuerst selber
mal auf die Suche nach geeigneter Information macht.
Vieleicht mal den Artikel "Bitmanipulation" in das hiesige Wiki
durchlesen(wie von Axel vorgeschlagen)

Und wenn dann noch Fragen offen sind,
erst dann bei der  "Scharmintelligenz" nachfragen.

Ich habe manchmal das Gefühl dass die Gutmütigkeit so mancher
alter Hasen hier richtig ausgenützt wird.

Fragen ja, aber nicht gleich jeden Schmarrn und mit mehr Respekt bitte.

Beispiel gefällig ? (hier in Forum)

kann mit jemand sagen was |= und &= zu bedeuten hat?

oder

ich habe da eine ganze Stunde rum gegoogeld und nichts gefunden
deshalb frage ich jezt hier ...

von Leuchte, die (Gast)


Lesenswert?

> kann mit jemand sagen was |= und &= zu bedeuten hat?

Da Du nicht von Anfang an genannt hast in welcher Programmiersprache 
dies umzusetzen ist, wurde halt in sowas wie Pseudo-C in den Antworten 
geschrieben.

Schaff Dir einen Überblick was Programmiersprachen im Allgemeinen so für 
Aspekte haben.
Der entscheidende Tip hier: Operatoren.


Für Schnellmerker, welche die Anletung von $SUCHMASCHINE gellesenhaben:
- zu kurze Eingaben als Suchbegriff werden u.U. ignoriert
- zum verknüpfen von Suchbegriffe verwenden Suchmaschinen... Richtig! 
Operatoren

von Sepp aus Hintertupfing (Gast)


Lesenswert?

Leuchte, die schrieb:
> Für Schnellmerker, welche die Anletung von $SUCHMASCHINE gellesenhaben:

Du machst deinen Namen alle Ehre!

>> kann mit jemand sagen was |= und &= zu bedeuten hat?

Ich denke du hast das nicht verstanden,
hier ging es nicht um Fragen sondern um Beispiele!
(bitte den ganzen Beitrag lesen)

von Ricki B. (Gast)


Lesenswert?

sorry für die späte Rückmeldung.

Vielen Dank an Clemens für das Beispiel und Axel für den Link.
Tut mir leid, wenn dieses Thema schon oft vorkam.

Mein Problem ist meistens, dass ich auch nicht immer weiß, wonach ich 
genau suchen muss. Wenn man die Antwort kennt, oder zumindest die 
richtigen Begriffe, ist die Suche eine weniger große Herausforderung...

Wenn das Auto bei laufendem Motor klappert, könnten es die Hydrostößel 
sein. Aber um herauszufinden, dass klappernde Hydrostößel nicht schlimm 
sind muss man erstmal wissen, das es überhaupt Hydrostößel gibt und das 
sie klappern...

Ich weiß garnicht, wie vielen besorgten Werkstattkunden ich schon 
erklärt habe, was das Klappern verursacht. Das die Anzahl der fragenden 
Kunden dadurch jemals zurückgehen wird, glaube ich allerdings nicht.

Danke an alle, die Ihr Wissen teilen und anderen bei Ihren Problemen 
weiterhelfen. Ich bin sicher, jeder hat so seine Spezialgebiete und 
jemand der kaum Ahnung von Bitmanipulation hat (z.B. ich) und deswegen 
eine bestimmte Frage zum 1000sten Mal stellt, kann dafür vielleicht mal 
im Bereich KFZ Elektronik aushelfen...

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.