Forum: Mikrocontroller und Digitale Elektronik 2 Byte in einen wert in Codevision


von Fichte (Gast)


Lesenswert?

Hallo Leute

Ich habe eine frage ich bekomme daten zu meinen Controller gesendet
zbs.

HEX: 0x01 u. 0x10

nun möchte ich diese 2 Byte in 1 Wert bekommen wie mache ich das im
Codevision.?

Den ich muss aus den 2 Byte eine Zahl machen um sie dann zurechnen.



MFG: Fichte

von Chris (Gast)


Lesenswert?

Wieso schreibst du nicht dazu, dass es um einen C-Compiler geht?
Sowas ist nämlich Standard-C und unabhängig vom Compiler:
uint16_t umgewandelter_wert = low_byte | ((uint16_t)high_byte << 8);

von Fichte (Gast)


Lesenswert?

Ja ganz einfach, weil es diese Befehle nicht in Codevision gibt.!


MFG: Fichte

von Chris (Gast)


Lesenswert?

Welche Befehle gibt es nicht?

von Fichte (Gast)


Lesenswert?

Diesen

uint16_t umgewandelter_wert = low_byte | ((uint16_t)high_byte << 8);

bzw. nichts in dieser Art.


MFG: Fichte

von Chris (Gast)


Lesenswert?

Welchen Informationsgewinn habe ich von deinem letzten Posting? (0.0%)

Codevision ist doch ein C-Compiler, richtig? Dann kann er auf jeden
Fall den bitshift (<<) und das binäre oder (|). Das einzige, was er
also evtl. nicht kennt ist uint16_t.
Falls das der Fall ist, musst du natürlich uint16_t durch den passenden
16-Bit-Typ austauschen. Aber ich nahm an, diese kleine Transferleistung
könntest du selbst erbringen.

von Fichte (Gast)


Lesenswert?

Das mit der Bitschieberrei ist ja schön und gut und das kann auch
Codevision ((<<) u. (|)) nur leider komme ich damit nicht zurecht.

Sorry muss man den alles können.?


MFG: Fichte

von Martin S. (Gast)


Lesenswert?

@fichte

womit kommst du denn nun genau nicht zurecht? was Bitschieben bedeutet,
bzw. eine Oder-Vernüpfung;

oder wie man das anwendet

oder was sonst noch?

LAss dir doch nicht jeden Popel aus der Nase ziehen, das macht doch
keinen Spass in deienr Nase rumzustochern ....

von Chris (Gast)


Lesenswert?

> Sorry muss man den alles können.?

Nein, bis auf eine Sache: Präzise Fragen stellen.


Oben hast du geschrieben, dass Codevision keinen bitshift beherrschen
würde. Jetzt schreibst du auf einmal, dass Codevision es doch kann, du
aber nicht damit zurechtkommst. Du wirst mir bestimmt zustimmen, dass
du bisher nicht "präzise" genug für eine gute Antwort warst.

Bitshifts und binäres Oder sind die gängigen Mittel für so ein Problem.
Du solltest dir also ein C-Buch deines geringsten Misstrauens holen und
das Kapitel über Bit-Operatoren lesen. Es gibt durchaus auch andere
Methoden, auch ohne Bit-Operatoren:
uint16_t umgewandelt = lowbyte + highbyte * 256;
Nur verstehst du diese Zeile wirklich besser?

Bit-Operatoren sind nicht schwer, man muss sie nur einmal verstanden
haben. Außerdem, wie setzt du denn einzelne Flags in einem Register,
wenn nicht mit Bit-Operatoren?

von Chris (Gast)


Lesenswert?

Nachtrag:
Nur um zu zeigen, was ohne Bitoperatoren passieren kann:
http://thedailywtf.com/forums/33564/ShowPost.aspx

von Fichte (Gast)


Lesenswert?

Okay Okay

