Forum: Mikrocontroller und Digitale Elektronik was bedeutet "1<<LED"


von assemblirer (Gast)


Lesenswert?

Hallo, ich wünsche allen ein schönes 2016.

Vorweg ein winziges Stück AVR-Assemblercode über das ich kürzlich 
gestolpert bin:

 .equ  led_port  =  PORTB
 .equ  led_ddr    =  DDRB
 .equ  LED      =  0

 ;************************************
 ;      Initialiesierung
 ;************************************

  ldi  temp1,  1<<LED
  out  led_ddr, temp1    ; Port B als Ausgang


Ok, das ist ja eigentlich ganz primitiv.


Mein Problem ist aber das "<<"!

Ist das ein Befehl, eine Assembler Direktive oder was? Und was tut es, 
wozu ist es gut?

Und was mich am meisten beschäftigt: Wo kommt es plötzlich her und warum 
wird es nirgendwo, in keinem Tutorial oder sonst wo erläutert???

Es scheint so als müsse man das "<<" ganz natürlich von Geburt an 
kennen... Und anscheinend weiss auch jeder worum es geht, nur ich nicht!

Habe vor vielen vielen Monden schon sporadisch Z80 und MC68000 in 
Assembler programmiert, da gabs das nicht. Danach irgendwann muß es 
geschehen sein, bei AVR taucht es immer wieder auf und niemand erläutert 
es!

Also: Warum schreibt man

ldi  temp1,  1<<LED

und nicht so wie früher ganz einfach

ldi  temp1, 0b00000001 oder
ldi  temp1, 0x01              ???

Und ist meine "Übersetzung" überhaupt richtig?

Vielen Dank für die Aufmerksamkeit, ich bin wirklich für jede Erklärung 
dankbar!

von STK500-Besitzer (Gast)


Lesenswert?

assemblirer schrieb:
> Also: Warum schreibt man
>
> ldi  temp1,  1<<LED
>
> und nicht so wie früher ganz einfach

Weil so der Quellcode leserlicher ist. Au-erdemist es einfacher, den 
LED-Pin einfach mal innerhalb dieses Ports zu verlagern.

>
> ldi  temp1, 0b00000001 oder
> ldi  temp1, 0x01              ???
>
> Und ist meine "Übersetzung" überhaupt richtig?

Ja, ist sie.

von assemblirer (Gast)


Lesenswert?

Ok, vielen Dank erstmal.

Es wird also tatsächlich nur eine 1 an der Binärstelle eingfügt, die in 
"LED" definiert ist?

Es würde also

 .equ  LED      =  3
.......
.......
  ldi  temp1,  1<<LED


ganz einfach einem

  ldi  temp1, 0b00001000

entsprechen?


Hört sich albern an, aber darf ich fragen woher ihr das alle wisst???

von STK500-Besitzer (Gast)


Lesenswert?

assemblirer schrieb:
> Hört sich albern an, aber darf ich fragen woher ihr das alle wisst???

C-Buch...

"LED" wird vom Präprozessor durch den zweiten Teil des Define ersetzt.
das "<<" ist ein Linksverschieben um die Anzahl der Bits.

C-Grundlagen

von hp-freund (Gast)


Lesenswert?


von HildeK (Gast)


Lesenswert?

assemblirer schrieb:
> Hört sich albern an, aber darf ich fragen woher ihr das alle wisst???

Die Programmiersprache gelernt (in C wird das vergleichbar verwendet), 
hier im Tutorial alle möglichen Beispiele angeschaut und anfangs sich 
die selben Fragen gestellt wie du - nur vielleicht mit etwas mehr 
Ausdauer selber nachgeforscht :-).

von H.Joachim S. (crazyhorse)


Lesenswert?

STK500-Besitzer schrieb:
> assemblirer schrieb:
>> Hört sich albern an, aber darf ich fragen woher ihr das alle wisst???
>
> C-Buch...
>
> "LED" wird vom Präprozessor durch den zweiten Teil des Define ersetzt.
> das "<<" ist ein Linksverschieben um die Anzahl der Bits.
>
> C-Grundlagen

Aber das ist doch gar kein C :-)

von STK500-Besitzer (Gast)


Lesenswert?

H.Joachim S. schrieb:
> Aber das ist doch gar kein C :-)

Mag sein. Bei mir zählt es zu dessen Grundlagen.

von Ulrich F. (Gast)


Lesenswert?

assemblirer schrieb:
> Und was mich am meisten beschäftigt: Wo kommt es plötzlich her und warum
> wird es nirgendwo, in keinem Tutorial oder sonst wo erläutert???
>
> Es scheint so als müsse man das "<<" ganz natürlich von Geburt an
> kennen... Und anscheinend weiss auch jeder worum es geht, nur ich nicht!

Also, als Arduino Jünger weiß ich, dass ich nicht alles weiß.
Und wenn ich was wissen will, dann schaue ich nach.

Und jetzt habe ich mal ausprobiert, wie schwierig es ist an die "<<" 
Doku ran zu kommen...

