C- Frage!

Gast #12946
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)
Gast #12948
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.
Gast #12950
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()*******************/
Gast #12951
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
Gast #12952
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
Gast #12953
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
Gast #12954
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 ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren