www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C- Frage!


Autor: R. Kager (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Alex1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich kenne keinen Befehl.
Geht wohl nur ueber eine Schleife.
Alex1

Autor: Ingo B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rainer (Gast)
Datum:

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

Autor: R. Kager (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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()*******************/

Autor: Rudolf Sosnowsky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R. Kager (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rudolf Sosnowsky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R. Kager (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.