Ich nehme mal an, du verwendest den "gnu as" für AVRs.
Die Doku dazu zu finden, hat keine 5 Minuten gedauert.
https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops

Tipp:
Lies dir die Doku zu dem Werkzeug, welches du benutzt ruhig mal ganz 
durch. Da dürften sich noch viele weiteres nützliche Dinge finden.

von STK500-Besitzer (Gast)


Lesenswert?

H.Joachim S. schrieb:
> Aber das ist doch gar kein C :-)

Ich darf mir mal wieder an Kopp fassen - aus eigener Dämlichkeit.

von assemblirer (Gast)


Lesenswert?

Das wird es wohl sein, keine Peilung von "C"!
Ja, das ist echt schade, aber ich mag C nicht und da es bei mir nur um 
Hobby geht... Aber, da ist jetzt noch etwas:

Was ist wenn temp1 schon vorher Daten enthielt? Also als Beispiel, es 
kommt im Programm zunächst einmal ein:


 .equ  LED      =  3
.......
 ldi  temp1, 0b11000011

und später dann irgendwann

 ldi  temp1,  1<<LED

Befindet sich in temp1 jetzt 0b00001000 oder bleiben die alten Bits 
erhalten, so daß das Ergebnis 0b11001011 ist???

Oder ist alles noch komplizierter, weil:

STK500-Besitzer schrieb:
> das "<<" ist ein Linksverschieben um die Anzahl der Bits.

??? grübel,grübel...

Vielen Dank und entschuldigung wenn ich nerve... :-))

von Paul B. (paul_baumann)


Angehängte Dateien:

Lesenswert?

Ulrich F. schrieb:
> Die Doku dazu zu finden, hat keine 5 Minuten gedauert.
> https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops

Super. Die Leute werden sich bedanken!

MfG Paul

von Karl M. (Gast)


Lesenswert?

Hallo Paul,

Das ist doch dein Problem, bzw. eine Einstellung des Browsers !

Ich erhalte diese Meldung nicht.

von assemblirer (Gast)


Lesenswert?

Ulrich F. schrieb:

> Und jetzt habe ich mal ausprobiert, wie schwierig es ist an die "<<"
> Doku ran zu kommen...
>
> Ich nehme mal an, du verwendest den "gnu as" für AVRs.
> Die Doku dazu zu finden, hat keine 5 Minuten gedauert.
> https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops


Ich verwende AVR-Studio 4.xx.

Ja, Shift Left... Über das Linksschieben bin ich auch schon gestolpert, 
es ergibt für mich aber in diesem Zusammenhang überhaupt keinen Sinn.
Ich verstehe nicht wo da etwas geschoben wird, etwa die alten Bits die 
schon zuvor im Register standen???
Das gibt ja ein heilloses Durcheinander, dann bleib ich lieber beim

ldi  xxxxx, 0b11000011

da weiß ich was raus kommt - nämlich genau das was ich rein geschrieben 
habe... :-))

von spess53 (Gast)


Lesenswert?

HI

>Hört sich albern an, aber darf ich fragen woher ihr das alle wisst???

Hilfe zum Assembler. Stichwort Exprssions.

MfG Spess

von Ulrich F. (Gast)


Lesenswert?

assemblirer schrieb:
> Ich verstehe nicht wo da etwas geschoben wird, etwa die alten Bits die
> schon zuvor im Register standen???

Mannoo...
Ohne jede AS Ahnung, weiß ich doch genau was da passiert.

assemblirer schrieb:
> Das gibt ja ein heilloses Durcheinander,
Nur in deinem Kopf...
Und auch nur weil du das so willst.
Denn es würde sich klären lassen.

assemblirer schrieb:
> Ich verwende AVR-Studio 4.xx.
Das ist eine IDE, kein  Assembler.

von Paul B. (paul_baumann)


Lesenswert?

Karl M. schrieb:
> Das ist doch dein Problem, bzw. eine Einstellung des Browsers !
>
> Ich erhalte diese Meldung nicht.

Was Du nicht siehst, ist nicht da. Bist Du bei den Grünen oder was?

-Paul-

von hp-freund (Gast)


Lesenswert?

Gerade für solche und ähnliche Fragen ist der Debugger im AS doch die 
optimale Informationsquelle.

Führe die Befehle einfach aus und beobachte das Ergebnis.

von Karl M. (Gast)


Lesenswert?

Hallo Miteinander,

vielleicht hilft Dir diese Sprechweise zum Ausdruck:
1
ldi R16,(1<<3)

Lade R16 mit einem Wert: Bit 3 ist gesetzt.

Ein Byte B lässt sich wie folgt schreiben:
 B = 2⁷ + 2⁶ + 2⁵ + 2⁴ + 2³ + 2² + 2¹ + 2⁰

Jedes Byte hat als an seinen 8 Bit-Positionen verschiedene Wertigkeiten.
Es gilt:
Bit 0 = 2⁰
Bit 1 = 2¹
:
Bit 7 = 2⁷

Man sieht also leicht Bit n == 2^n

Und genau das macht der Ausdruck:
1
ldi R16,(1<<n)

