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
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]; }
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
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.
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.)
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
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
"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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.