Ich komme damit nicht zurecht das ich über die USART HEX Zahlen bekomme
die ich rechnen muss das ist alles Okay weil pro HEX Zahl immer ein
wert. Aber das Problem ist ich bekomme 1 Zahl in 2 HEX Zahlen also muss
ich 2 HEX Zahlen in eine Umwandeln bzw. muss aus jeweils 2 einzelnen HEX
Zahlen 1 machen wie zbs.

HEX: 0x01 u. 0x10

Ich brauche aber 0x0110 als ganze Zahl.

Das heisst ich muss beide zusammen fassen aber wie.
Und damit komme ich nicht zurecht.!


MFG: Fichte

von Chris (Gast)


Lesenswert?

Bekommst du Hex-Zahlen in Form von ASCII-Zeichen, also einen String?

Langsam bin ich es echt leid, das alles aus dir herauszukitzeln.

von Fichte (Gast)


Lesenswert?

So um euch das mal zuzeigen was ich von dem Steuergerät bekomme.

http://www.efichte.de/hex.htm

So also ich bekomme nur die werte gesendet und nichts weiter ich muss
sie mir in einen Decimalwert Wandeln bzw. um damit zurechnen also
Zahlen von 0-255.
Da aber einige Zahlen über die 255 gehen sendet mir das Steuerteil 2
HEX Werte um auf eine grössere Zahl zukommen.

MFG: Fichte

von Chris (Gast)


Lesenswert?

Das Steuerteil sendet dir bestimmt keine Hex-Werte. Du siehst
Hex-Werte, weil du dir die Daten in einem _Hex_-Editor ansiehst. Klingt
doch logisch, oder?


Du empfängst (wie du schon geschrieben hast?) einfach Zahlen von 0-255,
sprich: Bytes.
Mit diesen Bytes kannst du nun genau das machen, was ich schon oben
versucht habe zu erklären, nämlich zwei Stück in einen uint16_t
umwandeln.

von Fichte (Gast)


Lesenswert?

@Chris

Ich habs verstanden. Wunder dauern eben etwas Länger habs dann so
Gelöst.


unsigned long wert1, wert2;

wert1= getchar(); //High Byte Lesen
wert2= getchar(); //Low Byte Lesen
Ergebnis = wert1<<8 | wert2; //High Byte 8 nacht links verschieben


Ich danke euch für die Hilfe.!!!


MFG: Fichte