von Ulrich F. (Gast)


Lesenswert?

Paul B. schrieb:
> Ulrich F. schrieb:
>> Die Doku dazu zu finden, hat keine 5 Minuten gedauert.
>> https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops
>
> Super. Die Leute werden sich bedanken!
>

Ich sehe da auch keine Meldung.

Und wen interessiert schon das SSL Zertifikat.
Bei einer Bank, oder überhaupt beim Geschäftsverkehr muss das schon ok 
sein.
Aber bei einer Doku.... ist das doch echt wurscht.

Es tut mir leid, das dich das stört.
Und wenn ich hätte gewusst, dass (bei dir) eine solche Meldung kommt, 
wäre der Link nicht von mir gekommen.

Jetzt hilfts ganze Gemäcker. und Geschrei, nicht mehr...
Kann den Beitrag nicht mehr editieren.

von tueduino (Gast)


Lesenswert?

@assemblierer schrieb:

>Hört sich albern an, aber darf ich fragen woher ihr das alle wisst???

Hmmm gugli? web? Wissensdrang?  :-)

http://www.avr-asm-tutorial.net/avr_de/beginner/diraus.html

Gruß!

von Michael U. (amiga)


Lesenswert?

Hallo,

wenn Du das 4er Studio benutzt einfach mal Help->AVR Tools User Guide-> 
Assembler oder/und Assembler2 anschauen.

Ist zwar etwas rumblättern darin, aber irgendwann findet man auch 
Operators.
Man hat das eigentlich alles zur Hand im Studio. Das erspart zwar Suchen 
im Forum oder bei Google nicht komplett wenn man mit englsch oder 
Spezialausdrücken Probleme hat, aber man hat die Anhaltspunkt, wonach 
man sucht.

Gruß aus Berlin
Michael

von assemblirer (Gast)


Lesenswert?

tueduino schrieb:
> Hmmm gugli? web? Wissensdrang?  :-)
>
> http://www.avr-asm-tutorial.net/avr_de/beginner/diraus.html
>
> Gruß!

Ja, vielen dank auch für diesen Link.

Ich glaube das habe ich schon alles durchgelesen, verstehe nur nicht was 
da geschoben wird??

Es gibt Assembler Befehle zum Schieben, beim AVR (und auch beim 68000..) 
wäre lsl so einer (Z80:sla...).
Das ist logisch, der Inhalt eines Registers wird verschoben. Dessen 
Inhalt ändert sich ja auch entsprechend...

Aber bei << ?? Da wird doch nichts geschoben, da wird einfach eine 
Konstante in ein Register geschrieben. Oder wie??

Tut mir leid, ich verstehe beim besten Willen nicht, was das mit 
schieben zu tun hat!

Trotzdem vielen Dank an alle, die es mit einer Erklärung versucht haben.


Achso, bitte jetzt nicht erklären daß "sla" beim Z80 etwas anderes macht 
wie "lsl" beim AVR, das weiß ich. Das einzige was ich nicht weiß, ist wo 
bei << ewas verschoben wird... :-))) Na ja, egal...

von Jojo S. (Gast)


Lesenswert?

Das << erzeugt keinen Befehlscode, das wird als Ausdruck ausgewertet und 
erzeugt eine Konstante die in dem Assemblerbefehl benutzt wird. Stell 
dir vor da stünde ein Pluszeichen, da würde ja auch kein Additionsbefehl 
erzeugt.

von hp-freund (Gast)


Lesenswert?

Hast Du den link von 11:33Uhr angesehen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

assemblirer schrieb:
> Das einzige was ich nicht weiß, ist wo bei << ewas verschoben wird...
Bei mir ist es andersrum: ich weiß zwar, dass dieses "sehr viel 
kleiner"-Zeichen den linken Operanden um die Zahl der Stellen des 
rechten Operanden nach links schiebt, aber ich weiß ganz viel anderes 
nicht.
> Na ja, egal...
Naja, wenn das so ist...

von Carl D. (jcw2)


Lesenswert?

LDI braucht als 2.Operand eine 8-Bit Zahl.
Diese kann man
- hinschreiben, nachdem man sie im Kopf errechnet hat, oder
- den Assembler rechnen lassen
Im 2.Fall hat man bei obigem Problem, Bitmaske aus Bitnummer errechnen, 
eigentlich 2 "hoch" Bitnummer zu rechnen, was binär eine Eins um 
"Bitnummer" Stellen nach links verschoben ist. Und diese 
Linksverschiebung macht der Assembler, der "Compiler", nicht die 
gleichnamige Programmiersprache, mit dem Operator "<<". Der stammt zwar 
aus der Bösen Sprache "C', aber zeigt auch bildhaft, was er zu tun 
gedenkt.
Wer Angst vorm Schieben hat, schreibt einfach:
1
  SBI  led_ddr, LED

von Ulrich F. (Gast)


Lesenswert?

Lothar M. schrieb:
> aber ich weiß ganz viel anderes
> nicht.
Ging mir auch mal so....
;-)

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.