Hallo, die Situation ist folgende: Ich habe einen 12 bit ADC der mir einen Wert ausließt (Datentyp ist unsigned short int). Jetzt möchte ich diesen Wert mittels Cortex M3 in 3 Nibble umwandeln die jeweils 4 bit groß sind. Soll heißen: Wenn der ADC einen Wert von 23 ausließt soll im 1 Nibble 0000, im 2. Nibble 0010 und im 3. Nibble 0011 stehen. Weiters sollen die einzelnen Werte der Nibble in einem Array zur bitweisen Weiterverarbeitung stehen. Also: array[0]=0; array[4]=0; array[8]=0; array[1]=0; array[5]=0; array[9]=0; array[2]=0; array[6]=1; array[10]=1; array[3]=0; array[7]=0; array[11]=1; Falls der Wert vom ADC größer als 999 ist,z.B.: 3201, interessieren mich nur die ersten 3 Stellen. (die Zahlen 3,2 und 0). Hat jemand vielleicht eine Idee wie man das lösen kann? :)
Das ist totaler Unfug. Mach dir eine Union aus einem unsigned short int und einem bitfield, dann kannst du wunderbar auf die einzelnen Bits zugreifen. Wenn du das nicht kannst: Lies ein C-Buch!
Bisschen shiften und maskieren und gut ist.
Gottfried V. schrieb: > Jetzt möchte ich diesen Wert mittels Cortex M3 in 3 Nibble umwandeln die > jeweils 4 bit groß sind. > > Soll heißen: Wenn der ADC einen Wert von 23 ausließt soll im 1 Nibble > 0000, im 2. Nibble 0010 und im 3. Nibble 0011 stehen. Bist du sicher, dass du BCD Arithmetik haben willst? Ist an dieser Stelle mehr als ungewöhnlich. > Weiters sollen die einzelnen Werte der Nibble in einem Array zur > bitweisen Weiterverarbeitung stehen. > Also: > > array[0]=0; array[4]=0; array[8]=0; > array[1]=0; array[5]=0; array[9]=0; > array[2]=0; array[6]=1; array[10]=1; > array[3]=0; array[7]=0; array[11]=1; spätestens jetzt ist mir klar, dass du noch nicht verinnerlicht hast, wie der Zusammenhang von Bits und Bytes ist und wie man mit Bitoperationen auf einzelne Bits in einem Byte zugreift. > Hat jemand vielleicht eine Idee wie man das lösen kann? :) Schritt zurücktreten und erst mal das eigentliche Problem schildern, anstatt das du nachfragst wie du eine untaugliche Lösungsstrategie implementieren sollst.
Mal ganz davon abgesehen, ob die BCD-Darstellung wirklich so sinnvoll
ist ....
Ich würde das array schon anders anordnen oder gar ein 2D array
benutzen:
array[0], array[1], array[2] => zahl 1
array[3], array[4], array[5] => zahl 2
...
oder
array[0][0], array[0][1], array[0][2] => zahl 1
array[1][0], array[1][1], array[1][2] => zahl 2
...
Für den ersteren Fall ergibt sich dann in pseudo-code mit zahl=ADC-Wert:
i=0;
teiler = 1000
repeat until i==2 // wenn i==2 ist wurden 3
// stellen gefunden
array[i]=zahl/teiler // je nach i werden hier die
// 1000er, 100er, 10er oder
// 1er stellen extrahiert
zahl=zahl%teiler // als zahl interessiert nur
// noch der rest
teiler=teiler/10 // vorbereiten von teiler für
// die nächste loop
// 1000=>100, 100=>10, 10=>1
if teiler==100 && array[i]==0 continue // wenn der teiler 100 ist,
// also die 1000er stelle
// extrahiert wurde, dann
// geht es nur zur nächsten
// Stelle,
// wenn die 1000er stelle
// nicht Null war
i++
Macht natürlich Sinn daraus ne Funktion zu machen ([i] ersetzen durch
[i+offset]) mit der man den array-offset oder die 2. dimension übergeben
kann.
"Gerd (Gast)
------------------------------------------------------------------------
--------
Bisschen shiften und maskieren und gut ist."
Das würde mich mal interessieren, zeig doch mal!
ups ... i==3 vielleicht sollte ich mich doch mal anmelden, damit ich solche typos im post noch ändern kann ;o)
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.