Forum: Mikrocontroller und Digitale Elektronik C- Frage!


von R. Kager (Gast)


Lesenswert?

Ich hab ein Datenwort(4Bits) bei dem die Reihenfolge nicht stimmt, wie 
kann ich in C am einfachsten( 1 Befehl??) die Reihenfolge ändern:

ursprüngliche --> neue
Reihenfolge   --> Reihenfolge

0 Bit (LSB)   --> 3 Bit (MSB)
1 Bit         --> 2 Bit
2 Bit         --> 1 Bit
3 Bit (MSB)   --> 0 Bit (LSB)

von Alex1 (Gast)


Lesenswert?

Hallo,
ich kenne keinen Befehl.
Geht wohl nur ueber eine Schleife.
Alex1

von Ingo B. (Gast)


Lesenswert?

Hi,

ich hatte mal ein ähnliches Problem (nur mit 8Bit). Ich hatte auch 
gedacht, dass man dies irgendwie elegant lösen könnte, aber leider muss 
man es wirklich per Hand machen :-(

Bis dann,
Ingo.

von Rainer (Gast)


Lesenswert?

Speichersparend kannst es über eine Schleife machen, schneller ist ein 
Lookup-Table.

von R. Kager (Gast)


Lesenswert?

Hab das jetzt so gelöst, weiß wer was besseres??
PDR8=Datenregister, man kann nur auf das gesamte Register zugreifen
/**********DIP Schalter einlesen********************/
/*    Code0=Port 8 Bit 4
    Code1=Port 8 Bit 3
    Code2=Port 1 Bit 2
    Code3=Port 1 Bit 1
*/
short dip_read()
{
  byte buffer,dip;
  dip=0x00;
  buffer=(((~PDR8)&0x10)>>4); //Code0 auf Pos3 schieben
  dip = dip|buffer;
  buffer=(((~PDR8)&0x08)>>2); //Code1 auf Pos2 schieben
  dip = dip|buffer;
  buffer=((~PDR1)&0x04);  //Code2 auf Pos1 schieben
  dip = dip|buffer;
  buffer=(((~PDR1)&0x02)<<2);//Code3 auf Pos0 schieben
  dip = dip|buffer;
  return (dip+0x11);
}
/***************End of dip_read()*******************/

von Rudolf Sosnowsky (Gast)


Lesenswert?

Wie wäre es damit? Geht schneller als Schieben, und liest nur einmal.

short dip_read()
 {
 byte buffer,dip;
  dip=0x00;
  buffer=(~PDR);
  if (buffer&0x08) dip |=0x01;
  if (buffer&0x04) dip |=0x02;
  if (buffer&0x02) dip |=0x04;
  if (buffer&0x01) dip |=0x08;
  return (dip+0x11); // warum?
 }

Gruß, Rudolf.

Rudolf Sosnowsky +++ LC Design
EPSON Technology Partner
Internet http://www.LC-Design.de

von R. Kager (Gast)


Lesenswert?

gute idee, muss es nur etwas anders machen weil ich eben 2 Daten 
Register hab PDR8 und PDR1, aber grundsätzlich net schlecht, das 
return(dip+0x11) hab ich nur weil der dipschalter net von 0-10 
"ausgeben" soll sondern halt von 11 -21

von Rudolf Sosnowsky (Gast)


Lesenswert?

Das Zusammenstückeln von Bits von verschiedenen Ports funktioniert bei 
mir so:

  type = 0;
  type = PIND & 0x0C;            /* upper 2 bits */
  type |= ((PINC & 0x30) >> 4);  /* lower 2 bits */
  type ^= 0x0f;                  /* flip bits */

Gruß, Rudolf.

Rudolf Sosnowsky +++ LC Design
EPSON Technology Partner
Internet http://www.LC-Design.de

von R. Kager (Gast)


Lesenswert?

dank dir: hab das jetzt endgültig so gelöst:

byte dip;
  dip=0x00;
  if ((~PDR8)&0x10) dip |=0x01;
  if ((~PDR8)&0x08) dip |=0x02;
  if ((~PDR1)&0x04) dip |=0x04;
  if ((~PDR1)&0x02) dip |=0x08;
  return (dip+0x11);
schaut net so schlecht aus oder ;-)

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.