Forum: Mikrocontroller und Digitale Elektronik Telegramm


von Severin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe ein Problem, ich bekomme ein Diagramm (siehe Dateianhang, so
sieht das Telegramm ungefähr aus, dass ich enpfange).

Ich weiss nicht wie ich dieses Telegramm auswerten muss um an die
Befehle zugelangen, dass ich dann entsprechend handeln kann.

danke.

Gruss an alle

von Marcus M. (Gast)


Lesenswert?

Hallo,

IMHo sieht das doch relativ einfach aus.
Die ersten beiden Bytes (Word bzw. int) sind die Adresse, die beiden
nächsten Bytes das Commando, das fünfte und sechse die Daten und zum
Schluss die Prüfsumme.
Auswertung irgendwie so - UNGETESTED!!! -:


typdef struct {
  int address;
  char command_type;
  char command_section;
  int parameter;
  int chk_sum;
}  rec;


unsigned char Empfang[4];
rec recevied;

void translate (void) {
  for (unsigned char i = 0; i < 7; i++)
   while (UART_RECEIVED)
    Empfang[i] = UDR;
  }
  received.address = (Empfang[0] << 8) | Epmfang[1];
  received.command_type = Empfang[2];
  received.command_section = Empfang[3];
  received.parameter = (Empfang[4] << 8) | Epmfang[5];
  received.chk_sum = (Empfang[6] << 8) | Epmfang[7];

}

von Severin (Gast)


Lesenswert?

Hallo.

Danke viel mal.
Ich versuche dies mal umzusetzen und zu testen.


Ist UART_RECEIVED eine Variable die du deklariert hast?
Oder ist das der Interrupt?

   while (UART_RECEIVED)
    Empfang[i] = UDR;


Wiso dividirst oder verschiebst du "Empfang[..]" mit "8"?

Danke für deine schnelle Antwort.

Gruss Severin

von Marcus M. (Gast)


Lesenswert?

Hallo Severin,

UART_Receive ist ganz einfach ein Platzhalter, für die Überprfung des
UART-Statusregisters auf Datenempfang. Sonst nix.
Ich weiß leider nicht welchen Prozessor Du benutzt und welchen
Compiler.

Warum ich mit 8 verschiebe (nicht dividiere!)?
ich gehe davon aus das die Bytes MSB first übertragen werden. Somit ist
das erste Byte das obere des Integerwertes (Int hat 2 Bytes). Um nun das
obere Byte des Integers zu füllen schiebe ich das empfangene Byte um 8
Bits nach oben und verknüpfe es anschließend odermäßig mit dem unteren
Byte.

Gruß Marcus

PS: Das verschieben um 8 setzt der Compiler u.U. anders um, als das
Multiplizieren.

von Severin (Gast)


Lesenswert?

hallo.

danke.

ich benütze:
- ImageCraft IDE ICC430 und NoICE430 Debugger

Spielt es eine Rolle ob man diese "Auswertung" direkt in der UART.c
macht, oder kann diese "Auswertung" auch in main.c stehen?

Oder würdest Du eine neue Unit machen, und dort auch das erkennen der
Befehel programmieren.

(Sorry, das ich so "blöde" Fragen stelle, ich bin vor 2 Wochen auf C
umgestiegen und habe auch dann begonnen Mikrocontroller zu
programmieren, ich bin erst mit meinem neun Arbeitsplatz in diese Welt
gekommen.)

von Marcus M. (Gast)


Lesenswert?

Hallo Severin,

erstmal in C ist es vollkommen wurscht, ob Du eine neue Funktion oder
eine neue Datei anlegst. Es geht sich dabei nur um eine sinngemäße
Zuordnung. Unter C++ ist das ganz anders, da heißt das Klasse und ist
eine geschlossene Gemeinschaft.
Globale Variablen (allle Variablen die Außerhalb einer Funktion
deklariert sind) können immer von überall aus aufgerufen und verändert
werden.
Wenn Du Dir den assemblierten  Code anschauen würdest, würdest Du
feststellen, das man dort nicht mehr feststellen kann, ob Du einer
Funktion verwendet oder alles in main reingeschrieben hast - okay das
kann man schon noch rekonstruieren, aber so genau will ich hier nicht
werden -.
Ich benutze immer dann eigene Funktionen wenn das ganze ein
abgeschlossener Funktionsbereich ist oder sich bestimmte Codesegmente
öfters wiederholen. Eine Funktion ist im Assembler nur eine
Sprungstelle, die anschließend wieder zurückspringt auf den
ursprünglichen Code. Eigene Dateiklassen verwende ich für logische
Blöcke, z.B. UART, TWI, I2C, Display, Tastatur usw. Der Hintergrund ist
die leichtere Eeintegration in neue Projekte - Rad nicht immer neu
erfinden!
Ich würde das ganze in die Datei packen, die für die Commandos
zuständig ist und mit einer entsprechenden Funktion umkleiden.

Gruß Marcus

von Severin (Gast)


Lesenswert?

Hallo Marcus

Danke Du hast mir seh geholfen.

Gruss Severin

von Severin (Gast)


Lesenswert?

Ich habe deinen vorschlag verwirklicht.


Um die Befehle ez noch zu erkennen, könnte ich jetzt ja eigändlich auch
eine Case-Schlaufe machen?



switch (received.command_type & cUPPER_BYTE)
{
    case cSEND_DATA:
      switch (received.command_section & cLOWER_BYTE)
      {
        case cSEND_Geschw:
        //
        break;

        ...

noch die Definition:
#define         cUPPER_BYTE            0xFF00
#define         cLOWER_BYTE            0xFF
#define         cSEND_DATA              0
#define         cSEND_Geschw              0

von Matthias Friedrich (Gast)


Lesenswert?

"Case-Schlaufe" ist eine interessante Kontrollstruktur :)

sorry, konnte nicht anderes....

aber zurück zu deiner frage:
das erste switch sollte so aussehen:

switch (received.command_type)
denn in der Struktur steht ja schon der command_type als unsigned char.

von Severin (Gast)


Lesenswert?

Hallo.

Schon in Ordnung ;)

Danke

Du hast die Variabel "Empfang" deklariert. Ich weiss nicht recht, wie
ich ihr Werte zuweisen soll.

Meine Werte die ich empfangen haben, sind in einem array in der UART.c
Soll ich der Variable Empfang immer 4Bit zuweisen?
Es muss ja auch irgendwie gleichzeitig zum Empfang von Daten laufen?

Diese zwei Befehle kennt mein Compiler/Prozessor nicht :S
UART_RECEIVED
UDR


Gruss Christian.

von Swen (Gast)


Lesenswert?

Ich habe auch noch eine Frage, hat zwar nicht gerade mit diesem Thread
zu tun, aber ich denke das passt ihr schon noch rein.

Ich möchte ein Telegram mit einer Checksumme von 16bit invertiert
sichern.

Wie muss ich das implementieren?

Gibt es dazu gute Tuttrials?

Danke für eure Hilfe.
Swen

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.