INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
rol und ror
25.11.2015, 18:05 (Dieser Beitrag wurde zuletzt bearbeitet: 25.11.2015 18:06 von Mathias.)
Beitrag #1
rol und ror
Beim Intel 8088er gibt es die beiden Assemblerbefehle ror und rol um Bits zu rotieren.
Beim Arduino C kenne ich nur >> und << für das Bit Shiften, beim 8088er wäre das shl und shr.

Gibt es für den Arduino auch einen rotier Befehl ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.11.2015, 18:26 (Dieser Beitrag wurde zuletzt bearbeitet: 25.11.2015 18:31 von ardu_arne.)
Beitrag #2
RE: rol und ror
Hallo Mathias,
wenn man sich in der Arduino IDE auf die Assemblerebene (Inlineassembler) hinab begibt, gibt es das auch für den Arduino.

Mehr davon

Gruß
Arne

... und noch ein kleiner Nachtrag.

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.11.2015, 19:14 (Dieser Beitrag wurde zuletzt bearbeitet: 25.11.2015 19:26 von HaWe.)
Beitrag #3
RE: rol und ror
in C gibt es solche Befehle nicht. Du musst sie dir also selber programmieren:

rol:
HighestBit zwischenspeichern, dann shl, dann niedrigstes Bit mit HighestBit überschreiben.

ror:
LowestBit zwischenspeichern, dann shr, dann höchstes Bit mit LowestBit überschreiben.

Den Code kriegst du selber hin? Wink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.11.2015, 20:25
Beitrag #4
RE: rol und ror
Zitat:Den Code kriegst du selber hin?
Code:
wert = (wert << 1) | (wert >> 7);  // rot l
wert = (wert >> 1) | (wert << 7);   // rot r

Ich habe noch mit dem Inlineassembler probiert.

Code:
byte wert = 0b0000001;

void loop() {
  asm("lds r24, (wert) \n\t"
      "rol r24 \n\t"
      "sts (wert), r24 \n\t");

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, wert);
  digitalWrite(latchPin, HIGH);

  Serial.println(wert);

  delay(10);
}

Leider macht das rol das gleiche wie <<.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.11.2015, 21:52 (Dieser Beitrag wurde zuletzt bearbeitet: 26.11.2015 00:02 von ardu_arne.)
Beitrag #5
RE: rol und ror
Hi,

Code:
uint8_t  wert08 = 0b00000001;
uint16_t wert16 = 0b0000000000000001;
Code:
// 8 Bit rechts rotieren
wert08 = ((wert08 & 0x01)?0x80:0x00) | (wert08 >> 1);

// 8 Bit links rotieren
wert08 = ((wert08 & 0x80)?0x01:0x00) | (wert08 << 1);


// 16 Bit rechts rotieren
wert16 = ((wert16 & 0x01)?0x8000:0x00) | (wert16 >> 1);

// 16 Bit links rotieren
wert16 = ((wert16 & 0x8000)?0x01:0x00) | (wert16 << 1);

so läuft das, auch ohne Assembler. Smile

Gruß
Arne

p.s. "rol" und "ror" macht wirklich nicht das was man erwartet wenn man 8080, 8088 oder Z80 Assembler kennt. Sad

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.11.2015, 17:38
Beitrag #6
RE: rol und ror
Ich weis nicht, was r0 ist, aber dieser Code läuft.
Code:
byte wert = 0b0000001;

void loop() {
  asm("lds r24, (wert) \n\t"
      "mov r0, r24 \n\t"
      "lsl r0 \n\t"
      "rol r24 \n\t"
      "sts (wert), r24 \n\t"
      );

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, wert);
  digitalWrite(latchPin, HIGH);

  delay(100);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste