mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik nur 4 Bit eines Bytes ändern (Nibble)


Autor: P. Ostrich (neop13)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich möchte CAN Daten Abgreifen...
Nun ist das Problem das meine Information in vogender Form vorliegt

2 Signale

1.:
Byte 0 Bit 0-7 +
Byte 1, Bit 0-3

2.:
Byte 1 Bit 4-7 +
Byte 2, Bit 0-3

Siehe Bild

jetzt würde ich die gerne in "einer" Variablen speichern, damit ich 
diese Kenne von 12 Bit umrechnen kann und gegebenfalls verändern kann.

Danach soll die geänderte Gette gespeichert werden und dann gesendet 
werden.

Bitweises vergleichen usw klappt, aber das bekomme ich von der 
Programmierseite nicht hin.
danke

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int nData = Byte0;
nData += (Byte1 << 8);

mfg.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P. Ostrich schrieb:

> Bitweises vergleichen usw klappt, aber das bekomme ich von der
> Programmierseite nicht hin.

Bitmanipulationen

Ist eine Kombination aus UND Operationen, ODER Operationen und Bitweisen 
Schieben mittels >> bzw. <<
Da musst du durch. In der µC Programmierung ist das tägliches Brot.
Wenn du unsicher bist, dann einfach auf dem Papier die Operation 
durchführen, sich beobachten was man gemacht hat und das ganze dann in 
Code fassen.

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kenne
> Gette

Anette ?

Was ist nun an
byte0|((byte1&0x0F)<<4)
und
(byte2<<4)|(byte1<<4)
so schwierig ?

Vielleicht weil du nicht C sondern BASCOM programmierst ?
Woher sollen wir das aus deiner dürftigen Beschreibung,
aus der man selbst MSB und LBS schätzen muss, erkennen ?