von Azar Tahossein (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe ein Grooßes Problem,
ich habe schön ein Programm,der Entropie berechnet.
Jetzt habe ich diese Aufgabe.
Schreiben Sie Ihr Programm zur Entropieberechnung aus Aufgabe 3 von U¨
bungsblatt 3 um, so dass es
die Entropie der Dateien auf der Basis von 4 bitWerten berechnet
anstelle von 8 bitWerten. Behandeln
Sie dabei ein 8 bit ASCII Zeichen als zwei 4 bit Zeichen.
Benutzen Sie f¨ur die Zerlegung der eingelesenen 8 bit Zeichen in 2 4
bit Zeichen lediglich Operatoren
aus der Gruppe der Bit-Operatoren ( &, |, ˆ, <<, >> ).
Ich habe mir gedacht,ich schreibe das so wie es in Dateianhang
vorhanden ist,aber es gibt riesige Probleme.Bitte
HILFFFFFFFFFFFEEEEEEEEEE

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Entropie muss man nicht berechnen, sie nimmt sowieso zu.

von Wegstabenverbuchsler (Gast)


Lesenswert?

"Die Entropie muss man nicht berechnen, sie nimmt sowieso zu."

so wie der Umfang von meinem Bauch ???? FG

von Azar Tahossein (Gast)


Lesenswert?

Habe gefragt wie man ein 8 bit ASCII CODE mit Hilfe von BITOPERATOREN in
form 2 4 bit schreiben.
Weiss jemand,wie es möglich ist?

von Laeubi (Gast)


Lesenswert?

das ist doch Eutrophie ....

von Ronny (Gast)


Lesenswert?

Auch wenn du dich an ein anderes Topic anhängst...

Das geht mit maskieren (per logisch UND & ) und Bitshiften.Einfach die
Bits die du brauchst maskieren.Und bei den höherwertigen 4 Bit musst du
selbige natürlich noch nach rechts schieben.

von Azar Tahossein (Gast)


Lesenswert?

HI Ronny kannst mir sagen?
Wie Soll ich die Codes schreiben?

von Ronny (Gast)


Lesenswert?

Indem du dich in einem C Buch deines Vetrauens über die Funktionsweise
der bitweisen operatoren (&,|,>>,<<) schlau machst und danach versuchst
aus (>>,&) das gewünschte zu erreichen.

von Azar Tahossein (Gast)


Lesenswert?

Hi Ronny,
ich habe es so geschrieben:


 //Mit diese Funktion versuchen wir ein 8 bit code in 2 4 bit zu
schreiben
 double seperate_counts(unsigned long *counts)

{
    int i;
    unsigned long *counts1,*counts2,*temp;

    for ( i = 0; i < 256; i++ )
    {
        temp[i]=counts[i];                  //save counts[i] in
temprory file(damit man das nicht verliert
        counts1[i]=(counts[i]&11110000);    //bitmask=11110000 um nur
vier erste bits gleiche Werte haben und alles anders Null wird
         counts1[i]>>=4;                     //4 bit nach Rechts
schieben
  counts2[i]=(temp[i]&0x0011111);     //bitmask=00001111 um nur zwite 4
bit erhalten bleiten
    }
}

Aber Leider taucht ein RUNTIME error auf.
Bis jetzt vielen Dank für deine Hilfe.
Azar

von Ronny (Gast)


Lesenswert?

Wohing zeigt *temp?*count1?*count2?

von Azar Tahossein (Gast)


Angehängte Dateien:

Lesenswert?

Hi Ronny,
Ich habe dir ganze progame geschickt.
Das ist meine Aufgabe:
Schreiben Sie Ihr Programm zur Entropieberechnung aus Aufgabe 3 von U¨
bungsblatt 3 um, so dass es
die Entropie der Dateien auf der Basis von 4 bitWerten berechnet
anstelle von 8 bitWerten. Behandeln
Sie dabei ein 8 bit ASCII Zeichen als zwei 4 bit Zeichen.
Benutzen Sie f¨ur die Zerlegung der eingelesenen 8 bit Zeichen in 2 4
bit Zeichen lediglich Operatoren
aus der Gruppe der Bit-Operatoren ( &, |, ˆ, <<, >> ).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Bereits der Aufruf von read_counts() geht in die Hose; übergeben wird
als zweiter Parameter ein Array mit 16 Elementen, die Funktion aber
beschreibt eines mit 256 Elementen.

seperate_counts wiederum schlägt aus den von Ronny angesprochenen
Gründen fehl.

Statt counts1 und counts2 lokal zu deklarieren, sollten diese als
Pointer an die Funktion übergeben werden, und temp sollte als Array und
nicht als ein ins Leere verweisender Pointer deklariert werden.

Du solltest dringendst mehr über das Programmieren in C lernen.


Literaturhinweis:

Kernighan & Ritchie, Programmieren in C, Hanser Verlag, zweite Auflage

Nein, mit C++ hat das alles nichts zu tun.

von Azar Tahossein (Gast)


Lesenswert?

ZITAT:

Bereits der Aufruf von read_counts() geht in die Hose; übergeben wird
als zweiter Parameter ein Array mit 16 Elementen, die Funktion aber
beschreibt eines mit 256 Elementen.


Das wird nur verursachen,dass viele schon vorher definierte
Arrayelemente im Speicher leer bleiben.

von Ronny (Gast)


Lesenswert?

Man kann sehrwohl ein Array der Grösse 256 mit 16 Werten beschreiben,das
man aber nicht 256 Werte in eines der Grösse 16 quetschen kann sollte
eigentlich auch ohne C Kenntnisse ersichtlich sein.

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.