www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Telegramm


Autor: Severin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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];

}

Autor: Severin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Severin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Marcus M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Severin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marcus

Danke Du hast mir seh geholfen.

Gruss Severin

Autor: Severin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Friedrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Severin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.