mikrocontroller.net

Forum: Compiler & IDEs rol in GCC


Autor: tt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie kann ich den Assemblerbefehl rol in GCC ersetzen?

Danke

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <stdint.h>

uint8_t c;
c = (c << 1) | (c & 0x80);

uint10_t i;
i = (i << 1) | (i & 0x8000);

oder Inline-Assembler benutzen.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
s/uint10_t/uint16_t/ natürlich

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was schreibe ich denn für einen Mist ;-) Es ist zu heiss...

#include <stdint.h>

uint8_t c;
c = (c << 1) | ((c & 0x80) >> 7);

uint16_t i;
i = (i << 1) | ((i & 0x8000) >> 15);

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergiss es. Ich habe nicht an das Carrybit gedacht. Obiges ist falsch.

Autor: tt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ist heiß heute, und ich hab ne Baustelle vorm Fenster!!!

Carry ist nicht so wichtig, ... nur die bits die links rausfallen müssen 
rechts wider rein in mein Byte.

Noch Vorschläge ??

Ach ja, muss halt schnell gehen, ist in ner Interruptroutine.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan

>Was schreibe ich denn für einen Mist ;-) Es ist zu heiss...

Wohl wahr. In der Ruhe liegt die Kraft.

uint8_t c;
c = (c << 1) | ((c >> 7) & 1);

uint16_t i;
i = (i << 1) | ((i >> 15) & 1);

MfG
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ tt

>Noch Vorschläge ??
>Ach ja, muss halt schnell gehen, ist in ner Interruptroutine.

Wens ohne Assembler sein soll, dann vielleicht so

// unit8_t

if (a & 0x80)
  a = (a<<1) | 1;
else
  a = (a<<1);

// uint16_t

if (a & 0x8000)
  a = (a<<1) |1;
else
  a = (a<<1);

MfG
Falk


Autor: tt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk

Danke, so hatte ich es auch bisher gemacht, dachte es gibt vielleicht 
noch was eleganteres.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ tt

>Danke, so hatte ich es auch bisher gemacht, dachte es gibt vielleicht
>noch was eleganteres.

Hmm, ich wüsste im Moment nicht, wie man es eleganter und schneller 
macht. Der AVR hat keinen ROL ohne Carry.

MfG
Falk


Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hmm, ich wüsste im Moment nicht, wie man es eleganter und schneller
> macht. Der AVR hat keinen ROL ohne Carry.

Na dann schau mal LSL und LSR an.

LSL:

>Shifts all bits in Rd one place to the right. Bit 7 is cleared. Bit 0 is
>loaded into the C flag of the SREG. This operation effectively divides an
>unsigned value by two. The C flag can be used to round the result.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Simon Küppers

>> macht. Der AVR hat keinen ROL ohne Carry.

>Na dann schau mal LSL und LSR an.

LSL != ROL

MFG
Falk

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eben, denn LSL arbeitet ohne Carry. ROL mit.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Simon Küppers (simon)

>Eben, denn LSL arbeitet ohne Carry. ROL mit.

Sicher, aber wie ist dein Posing zu verstehen?
Was willst du damit sagen?

>>> Hmm, ich wüsste im Moment nicht, wie man es eleganter und schneller
>>> macht. Der AVR hat keinen ROL ohne Carry.

>>Na dann schau mal LSL und LSR an.

MfG
Falk

Autor: tt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich bin es dann nochmal.

Im moment mach ich das:

mst= (signal_out & 0x80);
if (mst) PORTB |=(1<<PB3);
else PORTB &= ~(1<<PB3);
signal_out= signal_out<<1;


geht das einfacher?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ tt

>Im moment mach ich das:

>mst= (signal_out & 0x80);
>if (mst) PORTB |=(1<<PB3);
>else PORTB &= ~(1<<PB3);
>signal_out= signal_out<<1;

Wo brauchst du dabei ein ROL? Du willst doch nur das MSB auf ein Portpin 
kopieren und die Daten um ein Bit weiterschieben. Sieht nach Soft-SPI 
aus.

>geht das einfacher?

Nein. Wozu auch?

MFG
Falk





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.