www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Was bedeutet 1<<4 im Assembler Tutorial


Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag.

Gehe grad das Assembler Tutorial durch und im Bereich LCD kommen 
plötzlich neue "Teile"

Hier bei handelt es sich einmal um $42 ($Nummer), wo ich davon ausgehe 
dass das "$" mit "0x" gleich zu setzen ist.

Wo ich aber nichts zu gefunden habe, oder mit zusammen reimen konnte ist 
"1<<4". Was bedeutet dieses "<<"?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1<<4 heißt 1 left shift um 4. also 0b00010000

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss dazu das Register bereits mit 0x01 geladen sein, oder hat man auch 
bei 0x00 ein 0b00010000?

Wenn man ein 0x03 hat, hat man dann nach 1<<4 ein 0b00110000?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn man schreibt R0 = 1<<4 dann ist egal, was in R0 drin war. 1<<4 ist 
ja eine Konstante.

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ist die 1 sozusagen eine Hex und die 4 macht "sozusagen" 4mal rol.

Sprich um 0b00110000 zu erhalten würde man 3<<4 eingeben?

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du dir das mal näher angucken willst kannst du auch gut hier 
gucken:

http://www.mikrocontroller.net/articles/Bitmanipulation

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Also ist die 1 sozusagen eine Hex und die 4 macht "sozusagen" 4mal rol.

Nein vier 'shl'.

>Sprich um 0b00110000 zu erhalten würde man 3<<4 eingeben?

Ja.

MfG Spess

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Dierken schrieb:
> Muss dazu das Register bereits mit 0x01 geladen sein, oder hat man auch
> bei 0x00 ein 0b00010000?
>
> Wenn man ein 0x03 hat, hat man dann nach 1<<4 ein 0b00110000?

Nein, Du legst damit eine Konstasnte fest, in der Bit 4 gesetzt ist und 
alle anderen Bits gelöscht sind. Diese Konstante kannst Du
- zuweisen (ldi)
- verodern (ori, sbr)
- verunden (andi, cbr mit Komplement)

Die Schreibweise 1<<4 macht erst richtig Sinn, wenn man die Bitnamen 
benutzt, wie sie z.B. bei den I/O-Registern (Steuerungsregister der 
internen Peripheriemodule) verwendet werden, z.B.:

 ldi wl,(1<<refs1)|(1<<refs0)|(1<<adlar)
 sts admux,wl       ;ADC linksbündig mit interner Referenz auf ADC0

Weitere Infos erhältst Du in der Hilfe zum AVR-Studio unter 
AVR-Assembler, Direktiven.

...

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem Link sind wieder Befehle welche ich nciht verstehe/kenne:

TIMSK
TOIE1
UCSR0B
RXCIE0

Was bedeuten diese Werte/Befehle? Die Werde da nirgends 
definiert/erklärt ...

Wat .. ADC will ich glaube ich erst noch ein wenig warten bis ich weiter 
im Tutorial bin ^^...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch, im Datenblatt...

Das sind die Namen der I/O-Register.

...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Was bedeuten diese Werte/Befehle? Die Werde da nirgends
>definiert/erklärt ...

Datenblatt.

MfG Spess

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das sind keine Befehle, sondern Registernamen...->Datenblatt

Autor: Christian H. (chrikrocontroller)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1<<4 bedeutet ja, dass du die ->1<- binär um 4 nach links shiftest.
Würdest du 0<<4 schreiben, dann bekämst du immer noch 0 raus.
Du kannst dir folgendes (bezüglich positiver Ganzzahlen) merken.

binär  dezimal
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000    8
1001    9
1010   10
1011   11
1100   12
1101   13
1110   14
1111   15

Schau mal, was passiert, wenn du eine Zahl nimmst und shiftest.

Nehmen wir mal 1 und shiften sie um 1 nach links, dann kommen wir auf 
die 2. Warum?
Die 1 wird ja durch 0001 dargestellt, jetzt nehmen wir das und shiften 
um 1 nach links und kommen auf 0010 (es wird von rechts ja mit Nullen 
aufgefüllt). 0010 entspricht aber der 2. Wenn man dieses Spielchen 
weiterführt, so bekommt man heraus, dass man ganz unkompliziert damit 
das "Multiplizieren mit 2" lösen kann.

1<<3 == 0001<<3 == 0010<<2 == 2<<2
2<<2 == 0010<<2 == 0100<<1 == 4<<1
4<<1 == 0100<<1 == 1000<<0 == 8<<0

Also mit anderen Worten 1<<n == 2^n (also 2 hoch n)
Und allgemeiner x<<n == x * 2^n

Sei allerdings vorsichtig mit Dingen, die geschehen können.
Solches betrifft zum Beispiel zu großes Shiften. Wenn du von 4 Bit 
ausgehst, also xxxx zur Verfügung hast, dann darfst du nicht 1<<4 
schreiben, denn das wäre 0001->0010->0100->1000->0000. Also nicht das 
gewünschte Ergebnis. Auch musst du vorsichtig sein, wenn du eine Zahl im 
Zweierkomplement darstellst, hier kommt dem LSB nämlich eine besondere 
Bedeutung zu.
Das Rechts-Shiften kann man im weiteren nutzen um das Teilen durch zwei 
Effizient umzusetzen, allerdings ist hier noch mehr Vorsicht geboten, 
denn 3>>1 gibt 1 und nicht 1,5 zurück... Außerdem kommt hier bei der 
Darstellung im Zweikomplement hinzu, dass du zwischen logischem und 
arithmetischem Shiften unterscheiden musst. Das hast du beim Linksshift 
allerdings nicht.

LG

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jojo .. War eig. auch nur dazu da dass ich verstehe was da geschrieben 
ist in dem Code im Toturial.

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.