Forum: Mikrocontroller und Digitale Elektronik Daten shiften und umwandeln


von Olli (Gast)


Lesenswert?

Hallo, brauche dringend Hilfe bei c Programmierung.
Ich will eine festgelegte Zahl erstmal einmal nach rechts shiften. da 
habe ich auch hinbekommen:
1
unsigned char Address_B= 0x76;
2
unsigned int shift = 1;
3
4
Adr_B= Address_B >> shift; //Adr_B = 0x3B
dann will ich diese Addresse erweitern, die soll dann auf eine neue 
Addresse in das low byte gesetzt werden und in das High byte soll z.B. 
0x02 rein,  also sieht die variable dann so aus: neue_Addresse = 0x023B. 
ich weuß nur nicht wie ich es hinbekomme, habs mit Speicherallokation 
probiert aber ist irgendwie heikel.

zum Hintergrund: die Address_A soll einmal nach rechts geshiftet werden, 
damit eine neue Addresse ensteht, da ich nur 7 bit benötige und dann 
soll auf der Adresse nochmal 3 Stellen dazu kommen, die als 
Selectregister dienen sollen, damit ich in meinem code auf bestimmte 
routinen zugreifen kann.
1
unsigned short *Adr_B;
2
Adr_B  = malloc(10*sizeof(*Adr_B));
3
unsigned short *Bank_Addr_B;
4
Bank_Addr_B = malloc(16*sizeof(*Bank_Addr_B));
5
unsigned char *Bank_S_B = 0x02;
6
Bank_S_B  = malloc(10*sizeof(*Bank_S_B));
7
8
  for (j=0;j < 10;j++){
9
10
      if(j < 7){
11
        Bank_Addr_B[j] =  &Adr_B[j];//die ersten 7 stellen von Adr_B werden ins Bank_Addr_B geladen
12
      }
13
        else{
14
        Bank_Addr_B[j] =  &Bank_S_B[j-7];// dann werden hier die nächsten 3 Stellen für das Selectregister geladen
15
      }
16
17
    }
Hab nicht soviel Ahnung von C Programmierung bin aber dabei mich zu 
erweitern.

von Stefan E. (sternst)


Lesenswert?

Olli schrieb:
> Ich will eine festgelegte Zahl erstmal einmal nach rechts shiften.
> dann will ich diese Addresse erweitern, die soll dann auf eine neue
> Addresse in das low byte gesetzt werden und in das High byte soll z.B.
> 0x02 rein,  also sieht die variable dann so aus: neue_Addresse = 0x023B.

1
uint16_t neue_Addresse = (0x02 << 8) | (Address_B >> 1);

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


Lesenswert?

Olli schrieb:
> malloc
Welche Zielplattform?
Weil du nur 16-Bit-Zeiger hast...
> neue_Addresse = 0x023B
...vermute ich einen (kleinen) uC.
Und auf dem einen malloc()?    :-o

von Stefan E. (sternst)


Lesenswert?

Lothar Miller schrieb:
> ...vermute ich einen (kleinen) uC.
> Und auf dem einen malloc()?    :-o

Du hast das irgendwie missverstanden.
Die ganze malloc-Geschichte ist nur ein extrem kruder Versuch, die neue 
Adresse zusammen zu basteln. ;-)

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


Lesenswert?

Stefan Ernst schrieb:
> Du hast das irgendwie missverstanden.
Ich wollte es gar nicht verstehen...

Aber wenn ich das eigentlich Problem so lese:
Olli schrieb:
> dann will ich diese Addresse erweitern, die soll dann auf eine neue
> Addresse in das low byte gesetzt werden und in das High byte soll z.B.
> 0x02 rein,  also sieht die variable dann so aus: neue_Addresse = 0x023B.
Dann wäre ich auf das gekommen:
uint16_t neue_Addresse = 0x0200 | (Address_B >> 1);

von Olli (Gast)


Lesenswert?

Danke für deine Hilfe.

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.