Forum: Mikrocontroller und Digitale Elektronik 32 bits schieben


von Joachim .. (joachim_01)


Lesenswert?

Ich hab hiern merkwürdiges Phänomen. Scheinbar liegt's am Datentyp.
Kann es sein, daß man default in ein uint32_t auf nem 8-bit-System keine 
höhern Stellen als 14 einschieben kann? Es sieht bereits bei der 15. 
Stelle so aus als ob es als ein Vorzeichenbit erkannt wird und alle Bits 
log. 1 werden. Oder was ist da los? Muß ich den Compiler anders 
einstellen? Big endian?

Beispiel:
1
C-Code
2
void driveVFD (uint32_t data)  {
3
  uint8_t    i;
4
5
  for(i=0;i<32;i++) {
6
    if (((data>>i)&0x01) == 1)
7
    // bits schieben    
8
  }  
9
10
11
12
uint32_t val = 0;
13
14
val = 0x40000002;  //ok
15
val = 0x40000000 | 1 << 5;   //ok
16
val = 0x40000000 | 1 << 14;   //ok
17
val = 0x40000000 | 1 << 15;   //Schrott, bit 15..31 high
18
val = 0x40000000 | 1 << 31;   //Schrott, bit 15..31 high
19
20
driveVFD (val);

von mrc (Gast)


Lesenswert?

versuch mal das:
val = 0x40000000 | ((uint32_t)1 << 31);

klappt es damit?

von xyz (Gast)


Lesenswert?

bei dir wird vor der Zuweisung zu val als 32bit Wert intern mit 16bit 
signed gerechnet.

Lösung: typcast wie (uint32_t)1 << x

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Oder so:
1
val = 0x40000000 | 1UL << 31;

von Joachim .. (joachim_01)


Lesenswert?

Jungens, ihr seid genial.

((uint32_t)1 << 31)
und
1UL << 31
funktioniert.

Danke!

von Matthias L. (Gast)


Lesenswert?

Wobei, unabhängig von Deinem Shiebeproblem, würde ich das über eine 
Maske machen:
1
(data>>i)
die mit jedem Schleifenducrhlauf eins weitergeschoben wird.

von Falk B. (falk)


Lesenswert?


von Joachim .. (joachim_01)


Lesenswert?

Klar, mach ich auch. Hab n Feld in dem für ne 14-Seg-Anzeige die 
Buchstaben und Segmente hinterlegt sind.
Jetzt muß ich die Anzeige noch flimmerfrei multiplexen. Aber wir, d.h. 
das Forum und ich bekommen das auch noch hin.

von Wilhelm F. (Gast)


Lesenswert?

Joachim ... schrieb:

> Ich hab hiern merkwürdiges Phänomen. Scheinbar liegt's am Datentyp.
> Kann es sein, daß man default in ein uint32_t auf nem 8-bit-System keine
> höhern Stellen als 14 einschieben kann?

Nonsens. Auf dem 8051 machte ich sowas auch. Man kann auch nicht nur 
schieben, sondern auch einen Ring gestalten.

Mit diesem einzelnen Schiebebefehl auf einem 8-Bitter kann man auch mal 
an die Laufzeit denken, denn der Compiler produziert daraus schon eine 
schöne Stange Assemblercode. Aber das ist bei Arithmetik meistens so, 
bei Mehrbyte-Rechnereien (Multiplikation und Division) noch viel 
schlimmer.

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.