Autor: ETTutorials (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:
> int nData = Byte0;
>
> nData += (Byte1 << 8);
>
>
>
> mfg.

Jetzt mal vollständig:

int nData0 = Byte0;
nData0 += ((Byte1 & 0x0F)<< 8);

int nData1 = ((Byte1 & 0xF0)>> 4);
nData1 += (Byte2 << 8);


MaWin schrieb:
>> Kenne
>
>> Gette
>

Was das sein soll, würde ich auch gerne wissen

mfg.

Autor: P. Ostrich (neop13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:
> int nData0 = Byte0;
> nData0 += ((Byte1 & 0x0F)<< 8);

da wer ich nich schlau raus.

1. schreibst du byte 0 und die var nData0 = ok
2. schaust du was in Byte1 steht (mit (Byte1 & 0x0F)) = ok
3. verschiebst du alles  um 8 stellen nach links (also ist es 0000 0000) 
= warum?
4. addierst du nData0 mit dem Ergebnis 0000 0000 und schreibst es dann 
in nData0.

verstehe ich das von der Programmierung her nicht? Denn so macht das 
keinen Sinn für mich.
Sorry


Aber vielen Dank für eure Mühe...

P.S.:
es kommt ja noch dazu, das ich die Daten aneinander hängen muss.

Sprich:
Byte 0 = 1212 3434
Byte 1 = 5656 7878

das muss nachher so stehen: 7878 1212 3434

denn das ergibt eine Zahl die ich brauche.

Und genau anders rum muss ich das auch so mit neuen werten schreiben.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P. Ostrich schrieb:
> Byte 0 = 1212 3434
>
> Byte 1 = 5656 7878

Das sind ja nun niemals nicht Bytes.

Ein Byte ist 8 Bit lang und hat einen Wertebereich von 0 - 255. Oder in 
Hex 0x00 - 0xFF.

P. Ostrich schrieb:
> Thomas Eckmann schrieb:
>
>> int nData0 = Byte0;
>
>> nData0 += ((Byte1 & 0x0F)<< 8);

wenn du in diesen Codefetzen in Byte0 = 0x55, und in Byte1 = 0x0A 
schreibst, dann ist nData0 == 0xA55. Und das ist doch genau das was du 
haben willst. Oder nicht?

mfg.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P. Ostrich schrieb:

> verstehe ich das von der Programmierung her nicht?

offenbar, denn ...

> Denn so macht das
> keinen Sinn für mich.

... für die meisten hier macht das absolut Sinn.
Ganz im Gegenteil. Das ist noch nicht mal besonders schwer, wenn man 
seine Grundlagen zum Thema Maskieren, Bitschieben und DAtentypen gelernt 
hat.

> 3. verschiebst du alles  um 8 stellen nach links (also ist es 0000 0000)

Nö ist es nicht.
In C wird immer mindestens in int gerechnet. Also ist das auf Bitebene 
eben nicht 0000 0000, sondern die 8 Bit um 8 Bit nach oben geschoben

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Neop13,

ich habe mir mal alle Deine Beiträge hier durchgelesen und bin mir
sicher, Du solltest Dir ein anderes Hobby suchen. Sowas von blind, der 
Typ - solche muss man schon suchen.
Also ehrlich züchte lieber Radieschen oder sowas, da haste sicher mehr 
Erfolg. Sorry. Aber das mußte mal gesagt werden. Hat ja schließlich 
keinen Sinn, eine Schnecke für einen Sprint zu trainieren.

Schönen Abend noch,

- Frank

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P. Ostrich schrieb:
> verstehe ich das von der Programmierung her nicht? Denn so macht das
>
> keinen Sinn für mich.
>
> Sorry

Versuch's mal so:

C-BuchKaufen();

while (!AllesVerstanden)
{
   C-BuchLesen();
}

if (ImmerNochWasUnklar)
{
   ImForumFragen("Wie geht das jetzt genau?");
}

mfg.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:
> C-BuchKaufen();

Mist!

C_BuchKaufen();

mfg.

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:
> if (ImmerNochWasUnklar)
> {
>    ImForumFragen("Wie geht das jetzt genau?");
> }

puhh.. zum Glück "unreachable"

Autor: P. Ostrich (neop13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:
> P. Ostrich schrieb:
>> Byte 0 = 1212 3434
>>
>> Byte 1 = 5656 7878
>
> Das sind ja nun niemals nicht Bytes.


Sind es nicht... komisch

12123434 = 8 Zeichen = 8 Bit = 1 Byte
1212 = 1. Nibble, 3434 = 2. Nibble --> 2 Nibble = 1 Byte



P.S.: Danke für eure Kommentare. Man dachte echt hier ist ein Forum wo 
nicht. Solche Ego Spinner rumhängen sondern auch Platz für neulinge oder 
nicht so erfahrene ist. Aber das zeigt ja, das ihr als GAST eingeloggt 
seid.

Sicher ist das  ich besonders schwer, aber manchmal hängt man an einer 
blöde simplen stelle und kommt nicht weiter.

Danke allen die mir geholfen haben

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P. Ostrich schrieb:
> 12123434 = 8 Zeichen = 8 Bit = 1 Byte

01011100 Das ist ein Byte!

mfg.

Autor: P. Ostrich (neop13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast recht.

war auch zur Verdeutlichung gedacht, amit ihr genauer seht, was ich 
brauche.

Sorry hab ich nicht klar genug ausgedrückt

Autor: HolgerT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, wenigstens die Überschrift ist ja passend gewählt. Aber die 
Programmiersprache, in der Du das umsetzen willst, hast Du uns immer 
noch nicht verraten.

P. Ostrich schrieb:
> 12123434 = 8 Zeichen = 8 Bit = 1 Byte
> 1212 = 1. Nibble, 3434 = 2. Nibble --> 2 Nibble = 1 Byte

Du meinst wahrscheinlich das Richtige, drückst Dich aber falsch aus. 8 
Zeichen können nicht 8 Bit sein, schreib es doch so:

76543210 => 1 Byte
7654 1. Nibble, 3210 2. Nibble.

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Bitmanipulationen

OT: Nur der Vollständigkeit halber - diesen Artikel gibt es nicht... du 
meintest vermutlich diesen:

Bitmanipulation

Nur falls hier jemand nochmal drüber stolpert und sich wundert, dass der 
o.g. Link in einen leeren Artikel führt.

- gerd

Autor: P. Ostrich (neop13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja enau. nur blöd ausgedrückt. danke Holger.
Wöchte das gerne in C Programmieren.

Es handelt sich hier um Daten aus eine CAN-Botschaft.

Autor: Andreas H. (andreas_h16)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

falls C, wie wärs mit Bitfelden:
union
{
  struct
  {
    unsigned char byte1_nibble1:4;
    unsigned char byte1_nibble2:4;
    unsigned char byte2_nibble1:4;
    unsigned char byte2_nibble2:4;
  } n;
  unsigned char byte1;
  unsigned char byte2;
} value;

Da kannst du wahlweise auf nibbles, wie auch auf bytes zugreifen.

Alternative als
typedef union { ... } t_value;
 und
t_value uCAN;
.

MfG,
Andreas

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P. Ostrich schrieb:
> P.S.: Danke für eure Kommentare. Man dachte echt hier ist ein Forum wo
> nicht. Solche Ego Spinner rumhängen sondern auch Platz für neulinge oder
> nicht so erfahrene ist. Aber das zeigt ja, das ihr als GAST eingeloggt
> seid.
>
> Sicher ist das  ich besonders schwer, aber manchmal hängt man an einer
> blöde simplen stelle und kommt nicht weiter.

Du hilfst aber uns nicht dir helfen zu können.
1. Es würde Sinn machen Deine Fragen nochmal vor dem Post durchzulesen 
da man manchmal nicht weiß was Du willst
2. Du hast immer noch nicht gesagt was denn jetzt
>> Kenne
>> Gette
sein soll
3. Hast Du dir jetzt mal die Bitoperationen im oben genannten Link 
angesehen?
4. Von welcher Programmiersprache reden wir eigentlich?

So, ich bin gespannt auf Deine Antworten

Autor: P. Ostrich (neop13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi U.R. Schmitt
HAtte die frage nicht auf mich bezogen ... sorry

P. Ostrich schrieb:
> Siehe Bild
>
> jetzt würde ich die gerne in "einer" Variablen speichern, damit ich
> diese Kenne von 12 Bit umrechnen kann und gegebenfalls verändern kann.
>
> Danach soll die geänderte Kette gespeichert werden und dann gesendet
> werden.

damit ich diese kenne und von 12 Bit umrechnen kann.

"Gette" Sollte "Kette" heißen

Also zur verdeutlichung:
es ist so, das diese 12  Bit lange Kette für einen Wert steht.
z.B. 0x1001 0100 1010 = 2378dez --> 23,78°C

und die habe ich 2mal. Stehen also in 3 Byte (siehe Bild oben).
Ich muss dieses Ergebnis durch eine Korrektur laufen lassen und dann in 
gleicher weise weiter schicken.
z.B. 24,36°C = 2436 --> 0x1001 1000 0100

Aber das mit dem abgespeicherten Nibbles in Bitfeldern klingt gut... da

Ist ein wenig schwierig zu erklären

werde ich mal mehr zu lesen.
Danke

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey P. Ostrich,

liest du Dir jemals durch, was Du hier für einen stilistischen Blödsinn 
postest. Ich finde es unverschämt und respektlos gegenüber denen, die 
sich hier bemühen Dir zu helfen (obwohl das wohl sowieso zwecklos ist).
Es fehlen Buchstaben, es sind Buchstaben vertauscht, Sätz sind keine 
oder enden im nichts. Das ist unerträglich und sollte damit quittiert 
werden, dass Dir keiner mehr antwortet, bis Du Dir mehr Mühe gibst.

- Frank

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P. Ostrich schrieb:

> Aber das mit dem abgespeicherten Nibbles in Bitfeldern klingt gut... da

Na, ja

Sag bloss, du hast die Funktionalität immer noch nicht hingekriegt!
Das ist doch auf dem Niveau von Bitmanipulations-Anfänger-Pipifax.

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:
> int nData0 = Byte0;
> nData0 += ((Byte1 & 0x0F)<< 8);
>
> int nData1 = ((Byte1 & 0xF0)>> 4);
> nData1 += (Byte2 << 8);

P. Ostrich schrieb:
> 3. verschiebst du alles  um 8 stellen nach links (also ist es 0000 0000)
> = warum?

Wenn ich das so lese denke ich, dass der TO deshalb nicht dahinter 
kommt, weil er von einer 8 bit Variablen ausgeht (int nData0) - was sie 
zumindest bei einem avr-gcc nicht ist sondern halt 16 bit. Vermutlich 
hängt das Verständnis da?

- gerd

Autor: Andreas H. (andreas_h16)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Sag bloss, du hast die Funktionalität immer noch nicht hingekriegt!
> Das ist doch auf dem Niveau von Bitmanipulations-Anfänger-Pipifax.

So dumm war die Frage jetzt auch nicht. Jeder fängt mal klein an. Und um 
einmal ein Bit zu maskieren eignen sich tatsächlich die bitwise- und 
shift Operatoren besser als Bitfelder.

Aber um ein Kommunikationsprotokoll sauber zu implementieren, ist für 
mich eine Bitfeld-Definition der PDUs im Header-File (z.B. snmp_api.h 
der CMU) immer noch am einfachsten zu kommentieren und zu verstehen.

Aber über Geschmack lässt sich am besten streiten, besonders wenn es um 
Programmierstile geht.

MfG, Andreas

Autor: P. Ostrich (neop13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank schrieb:
> Ich finde es unverschämt und respektlos gegenüber denen, die
> sich hier bemühen Dir zu helfen (obwohl das wohl sowieso zwecklos ist).
> Es fehlen Buchstaben, es sind Buchstaben vertauscht, Sätz sind keine
> oder enden im nichts.

Ok
Es tut mir leid. Es liegt wohl daran. das ich es nebenbei geschrieben 
habe und auch ständig unterbrochen werde. Ich werde mir mehr mühe geben 
deutlicher zu schreiben und auch langsamer zu tippen, damit keine 
Rechtschreibfehler entstehen. Aber respektlos usw. ...? Ich wurde als 
doofer Anfänger und unfähig abgestempelt. Und ich habe nur gesagt das es 
mir leid tut, dass ich das nicht von Geburt an schon konnte und noch 
lernen muss. Ich will keinem zu nahe treten. Aber dann Antworte mir doch 
einfach nicht, wenn du dich angegriffen fühlst.

vielleicht sollte der Thread geschlossen werden will keinen Ärger machen 
und haben. Entschuldigt

P.S.:
> Es fehlen Buchstaben, es sind Buchstaben vertauscht, Sätz sind keine
> oder enden im nichts.

Es heißt "Sätze". Aber passiert mal ne ;-)

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P. Ostrich schrieb:
> Und ich habe nur gesagt das es
>
> mir leid tut, dass ich das nicht von Geburt an schon konnte und noch
>
> lernen muss.

NIEMAND hat das mit der Muttermilch aufgesaugt.
Und JEDER ist schon mal bei Sachen nicht weitergekommen, wo sich alle 
anderen nur an den Kopf gefasst haben.
Aber so ein bisschen Bitgefriemel dauert nicht eine Woche, bis man es 
versteht. Es sei denn es fehlen die Grundlagen.

mfg.

Autor: P. Ostrich (neop13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja haste recht. Ich sitz halt nicht ständig davor. Ist ein Projekt, was 
ich erstmal hinten dran hängen musste.
danke

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.