mikrocontroller.net

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


Autor: Fichte (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:

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

Autor: Fichte (Gast)
Datum:

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


MFG: Fichte

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Befehle gibt es nicht?

Autor: Fichte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diesen

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

bzw. nichts in dieser Art.


MFG: Fichte

Autor: Chris (Gast)
Datum:

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

Autor: Fichte (Gast)
Datum:

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

Autor: Martin S. (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:

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

Autor: Fichte (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bekommst du Hex-Zahlen in Form von ASCII-Zeichen, also einen String?

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

Autor: Fichte (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:

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

Autor: Fichte (Gast)
Datum:

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

Autor: Azar Tahossein (Gast)
Datum:
Angehängte Dateien:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Wegstabenverbuchsler (Gast)
Datum:

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

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

Autor: Azar Tahossein (Gast)
Datum:

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

Autor: Laeubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist doch Eutrophie ....

Autor: Ronny (Gast)
Datum:

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

Autor: Azar Tahossein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI Ronny kannst mir sagen?
Wie Soll ich die Codes schreiben?

Autor: Ronny (Gast)
Datum:

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

Autor: Azar Tahossein (Gast)
Datum:

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

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wohing zeigt *temp?*count1?*count2?

Autor: Azar Tahossein (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ( &, |, ˆ, <<, >> ).

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Azar Tahossein (Gast)
Datum:

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

Autor: Ronny (Gast)
Datum:

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

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.